В первую очередь для тех, кто с ним незнаком; Scala — это функциональный язык программирования, работающий на виртуальной машине Java.
Он невероятно многофункционален и позволяет решать некоторые задачи гораздо элегантнее, чем другие объектно-ориентированные языки, такие как Java или C++.

Как Питон; В Scala есть мощный интерпретатор, который позволяет вам оценивать код на лету:

Welcome to Scala 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_92).
Type in expressions for evaluation. Or try :help.

scala> 1 + 1
res0: Int = 2

scala>

Что может оказаться неоценимым при тестировании или изучении данных.

Тем, кто интересуется Scala, я настоятельно рекомендую Веб-сайт языка Scala, а тем, кто знаком с Java, — Scala for Java Programmers book.

Колесо слов

Колесо слов — это простая головоломка, в которой вы пытаетесь составить как можно больше слов из набора букв, при этом одна (или несколько) букв должна быть во всех ваших словах.

Обычно также есть слово, в котором используются все буквы Колеса Слов, можете ли вы увидеть, что это такое в данном примере?

Решатель колеса слов

Теперь это далеко от моего Word Wheel Solver.

Решатель Word Wheel имеет 3 обязательных аргумента:

  1. Обязательная буква — буква, которая должна быть внутри любого составленного слова.
  2. Необязательные буквы — буквы, окружающие требуемую букву.
  3. Путь к списку слов — файл со словом в строке

И четвертый необязательный аргумент; слова минимальной длины могут быть, по умолчанию установлено значение 3.

Первые 2 аргумента очевидны, когда вы смотрите на Word Wheel, однако для списка слов вы можете использовать файл слов Unix, создать свой собственный из текста или загрузить существующий список слов.

Создание списка слов

Обычно я загружаю существующий список слов, но создать список слов относительно легко, поэтому я покажу, как это сделать, используя текстовые файлы (книги), предоставленные Project Gutenberg.

Для этого примера я выбрал следующие книги:

Я скачал текстовые версии этих файлов в кодировке UTF-8 и поместил их в папку.

Чтобы превратить эти книги в список слов, я написал следующую программу на Scala (объяснение того, что она делает, приведено ниже):

  1. Эта программа принимает 1 или более путей к текстовым файлам в качестве аргументов.
  2. Он создает изменяемый набор для хранения всех слов в
  3. Затем он перебирает каждый файл и открывает их.
  4. Для каждой строки в файле он дезинфицирует ввод: заменяет все специальные символы пробелом и переводит все в нижний регистр.
  5. Затем для каждой из этих строк он разбивает строку на пробелы и табуляции и создает набор полученных слов.
  6. Затем этот набор слов добавляется к основному набору слов.
  7. Затем он открывает файл с именем wordlist.txt и заполняет его всеми словами из набора слов.

Это дает мне файл с почти 20 000 «слов». Некоторые из них на самом деле не слова, но я их пока проигнорировал.

Код решателя

Теперь у меня есть список слов, и я могу запустить решатель Word Wheel на приведенном выше примере Word Wheel, используя его.

Ниже приведен исходный код решателя Word Wheel:

Основная часть работы выполняется в методахsolve и createWordMap.

метод createWordMap

Этот метод берет слова из списка слов и создает карту букв для соответствующих слов. Например:

Представьте, что наш список слов состоит из двух слов: cat и act.
Этот метод будет:

  1. Берет слово кошка
  2. Упорядочивает буквы по алфавиту (действие)
  3. Находит запись на карте для этих букв (действие), если не удается найти запись, она создает новую, сопоставляя буквы (действие) со списком слов, содержащих слово cat.
  4. Далее следует слово действие.
  5. Расположить буквы по алфавиту (действие)
  6. Находит запись на карте для этих букв (действие) и добавляет слово действие в уже существующий список

Эта структура данных позволяет вам находить анаграммы слов, которые окажутся полезными в основном методе решения.

решить метод

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

Последний фрагмент кода в этом методе использует сгенерированную ранее карту и пытается сопоставить сгенерированные комбинации с ее записями.
Любые совпадения сводятся к последовательности, которая затем выводится на консоль в основном методе. .

Результаты

При запуске с примером Word Wheel с использованием сгенерированного списка слов я получаю следующие результаты:

dangerous
dangers
gardens
groaned
aground
grounds
undergo
asunder
resound
aroused
ranged
garden
gander
grande
danger
dragon
ground
snared
around
rondes
snored
nursed
rounds
guards
argued
gourds
adores
soared
roused
soured
grand
daren
arden
doran
adorn
under
round
nosed
doesn
ondes
sound
drags
guard
dregs
drugs
urged
gourd
reads
dares
roads
adore
doers
dang
dasn
sand
dane
doan
dern
rend
ends
dens
send
nods
done
undo
drag
egad
aged
drug
dogs
gods
doge
ards
dear
read
dare
road
soda
rods
rode
rude
does
dose
used
sued
dues
and
dan
den
ned
end
nod
don
dun
und
god
dog
dug
dar
sad
ado
red
rod
des
ode
due

Некоторые из них не похожи на настоящие слова; это связано с тем, что содержимое списка слов, который я сгенерировал, содержит некоторые орфографические ошибки, сленговые слова и плохо отформатированный текст.

Однако он содержит длинное слово, в котором используются все буквы: «опасный», а также множество других реальных слов, которые можно найти в словесном колесе.

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

Первоначально опубликовано в Lyndon Armitage.