Вступление
Популярная головоломка состоит в том, чтобы преобразовать одно слово в другое с помощью последовательности шагов, которые заменяют только одну букву и которые всегда приводят к правильному слову. Например, BAG может быть преобразован в DOG через путь из пяти шагов:
СУМКА -> BAT -> CAT -> COT -> COG -> СОБАКА
Более короткие пути также существуют в этом случае; например:
СУМКА -> БОГ -> СОБАКА
Если нарисовать граф, вершины которого были помечены словами, с ребром между любой парой слов, отличающихся на одну букву, то кратчайший путь от «BAG» до «DOG» будет состоять из двух ребер.
Вызов
Вы должны написать программу, которая получает в качестве входных данных «словарь» слов, имеющих одинаковую длину, представляющих все допустимые слова, которые могут появляться как шаги по пути. Он должен вывести хотя бы один «самый длинный кратчайший путь», то есть путь между двумя словами:
не длиннее любого другого пути между этими двумя словами;
по крайней мере, до максимально короткого пути между любой другой парой слов в списке.
В контексте графика, описанного выше, длина такого пути - это диаметр графика.
В вырожденном случае, когда ни одно из входных слов не может быть преобразовано ни в одно из других, выведите хотя бы один путь нулевой длины, то есть одно слово.
Примеры
Ввод ["bag", "bat", "cat", "cot", "dot", "dog"] должен давать путь, пересекающий все шесть слов в этом порядке (или обратном порядке), поскольку самый короткий путь из " Сумка "для" собаки "в этом словаре самая длинная, достижимая, пять шагов.
Ввод ["bag", "bat", "bot", "cat", "cot", "dot", "dog"] должен давать путь "bag, bat, bot, dot, dog" и / или его разворот.
Ввод ["code", "golf", "male", "buzz", "mole", "role", "mold", "cold", "gold", "mode"] должен давать путь между "code" и "гольф".
Входные данные ["one", "two", "six", "ten"] соответствуют графу без ребер, поэтому выведите один или несколько путей из одного слова (нулевой длины).
Если входные данные содержат любые два слова неравной длины, выходные данные не определены.
правила
- Применяются стандартные правила игры в гольф
- Там будет несколько «кратчайших» путей. Вы должны вывести хотя бы один, но можете вывести столько, сколько пожелаете.
- Вы можете сами решать, как вводить словарь в вашу программу.
- Самый короткий код в байтах побеждает.
[]
или[[]]
)?Ответы:
Желе , 20 байт
Попробуйте онлайн!
источник
APL (Dyalog Classic) ,
84 80 77 76 74 6661 байтПопробуйте онлайн!
вход и выход являются символьными матрицами
⍵+.≠⍉⍵
матрица расстояний Хэмминга между словами9*⍨2⌊
оставить 0 и 1 без изменений, превратить 2+ в некоторое большое число (512 = 29 , используется как «∞»)⌊.+⍨⍣≡
алгоритм кратчайшего пути floyd & warshall⌊.+
как матричное умножение, но с использованиемmin
(⌊
) и+
вместо+
и×
соответственно⍨
используйте одну и ту же матрицу слева и справа⍣≡
повторить до схожденияd←⌈/512|,
длина самого длинного (не "∞") пути, назначенногоd
⊃⍸a=
с какими двумя узлами он соединяется, давайте назовем их i и j{⍵,⍨⊃⍋(1≠a⌷⍨⊃⍵),⍪⍺⌷a}⍣d/
реконструировать путь{
}⍣d/
оцените время{
}
функцииd
. левый аргумент⍺
всегда i . правый аргумент⍵
начинается как j и постепенно накапливает внутренние узлы пути(1≠a⌷⍨⊃⍵),⍪⍺⌷a
построить матрицу из двух столбцов этих двух векторов:1≠a⌷⍨⊃⍵
логическое значение (0 или 1), указывающее, какие узлы находятся на расстоянии 1 до первого из⍵
⍺⌷a
расстояния всех узлов графа до⍺
⊃⍋
указатель лексикографически наименьшего ряда⍵,⍨
готовиться к⍵
⍵⌷⍨
индексировать оригинальные слова с путемисточник
Python 3 , 225 байт
Попробуйте онлайн!
По сути, возьмите все возможные пути, оставьте только те, которые являются действительными, затем просмотрите каждую комбинацию начала и конца, найдите минимальное расстояние пути и найдите максимум этого.
источник
Wolfram Language (Mathematica) , 105 байт
Попробуйте онлайн!
источник
JavaScript (ES6),
195194 байтаВозвращает
[optimal_length, [optimal_path]]
.Попробуйте онлайн!
Как?
(этот код выполняется на каждой глубине рекурсии, но на самом деле имеет значение только корневой уровень)
источник
Wolfram Language (Mathematica) , 92 байта
Попробуйте онлайн!
источник
Python 3, 228 байт.
Реализует алгоритм Флойда-Варшалла для всех пар кратчайших путей, затем берет максимум по найденным путям.
16 из символов в этой реализации являются вкладками, что вызывает сожаление :(
источник