Вероятность не нарисовать слово из пакета букв в скрэббл


27

Предположим, у вас была сумка с плитками, на каждой из которых была буква. Есть тайлы с буквой 'A', с 'B' и т. Д., И плитки с «подстановочными знаками» (у нас есть ). Предположим, у вас был словарь с конечным числом слов. Вы выбираете плиток из сумки без замены. Как бы вы вычислили (или оценили) вероятность того, что вы сможете сформировать ноль слов из словаря с учетом выбранных плиток?nnAnBnn=nA+nB++nZ+nkk

Для тех, кто не знаком с Scrabble (TM), подстановочный знак может использоваться, чтобы соответствовать любой букве. Таким образом, слово [ BOOT ] может быть «написано» с плитками «B», «*», «O», «T».

Чтобы дать некоторое представление о масштабе проблемы, является небольшим, например 7, составляет около 100, а словарь содержит около 100 000 слов размером или меньше.knk

редактировать: под словом «сформировать слово» я подразумеваю слово длиной не более . Таким образом, если слово [ A ] находится в словаре, то, вытянув хотя бы одну букву «A» из сумки, можно «сформировать слово». Проблема подстановочных знаков радикально упрощается, если предположить, что в словаре есть слова длиной 1. Ибо, если есть, любой подстановочный знак автоматически может соответствовать слову длины 1, и, таким образом, можно сконцентрироваться на случае, когда нет подстановочных знаков. Таким образом, в более скользкой форме задачи нет слов из 1 буквы в словаре.k

Также я должен прямо заявить, что порядок, в котором буквы извлекаются из сумки, не имеет значения. Не нужно рисовать буквы в «правильном» порядке слова.


Разве это не должно быть «выбрать k плиток без замены»? Очень интересный вопрос

упс. так и должно быть.
Шаббычеф

Насколько я помню, Scrabble не допускает однобуквенных слов, поэтому хотя бы эта часть проблемы решена;)
nico

1
@ Ничего хорошего, но я думаю, что это только в середине игры. Слова с 1 буквой либо не требуют, чтобы кто-то играл букву, либо позволили бы разместить одну букву в любом месте на доске, что явно недопустимо. Тем не менее, я думал об открытии. На самом деле, для тех, кто знаком с Scrabble, этот вопрос можно кратко сформулировать так: «Какова вероятность, что первый игрок должен будет пройти?».
Шаббычеф

@nico Спасибо за это разъяснение. Теоретически аналогичная проблема имеет место в словарях, содержащих все возможные двухбуквенные комбинации в виде слов: в этом случае любая рука из 2 или более букв автоматически содержит слово. Комментарий @ shabbychef о середине игры показывает, насколько неуместен исходный вопрос для большей части Scrabble, потому что в середине игры у вас есть доступ к множеству частей слов (префиксов, суффиксов и даже средних разделов) в дополнение к 7 буквам в вашем рука. Это значительно увеличивает шансы сделать слово.
whuber

Ответы:


14

Это (длинный!) Комментарий к хорошей работе, которую @vqv опубликовал в этой теме. Он направлен на получение окончательного ответа. Он проделал тяжелую работу по упрощению словаря. Все, что остается, - это использовать его в полной мере. Его результаты предполагают, что решение грубой силы возможно . В конце концов, включая подстановочный знак, существует не более слов, которые можно произнести с помощью 7 символов, и похоже, что менее 1/10000 из них, скажем, около миллиона, не в состоянии включить какое-либо действительное слово. 277=10,460,353,203

Первым шагом является добавление минимального словаря подстановочным знаком «?». 22 буквы появляются в двухбуквенных словах (все, кроме c, q, v, z). Присоедините подстановочный знак к этим 22 буквам и добавьте их в словарь: {a ?, b ?, d ?, ..., y?} Теперь в. Аналогично мы можем проверить минимальные трехбуквенные слова, вызывая некоторые дополнительные слова появляться в словаре. Наконец, мы добавляем "??" в словарь. После удаления повторений, которые в результате, он содержит 342 минимальных слова.

Элегантный способ продолжить - тот, который действительно использует очень небольшое количество кодирования - это рассматривать эту проблему как алгебраическую . Слово, рассматриваемое как неупорядоченный набор букв, является просто мономом. Например, "spats" - это моном . Таким образом, словарь представляет собой набор мономов. Это выглядит какaps2t

{a2,ab,ad,...,oZψ,весИксψ,ψ2}

(где, чтобы избежать путаницы, я написал для символа подстановки).ψ

Стойка содержит правильное слово, если и только если это слово разделяет стойку.

Более абстрактный, но чрезвычайно мощный способ сказать, что словарь генерирует идеал в кольце многочленов R = Z [ a , b , , z , ψ ] и что стойки с действительными словами становятся равными нулю в частном. ring R / I , тогда как стойки без допустимых слов остаются ненулевыми в частном. Если мы сформируем сумму всех стоек в R и вычислим ее в этом фактор-кольце, точисло стоек без слов будет равным количеству различных мономов в фактор-группе.ярзнак равноZ[a,б,...,Z,ψ]р/яр

Кроме того, сумма всех стоек в легко выразить. Пусть α = a + b + + z + ψ - сумма всех букв в алфавите. α 7 содержит один моном для каждой стойки. (В качестве дополнительного бонуса его коэффициенты подсчитывают количество способов, которыми может быть сформирована каждая стойка, что позволяет нам вычислять ее вероятность, если мы захотим.)рαзнак равноa+б++Z+ψα7

В качестве простого примера (чтобы увидеть, как это работает), предположим, что (а) мы не используем подстановочные знаки и (б) все буквы от «а» до «х» считаются словами. Тогда единственно возможные стойки, из которых не могут быть образованы слова, должны состоять целиком из y и z. Вычисляем по модулю идеала, порожденного { a , b , c , , x }, по одному шагу за раз, таким образом:α=(a+b+c++x+y+z)7{a,b,c,,x}

α0=1α1=a+b+c++x+y+zy+zmodIα2(y+z)(a+b++y+z)(y+z)2modIα7(y+z)6(a+b++y+z)(y+z)7modI.

Мы можем зачитать шанс получить не состоящую из слов стойку из окончательного ответа: : каждый коэффициент подсчитывает, каким образом можно нарисовать соответствующую стойку. Например, есть 21 (из 26 ^ 7 возможных) способов нарисовать 2 y и 5 z, потому что коэффициент yy7+7y6z+21y5z2+35y4z3+35y3z4+21y2z5+7yz6+z7 равняется 21.y2z5

Из элементарных расчетов очевидно, что это правильный ответ. Все дело в том, что эта процедура работает независимо от содержания словаря.

Обратите внимание, как уменьшение мощности по модулю идеала на каждом этапе сокращает вычисления: это сокращение, выявленное этим подходом. (Конец примера.)

Системы полиномиальной алгебры реализуют эти вычисления . Например, вот код Mathematica :

alphabet =  a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + 
            p + q + r + s + t + u + v + w + x + y + z + \[Psi];
dictionary = {a^2, a b, a d, a e, ..., w z \[Psi], \[Psi]^2};
next[pp_] := PolynomialMod[pp alphabet, dictionary];
nonwords = Nest[next, 1, 7];
Length[nonwords]

(Словарь может быть построен простым способом из min.dict @vqv; я поставил здесь строку, показывающую, что он достаточно короткий, чтобы его можно было указать напрямую, если хотите.)

Вывод - который занимает десять минут вычислений - 577958. ( NB. В более ранней версии этого сообщения я допустил небольшую ошибку при подготовке словаря и получил 577940. Я отредактировал текст, чтобы отразить то, что, я надеюсь, сейчас правильные результаты!) Чуть меньше миллиона или около того я ожидал, но того же порядка.

Чтобы рассчитать вероятность получения такой стойки, нам необходимо учесть количество способов, которыми эта стойка может быть вытянута. Как мы видели в примере, это равно его коэффициенту в . Возможность рисования некоторого такой стеллажа является суммой всех этих коэффициентов, легко найти, установив все буквы равно 1:α7

nonwords /. (# -> 1) & /@ (List @@ alphabet)

Ответ равняется 1066056120, что дает 10,19% вероятности составить стойку, из которой невозможно составить правильное слово (если все буквы одинаково вероятны).

Когда вероятности букв меняются, просто замените каждую букву ее шансом быть нарисованным:

tiles = {9, 2, 2, 4, 12, 2, 3, 2, 9, 1, 1, 4, 2, 6, 8, 2, 1, 6, 4, 6, 
         4, 2, 2, 1, 2, 1, 2};
chances = tiles / (Plus @@ tiles);
nonwords /. (Transpose[{List @@ alphabet, chances}] /. {a_, b_} -> a -> b)

Выход составляет 1.079877553303%, точный ответ (хотя и с использованием приблизительной модели, чертеж с заменой). Оглядываясь назад, потребовалось четыре строки для ввода данных (частоты алфавита, словаря и алфавита) и всего три строки для выполнения работы: опишите, как получить следующую степень по модулю I , взять 7-ю степень рекурсивно и подставить вероятности для букв.αI


+1 Приспособление лексикона и затем минимизация его - умная идея. Алгебра вне меня, но кажется, что вы рассчитываете полиномиальную вероятность, а не гипергеометрическую. Таким образом, вероятность для отбора проб с заменой. Я думаю, это объясняет, почему ваш ответ 1,08% намного больше, чем моя оценка 0,4%. Есть ли способ изменить ваш подход для обработки выборки без замены?
vqv

2
@vqv Да. Теперь, когда у нас есть список из полумиллиона стоек без слов, можно легко (путем изменения двух последних строк кода) рассчитать шанс каждой стойки (без замены) и получить гипергеометрический результат. Точный ответ равен 349870667877/80678106432000 = 0,43366% . При N = 100K испытаний ваш SE составляет 0,021%, поэтому ваш ответ должен был быть между 0,38% и 0,49% (двусторонний 99% ДИ). Я так рад, что наши ответы согласны!
whuber

@whuber Не могли бы вы выполнить расчет, используя раздачу плиток «Слова с друзьями» (WWF)? Моя оценка в 0,4% основана на лексике WWF и распределении плиток WWF. Я думаю, что вы используете дистрибутив плитки Scrabble вместе с лексиконом WWF.
VQV

К сожалению. Точный ответ на самом деле 349870675899 (я был 8022 выключен из-за ошибки в моем словаре.) К счастью, это не имеет никакого практического значения.
uuber

@vqv Я не знаком с различными дистрибутивами плиток. Я скопировал свой прямо из вашего кода (и я использовал ваш словарь) :-). Если вы имеете в виду распределение на osxreality.com/2010/01/01/… , то я получаю 1,15444% (с заменой), 0,43366% (без замены). Второе число на самом деле отличается от частот скрэббла на 8-й значимой цифре.
uuber

14

Очень сложно нарисовать стойку, в которой нет ни одного допустимого слова в Scrabble и его вариантах. Ниже приведена R-программа, которую я написал для оценки вероятности того, что начальная стойка из 7 ячеек не содержит правильного слова. Он использует подход Монте-Карло и лексикон « Слова с друзьями» (я не смог найти официальный лексикон «Эрудит» в простом формате). Каждое испытание состоит из рисования стойки из 7 плиток, а затем проверки, содержит ли стойка правильное слово.

Минимальные слова

Вам не нужно сканировать весь лексикон, чтобы проверить, содержит ли стойка правильное слово. Вам просто нужно отсканировать минимальную лексику, состоящую из минимальных слов. Слово является минимальным, если оно не содержит другого слова в качестве подмножества. Например, «em» - минимальное слово; «пусто» нет. Дело в том, что если в стойке есть слово x, то оно также должно содержать любое подмножество x . Другими словами: стойка не содержит слов, если она не содержит минимальных слов. К счастью, большинство слов в лексиконе не являются минимальными, поэтому их можно исключить. Вы также можете объединить эквивалентные слова перестановки. Мне удалось сократить словарный запас «Слова с друзьями» со 172 820 до 201 минимальных слов.

Подстановочные знаки могут быть легко обработаны, рассматривая стойки и слова как распределения по буквам. Мы проверяем, содержит ли стойка слово, вычитая одно распределение из другого. Это дает нам номер каждой буквы, отсутствующей в стойке. Если сумма этих чисел равна числу подстановочных знаков, тогда слово находится в стойке.

Единственная проблема с подходом Монте-Карло состоит в том, что интересующее нас событие встречается очень редко. Поэтому для получения оценки с достаточно малой стандартной ошибкой требуется много-много испытаний. Я запустил свою программу (вставил внизу) с испытаний и получилирасчетную вероятность 0,004что начальная стойка не содержит действительное слово. Расчетная стандартная ошибка этой оценки составляет 0,0002. Потребовалось всего пара минут, чтобы запустить мой Mac Pro, включая загрузку лексикона.N=100,000

Мне было бы интересно узнать, может ли кто-нибудь придумать эффективный точный алгоритм. Наивный подход, основанный на включении-исключении, кажется, что он может включать комбинаторный взрыв.

Включение-исключение

Я думаю, что это плохое решение, но в любом случае это неполный набросок. В принципе, вы можете написать программу для расчета, но спецификация будет извилистой.

Вероятность, которую мы хотим вычислить, равна Событие внутри вероятности на правой стороне представляет собой объединение событий: Р ( к -tile стойки содержит слово ) = P ( х М { K -tile стойки содержит  е } ) , где

P(k-tile rack does not contain a word)=1P(k-tile rack contains a word).
P(k-tile rack contains a word)=P(xM{k-tile rack contains x}),
Mэто минимальный лексикон. Мы можем расширить его, используя формулу включения-исключения. Это предполагает рассмотрение всех возможных пересечений событий выше. Пусть обозначим множество мощности М , то есть множество всех возможных подмножеств М . затем P(M)MM
P(k-tile rack contains a word)=P(xM{k-tile rack contains x})=j=1|M|(1)j1SP(M):|S|=jP(xS{k-tile rack contains x})


xS{k-tile rack contains x}
S . Это боль, чтобы иметь дело с подстановочными знаками. По условию мы должны рассмотреть каждый из следующих случаев: стойка не содержит подстановочных знаков, стойка содержит 1 подстановочный знак, стойка содержит 2 подстановочных знака, ...

затем

P(xS{k-tile rack contains x})=w=0nP(xS{k-tile rack contains x}|k-tile rack contains w wildcards)×P(k-tile rack contains w wildcards).

2|M|2|M|3.2×1060 .

Сканирование всех возможных стоек

Я думаю, что это в вычислительном отношении проще, потому что меньше возможных стоек, чем возможных подмножеств минимальных слов. Мы последовательно сокращаем множество возможныхkСтойки до тех пор, пока мы не получим набор стоек, которые не содержат слов Для Scrabble (или «Слова с друзьями») количество возможных стоек с семью тайлами составляет десятки миллиардов. Подсчет количества тех, которые не содержат возможного слова, должен быть выполним с помощью нескольких десятков строк кода R. Но я думаю, что вы должны быть в состоянии сделать лучше, чем просто перечислить все возможные стойки. Например, «аа» является минимальным словом. Это немедленно устраняет все стойки, содержащие более одного «а». Вы можете повторить с другими словами. Память не должна быть проблемой для современных компьютеров. Для стеллажа Scrabble с 7 ячейками требуется менее 7 байт. В худшем случае мы использовали бы несколько гигабайт для хранения всех возможных стоек, но я тоже не думаю, что это хорошая идея. Кто-то может захотеть больше думать об этом.

Программа Монте-Карло R

# 
#  scrabble.R
#  
#  Created by Vincent Vu on 2011-01-07.
#  Copyright 2011 Vincent Vu. All rights reserved.
# 

# The Words With Friends lexicon
# http://code.google.com/p/dotnetperls-controls/downloads/detail?name=enable1.txt&can=2&q=
url <- 'http://dotnetperls-controls.googlecode.com/files/enable1.txt'
lexicon <- scan(url, what=character())

# Words With Friends
letters <- c(unlist(strsplit('abcdefghijklmnopqrstuvwxyz', NULL)), '?')
tiles <- c(9, 2, 2, 5, 13, 2, 3, 4, 8, 1, 1, 4, 2, 5, 8, 2, 1, 6, 5, 7, 4, 
           2, 2, 1, 2, 1, 2)
names(tiles) <- letters

# Scrabble
# tiles <- c(9, 2, 2, 4, 12, 2, 3, 2, 9, 1, 1, 4, 2, 6, 8, 2, 1, 6, 4, 6, 4, 
#            2, 2, 1, 2, 1, 2)


# Reduce to permutation equivalent words
sort.letters.in.words <- function(x) {
  sapply(lapply(strsplit(x, NULL), sort), paste, collapse='')
}

min.dict <- unique(sort.letters.in.words(lexicon))
min.dict.length <- nchar(min.dict)

# Find all minimal words of length k by elimination
# This is held constant across iterations:
#   All words in min.dict contain no other words of length k or smaller
k <- 1
while(k < max(min.dict.length))
{
  # List all k-letter words in min.dict
  k.letter.words <- min.dict[min.dict.length == k]

  # Find words in min.dict of length > k that contain a k-letter word
  for(w in k.letter.words)
  {
    # Create a regexp pattern
    makepattern <- function(x) {
      paste('.*', paste(unlist(strsplit(x, NULL)), '.*', sep='', collapse=''), 
            sep='')
    }
    p <- paste('.*', 
               paste(unlist(strsplit(w, NULL)), 
                     '.*', sep='', collapse=''), 
               sep='')

    # Eliminate words of length > k that are not minimal
    eliminate <- grepl(p, min.dict) & min.dict.length > k
    min.dict <- min.dict[!eliminate]
    min.dict.length <- min.dict.length[!eliminate]
  }
  k <- k + 1
}

# Converts a word into a letter distribution
letter.dist <- function(w, l=letters) {
  d <- lapply(strsplit(w, NULL), factor, levels=l)
  names(d) <- w
  d <- lapply(d, table)
  return(d)
}

# Sample N racks of k tiles
N <- 1e5
k <- 7
rack <- replicate(N,
                  paste(sample(names(tiles), size=k, prob=tiles), 
                        collapse=''))

contains.word <- function(rack.dist, lex.dist)
{
  # For each word in the lexicon, subtract the rack distribution from the 
  # letter distribution of the word.  Positive results correspond to the 
  # number of each letter that the rack is missing.
  y <- sweep(lex.dist, 1, rack.dist)

  # If the total number of missing letters is smaller than the number of 
  # wildcards in the rack, then the rack contains that word
  any(colSums(pmax(y,0)) <= rack.dist[names(rack.dist) == '?'])
}

# Convert rack and min.dict into letter distributions
min.dict.dist <- letter.dist(min.dict)
min.dict.dist <- do.call(cbind, min.dict.dist)
rack.dist <- letter.dist(rack, l=letters)

# Determine if each rack contains a valid word
x <- sapply(rack.dist, contains.word, lex.dist=min.dict.dist)

message("Estimate (and SE) of probability of no words based on ", 
        N, " trials:")
message(signif(1-mean(x)), " (", signif(sd(x) / sqrt(N)), ")")

Вау ... очень хорошее продолжение.
Мэтт Паркер

Я несколько удивлен, что оно сократилось до 201 слова. Хотя для первого сыгранного слова наши домашние правила принимают слова «Я» и «А», что, вероятно, еще больше уменьшит количество минимальных слов. Я надеялся увидеть, как кто-то
провалит

@shabbychef В лексиконе нет однобуквенных слов. Самые минимальные слова - это двух- и трехбуквенные слова. Вот полное распределение минимальных длин слов: 2: 73, 3:86, 4:31, 5: 9, 6: 2. 6-буквенные слова: ГЛИЦИЛ и СИЗИГИЯ.
vqv

@shabbychef Я обновил свой ответ, чтобы включить набросок точного подхода включения-исключения. Это хуже, чем волосатые.
vqv

отличная работа! Мне нравится, что этот вопрос, который можно сформулировать как одно предложение (для тех, кто имеет достаточный фон), выявил Монте-Карло, включение-исключение, DAG, деревья поиска, полиномиальную алгебру, и что ваше моделирование подтверждается теоретической формой @ whuber. ура!
Шаббычеф

7

1k

Вторая причина в том, что MC действительно выполним: вы просто должны сделать это правильно. Предыдущий абзац дает подсказку: не просто генерировать слова наугад, а искать их; вместо этого сначала проанализируйте словарь и воспользуйтесь его структурой.

k!1 .

kзатем найдите это отсортированное «слово» в дереве, построенном из отсортированных представителей слов в исходном словаре. Это будет на самом деле меньше, чем исходное дерево, потому что оно объединяет все наборы слов, которые эквивалентны сортировке, такие как {stop, post, pots, opts, spot}. Фактически, в английском словаре этот класс слов никогда не будет достигнут, так как «так» будет найдено первым. Давайте посмотрим это в действии. Сортированный мультимножество "opst"; «o» будет переходить на все слова, содержащие только буквы {o, p, ..., z}, «p» будет переходить на все слова, содержащие только {o, p, ..., z} и самое большее одно «о», и, наконец, «с» ответвляется к листу «так»! (Я предположил, что ни один из вероятных кандидатов "о", "оп", "

Для работы с подстановочными знаками необходима модификация: я позволю типам программистов из вас подумать об этом. Это не увеличит размер словаря (на самом деле это должно уменьшить его); это немного замедлит обход дерева, но не изменяет его фундаментальным образом. В любом словаре, содержащем однобуквенное слово, например в английском («a», «i»), сложностей нет: наличие подстановочного знака означает, что вы можете сформировать слово! (Это намекает на то, что оригинальный вопрос может быть не таким интересным, как кажется.)

kkO(klog(k))O(k)

Могу поспорить, что вы могли бы провести это исследование с реальным набором скрэббл и миллионом итераций за считанные секунды.


@whuber Дерево - изящная идея (upvote для этой идеи), но не потребует ли она много памяти? Я думаю, это зависит от того, насколько разнообразен словарь, но я предполагаю, что достаточно разнообразный словарь потребует много деревьев. Например, дерево «b» будет начинаться с буквы «b» вместо «a» для всех тех слов, которые не есть «а» в них. Точно так же дерево «c» будет начинаться с буквы «c» для тех слов, которые не имеют «a» и «b», но имеют «c». Мой предложенный прямой подход кажется более простым, поскольку требует одноразового обхода всех слов в словаре, не так ли?

1
@Srikant: Дерево, вероятно, потребует гораздо меньше оперативной памяти, чем для начала кэширования всего словаря. В любом случае, вы действительно беспокоитесь о нескольких мегабайтах оперативной памяти? Кстати, есть только одно дерево, а не много: все они укоренены в пустом слове. Ваш подход, как я понял, требует многократного поиска в словаре (до 7!) На каждой итерации , что делает его неосуществимым, как опасается @shabbychef. Было бы полезно, если бы вы могли уточнить алгоритм, который вы имеете в виду, когда пишете «посмотрите, сможете ли вы составить слово»: в нем скрыты многие важные детали!
whuber

@whuber: я осознал тот факт, что есть только одно дерево после того, как я разместил свой комментарий. Reg мой подход - я согласен, что мое предложение Монте-Карло является нечетким, и ваш ответ раскрывает, как можно реально реализовать Монте-Карло в этой обстановке. Я на самом деле имел в виду, что прямой подход (см. Мой ответ) на самом деле может быть проще, так как этот подход требует одноразовой операции со словарем в отличие от Монте-Карло, которая требует нескольких тысяч итераций в дереве. Просто интересно относительно относительных достоинств подходов.

@Srikant Я воздержался от комментариев по поводу вашего прямого подхода, потому что я подозреваю, что он получает неправильные ответы. По-видимому, он не учитывает структуру словаря: то есть подмножества отношений между словами. Например, получит ли ваша формула правильный ответ ноль для всех словарей, которые содержат все возможные однобуквенные слова?
whuber

@ Whuber Хммм хорошо. Возможно, я отвечаю не на тот вопрос!

2

Подход Монте-Карло

kmkmw

1mwm

Прямой подход

S, ПозволятьTs быть число способов, которыми мы можем сформировать sгослово. Пусть количество букв, необходимых дляsго слово обозначается мa,мб,,,,,мZ (т.е. sго Слово нуждается мaколичество букв «а» и т. д.). Обозначим количество слов, которое мы можем сформировать из всех плиток:N,

Nзнак равно(NК)

а также

ts=(nama)(nbmb)...(nzmz)

(Including the impact of wildcard tiles is a bit trickier. I will defer that issue for now.)

Thus, the desired probability is:

1stsN

The quick and dirty approach may not be so quick! The dictionary may contain 100,000 words, and the search for a match of the given tiles could be a coding disaster.
shabbychef

@shabbychef This is something well done to suit spell checkers. See for instance n3labs.com/pdf/lexicon-squeeze.pdf

@shabbychef Reg monte-carlo- if the dictionary is sorted a match should be fairly quick no? In any case, the direct approach that I outlined earlier was flawed. I fixed it. The problem in my earlier solution was that the same word can be formed multiple ways (e.g., 'bat', 'b*t' etc).

1
@shabbychef On further reflection, I agree with you that the monte carlo approach will not work. One issue is that you need to figure out which words you can actually form with the k tiles and the second one is that you can form multiple words with the k tiles. Calculating these combinations from k tiles is probably not that easy.

1
@Srikant Thanks. Your formula seems to assume you have to use all k letters to form the word, but I don't think that's what the OP is asking. (That's not how Scrabble is played, anyway.) With that implicit assumption, you're on the right track but you need to modify the algorithm: you mustn't repeat the calculation for words in the dictionary that are permutations of each other. For example, you mustn't subtract both t_{stop} and t_{post} in your formula. (This is an easy modification to implement.)
whuber
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.