Чтобы узнать, что такое Ханойская башня, либо поищите ее в Google, либо посмотрите на странице Википедии .
Ваш код должен быть в состоянии сделать 2 вещи, и они следующие:
- Принять пользовательский ввод, который определяет количество дисков в начальной точке Ханойской башни
- Создайте вывод в выбранном вами стиле (если это логично), чтобы показать решение головоломки с башней.
Примером логического вывода может быть следующий (с использованием запуска на 4 диска):
L1L2C1L1R-2R-1L1L2C1C-1R-2C1L1L2C1
L
представляет левый штифт, C
представляет центральный штифт и R
представляет правый штифт, а цифры показывают, как далеко диск перемещается по этому штифту и в каком направлении. Положительные числа представляют количество колышков, движущихся в направлении самого правого колышка (поскольку диски начинаются на крайнем левом колышке).
В правилах к башне Ханоя просты:
- Только один диск может быть перемещен за один раз.
- Каждый ход состоит в том, чтобы взять верхний диск с одного из колышков и вставить его на другой колышек, поверх других дисков, которые могут уже присутствовать на этом колышке.
- Нельзя размещать диск поверх меньшего диска.
Диски начинаются с самого левого колышка, самый большой снизу, самый маленький сверху, естественно.
Ответы:
Шелуха , 5 байт
Попробуйте онлайн!
Каждый
n
из выходных данных представляет собой перемещение дискаn
к следующему доступному штифту (циклический перенос).объяснение
источник
Питон, 76 символов
Например, для N = 3 он возвращает:
источник
Perl - 54 символа
Запустите с
perl -M5.010
и введите количество дисков на стандартный ввод.Выходной формат:
Одна строка на ход, первая цифра от колышка, вторая цифра от колышка (начиная с 0)
Пример:
источник
$x=--$_&-$_,say(($_-$x)%3,($_+$x)%3)for 2..1<<<>
GolfScript (
31 2524 символов)Спасибо Ильмари Каронену за то, что он указал, что мои первоначальные
tr
перестановки могут быть сокращены на 6 символов. Разложив их как произведение двух перестановок, мне удалось сохранить еще одну.Обратите внимание, что факторинг
3%
увеличивает длину на один символ:У некоторых людей действительно сложные выходные форматы. Это выводит колышек, перемещенный из (пронумерованный 0, 1, 2), и колышек перемещается в. В спецификации не указано, к какому колышку двигаться, поэтому он перемещается к колышку 1.
Например
источник
])~{.{3^3%}%2,@{2\-}%++}*
Perl, 75-
79символовПолностью украдя формат вывода Кита Рэндалла:
Вызвать с
-M5.010
заsay
.(Я думаю, что это можно улучшить, если вы сможете найти способ использовать возвращаемое значение функции, а не просто подавить его.)
источник
say
рекомендация "просто используйте "]SML, 63
вызвать функцию
f(n,s,t)
с:источник
Баш (64 символа)
Публикация этого, несмотря на то, что он в два раза длиннее GolfScript, потому что мне нравится повторное использование
t
в качествеecho $s
.источник
Скала,
928887 символовВыходной формат
Скажите номер диска = 3 тогда,
источник
C
989287 символовРеализует самый тривиальный алгоритм.
Выходные данные имеют вид, в
ab ab ab
котором каждая пара означает «переместить верхний диск из колышка а в колышек б».РЕДАКТИРОВАТЬ : теперь ходы закодированы в шестнадцатеричном формате - 0x12 означает переход от колышка 1 к колышку 2. Сохранены некоторые символы.
РЕДАКТИРОВАТЬ : читает число из стандартного ввода, а не параметр. Более короткие.
Пример:
% echo 3 | ./hanoi
13 12 32 13 21 23 13
источник
h(x,printf(...))
это просто способ позвонить,printf
прежде чемh
называется. Последнееn++
сделано после внутреннегоh
возврата. Он используется для отмены начальногоn--
.;
было бы то же самое здесь.,
часто полезен (например,if(x)a,b;
заменяетif(x){a;b;}
), но не имеет здесь никакого преимущества.Желе , 5 байт
Попробуйте онлайн!
0
переместить наименьший диск на одну позицию вправо (при необходимости1
перенести обратно на начало) переместить второй наименьший диск в единственный другой допустимый столбец2
переместить третий наименьший диск в единственный другой допустимый столбеци т. д.
Алгоритм
Мы можем увидеть решение проблемы Ханойских башен рекурсивно; чтобы переместить стопку размера п от A до B , переместить стопку размера п -1 от А до С , то диск размером п от A до B , а затем переместить стопку размера п -1 от B до C . Это создает шаблон следующей формы (в формате вывода, используемом этой программой):
Мы можем наблюдать, что эта последовательность A007814 в OEIS. Другое возможное определение последовательности: « k- й (основанный на 1) элемент последовательности - это число нулей в конце числа k, когда оно записано в двоичном виде». И это то, что программа здесь рассчитывает.
объяснение
Сначала рассчитаем количество ходов в решении, 2 n -1. Оказывается,
2*
самое короткое время - вычислить один дополнительный ход и отбросить его позже, так что это 2, то есть степень чего-либо. (Единственный вход, который мы до сих пор использовали, это аргумент командной строки, поэтому он используется по умолчанию.)Далее мы используем встроенную функцию Jelly для вычисления количества нулей в конце числа в базе b ; что - х . Как мы рассчитываем в двоичном виде, это так . Все, что нам нужно сделать, это применить эту встроенную функцию к числам от 1 до 2 n -1 включительно.
ọb
ọ2
Есть два простых способа перебора диапазона чисел в Jelly,
€
иR
, и мои предыдущие попытки решить эту проблему использовали один из них. Однако в этом случае можно пойти немного короче:Ṗ
когда задано число в качестве входных данных, вы можете выполнить итерацию, которая останавливает один элемент (обычноṖ
это встроенная функция, используемая для обработки всех элементов, кроме одного). Это именно то, что мы хотим в этом случае (потому что2*
генерирует слишком много элементов), поэтому использование его для ссылки2*
иọ2
в2*Ṗọ2
дает нам 5-байтовое решение проблемы.источник
Awk, 72 символа
Выходной формат такой же, как у Кейта Рэндалла .
источник
Bash скрипт,
10096 символовВыходной формат такой же, как у Кейта Рэндалла .
Редактировать : 4 комментария Петра сохранены .
источник
$@
J, 23 байта
решение двоичных чисел
Это решение использует метод двоичного подсчета, описанный в этом видео .
То есть я генерирую двоичные цифры от
1
до2^n
, затем беру инфиксы длины 2 и сравниваю каждый бит с соответствующим битом предыдущего числа, и проверяю, являются ли они неравными. Количество неравных битов является выходом для этого хода.Вывод, например, для 3 дисков, где самый маленький диск помечен как 1:
1
означает «переместить наименьший диск на один колышек вправо, при необходимости вернувшись к первому колышку»n
для всех остальныхn
означает «переместить дискn
на легальную привязку» (всегда будет ровно одна)Попробуйте онлайн!
рекурсивное решение
Тот же результат, что и в предыдущем решении, но логика здесь делает рекурсивный характер проблемы более понятным.
Визуализация его в виде дерева также подчеркивает этот момент:
Попробуйте онлайн!
источник
APL (Dyalog Classic) , 19 байтов
Попробуйте онлайн!
вывод представляет собой 2-столбцовую матрицу целых чисел в {0,1,2} - от колышка до колышка
источник
К (нгн / к) , 23 байта
Попробуйте онлайн!
источник
R , 73 байта
Помещение R на карту. Вдохновленный [ответом Кита Рэндалла] [1] с упрощенным вводом, напечатайте только конец и начните колышек, чтобы сохранить 2 байта. Также 0-индексированные колышки.
Попробуйте онлайн!
источник
JavaScript (ES6), 45b
например, вызов
h(4, 'A', 'B', 'C')
(переместите 4 диска из колышка A в колышек C, используя вспомогательный колышек B)возврат
'ABACBCABCACBABACBCBACABCABACBC'
(переместите диск из колышка A в колышек B, переместите диск из колышка A в колышек C, переместите диск из колышка B в колышек C и т. д.)источник