Метка «алгоритм A*»

Алгоритм A* и кубик Рубика: реализация на языке HaskellДвенадцатый конкурс по функциональному программированию в этом году и семнадцатый с момента запуска этого процесса выдался на удивление особенным. Впервые в истории конкурсов на него не было прислано ни одного решения. А казалось бы, задание проще простого — написать программу, которая для заданного состояния кубика Рубика находила бы (кратчайший) алгоритм его сбора.

Злые языки предупреждали, что у рассматриваемой системы (размера 3х3х3) более 43 квантильонов состояний, и что никакой компьютер не справится с расчётом алгоритма при помощи простого перебора. Но ведь человек как-то решает задачу. Да, зачастую человек берёт и использует типовые шаги. Но вот я, к примеру, собираю кубик при помощи типовых комбинаций, но у меня на сборку кубика уходит минут пять, в то время как умельцы могут это сделать за 10 секунд. Что, неужели они знают алгоритм Бога? Сомневаюсь. Так что задача была вполне решаема. Но никто не решил.

Я сам написал для проверки своих идей программу для перебора при помощи алгоритма А* для кубика Рубика произвольного размера. Далее представлена эта программа.

Читать полностью »

Трансмутации слов друг в друга: решение на языке HaskellВ ставших уже традиционными ежемесячных конкурсах по функциональному программированию всем желающим предлагается поразмять свои мозги и представить на суд общественности своё решение конкурсной задачи на каком-либо языке программирования (кстати, совсем не обязательно функциональном — многие конкурсанты используют и такие экзотические языки, как Java и даже Python). В апрельском конкурсе в качестве задачи была предложена задача по поиску цепочки трансмутаций между словами в заданном словаре. Конечно, это есть задача по поиску [кратчайшего] пути в графе, рёбра которого представляют возможность перехода от слова к слову по заданному правилу (должна быть изменена и только изменена одна и только одна буква), однако задача заинтересовала участников, и в качестве результатов было представлено 22 решения на 9 различных языках (C++, Clojure, D2, Erlang, F#, Go, Haskell, Mathematica и Perl).

Словарь, по которому осуществлялся поиск, можно получить здесь. Впрочем, можно воспользоваться услугами сайта «Слова из букв», с которого, собственно, и получен словарь. Конечно, многие слова там очень странные, однако какая нам разница, на каком словаре строить граф для конкурса? Пусть это будут просто формальные цепочки символом. А по результатам конкурса вообще появлялись такие предложения от участников: «Надо написать новое определение слова «АХЧЕ» — это слово, которое используется в конкурсах по программированию, для порождения самых длинных метаграмм».

Ну а поскольку конкурс был назван «Кельтская алхимия», занимались мы трансмутациями следующих пар слов (метаграмм):

  1. МУХА — СЛОН
  2. ДЕНЬ — НОЧЬ
  3. СНЕГ — ВОДА
  4. ОТЕЦ — МАТЬ
  5. РУКА — НОГА
  6. ЗИМА — ЛЕТО
  7. СВЕТ — ТЬМА
  8. ЛИПА — КЛЁН

Как видно, здесь имеет место попытка подобрать слова, часто противоположные по смыслу. Это придало конкурсу некоторую изюминку, хотя, конечно, все участники подошли к этому вопросу абсолютно по программистски — все разработали алгоритмы поиска путей в графе. А кое-кто даже граф визуализировал:

Трансмутации слов друг в друга: решение на языке Haskell

Итак, если вам интересна задача, и вы хотите узнать, как организовывался конкурс и как можно решить поставленную задачу, то милости прошу Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js