Проверьте с помощью ldply
из plyr
после split
df=plyr::ldply(split(x$sequence,x$cluster), rbind)
col=df$.id
df$.id=NULL
df=data.frame(t(df))
names(df)=paste('cluster',col)
df
cluster 1 cluster 2 cluster 3
1 A D D
2 AB B BA
3 AC DB BB
4 ABC DC BC
5 <NA> AC BF
6 <NA> ADC <NA>
. В этом году на PyCon Рэймонд Хеттингер рассказал о программировании ИИ на Python и рассмотрел Cryptarithms.
Видео всей беседы можно посмотреть здесь , а кулинарную книгу с решением можно найти по по этой ссылке .
Что ж, попробуйте написать его в виде списка функций:
SEND
MORE
----+
MONEY
Если я помню свою математику из младшей школы, это должно be:
Y = (D+E) mod 10
E = ((N+R) + (D+E)/10) mod 10
...
этот может быть полезен
Редактировать: ответ по вики-ссылке, которую вы разместили, также полезно!
Это такая маленькая проблема, что грубое решение не плохой метод. Предполагая, что каждая буква должна представлять собой уникальную цифру (т.е. мы не допустим решения S = 9, M = 1, * = 0), мы видим, что количество комбинаций, которые нужно попробовать, равно n! , где n - количество уникальных букв в криптарифе. Теоретическое максимальное количество комбинаций для оценки составляет 10! = 3 628 800 , что очень мало для компьютера.
Если мы допустим, чтобы несколько букв представляли одно и то же число, количество попыток сочетания будет ограничено 10 ^ n , опять же, где n - количество уникальных букв. Предполагая только заглавные английские буквы, мы имеем теоретическое максимальное количество комбинаций 10 ^ 26 , поэтому для этого теоретического наихудшего случая нам может понадобиться некоторая эвристика. Большинство практических криптарифмов имеют намного меньше, чем 26 уникальных букв, поэтому нормальный случай, вероятно, будет ограничен числом n меньше 10, что опять-таки довольно разумно для компьютера.