Вы оказались в ловушке в этом 5х5 лабиринте - каждая комната помечена от 1 до 25, а выход находится в комнате 1.
В качестве входных данных вам дается комната, в которой вы находитесь. Ваша задача - вывести кратчайшую последовательность ходов (север, восток, юг, запад), необходимую для достижения комнаты 1.
Ходы могут быть выведены в любом формате (список, строка, массив ...), если вы используете символы n,w,e,s
.
Вот все тесты:
1 => empty string/list
2 => w
3 => ww
4 => swwnw
5 => wswwnw
6 => seenwnw
7 => nw
8 => wnw
9 => wwnw
10 => swwnwnw
11 => eenwnw
12 => enwnw
13 => nwnw
14 => wnwnw
15 => wwnwnw
16 => enenwnw
17 => nenwnw
18 => wnenwnw
19 => nwnwnw
20 => wnwnwnw
21 => nenenwnw
22 => enwnenwnw
23 => nwnenwnw
24 => wnwnenwnw
25 => nwnwnwnw
Кратчайший ответ в байтах побеждает!
Ответы:
Python 2 , 64 байта
Попробуйте онлайн!
Функция, которая печатает одно направление на строку, завершается с ошибкой.
Константа
0x1211252b5375
кодирует в базе 4 направление, в которомd
мы перемещаемся из каждого номера комнаты, в число от 0 до 3. Извлекаемая цифра>>2*n-4&3
также предназначена для получения отрицательной ошибки сдвига приn=1
завершении кода. Мы обновляем номер комнаты сn
помощью смещения, которое вычисляется из направленияd
asd*3+d%2-5
, которое отображает:источник
try
/except
), чтобы иметь возможность продолжить выполнение после вызова этой функции.Python 2 ,
9593 байтаПопробуйте онлайн!
Может сбрить
32 байта, если разрешена маркировка номера с 0 индексами.источник
05AB1E ,
3029 байт-1 байт благодаря чудесному совпадению с простыми числами
Попробуйте онлайн!
источник
1
для ввода1
вместо пустой строки (было бы легко добавить ведущийõ?
). Кроме того, хороший ответ!Рубин ,
7262 байтаПопробуйте онлайн!
Как?
Хитрость заключается в том, чтобы использовать 2 константы для построения следующего шага для каждой ячейки, а затем рекурсивно решить проблему.
2 константы 18139004 и 4267088 являются двоичными строками, указывающими направление следующего движения. Извлекая один бит из обоих для каждой ячейки, мы можем получить:
Проще чем смещаться и маскировать одно большое двоичное число ИМХО.
Когда мы получаем направление, мы извлекаем соответствующую букву из строки «en sw»:
И продолжить рекурсивно по ячейке [n + x]
источник
JavaScript (ES7),
6258 байтПорт ответа Xnor .
Попробуйте онлайн!
источник
Perl 5 (
-n
), 94 байта-5 байт благодаря Грими
TIO
источник
Perl 5 , 79 байт
Попробуйте онлайн!
источник
JavaScript,
807371 байтАдаптировано из решения Chas Python, поэтому, пожалуйста,
+1
ему тоже.Попробуйте онлайн!
1 байт сохранен благодаря Арно .
источник
Древесный уголь ,
4340 байтПопробуйте онлайн! Ссылка на подробную версию кода. На основе ответов @ ChasBrown's и @ xnor. Объяснение:
Введите комнату.
Установите переменную цикла
i
на единицу меньше номера комнаты и повторите, пока она не равна нулю.Извлеките направление из сжатой строки
0113130113220112010102010
. (Начальная буква0
- просто заполняющая цифра.)Распечатать направление.
Используйте формулу @ xnor для расчета нового номера комнаты.
источник
Желе ,
3029 байтПопробуйте онлайн!
Монадическая ссылка, берущая начальную ячейку и возвращающая строку с указаниями.
Мне нравится тот факт, что в словаре желе есть слово типа «Кеннесо» (город к северо-западу от Атланты, штат Джорджия), которое используется здесь, потому что индексирование в него
[5, 1, -5, -1] + 1
даетnesw
!объяснение
источник
PHP , 110 байт
Решение , которое не является портом большого ответа Брауна Часа или большого ответа XNOR в . Я знаю, что это дольше, но я хотел иметь другое решение!
Попробуйте онлайн!
Я создал строку сопоставления, которая имеет 2 символа для каждой ячейки на доске. Первый символ для каждой ячейки - это ход (n / e / s / w), или
0
код 30 ASCII-кода второго персонажа будет возвращать другой номер ячейки, за которым мы должны следить за его движением в рекурсивном режиме, пока не доберемся до выхода из ячейки (cell < 2
).Например, для ввода 8:
8
:w%
w
и продолжить ходы для ячейки%
%
равен 37, мод 30 будет 7, поэтому следующая ячейка будет7
.7
:n
(последний символ - пробел, код ASCII = 32)n
и продолжать ходы для ячейки 32 мод 30, которая есть2
.2
:w<
(последний символ ASCII-код = 60)w
и продолжать ходы для ячейки 60 мод 30, которая есть0
.2
, цикл останавливается!wnw
PHP , 75 байт
Эта версия написана Грими , она на 35 байт короче моего первоначального ответа, потому что он умнее! Комментарий Грими: «4 * 25 <256, поэтому вам нужно только 1 байт на ячейку, а не 2»
Попробуйте онлайн!
PHP , 71 байт
Этот порт ответа Арно, который является портом ответа xnor , но представляет собой цикл вместо рекурсивной функции, поскольку в PHP он оказывается короче.
Попробуйте онлайн!
источник
C (лязг) , 81 байт
Попробуйте онлайн!
Благодаря предложению @ Tommylee2k -8! + рекурсивный вызов
C (лязг) , 90 байтов
Попробуйте онлайн!
Похоже на все несжатые решения.
источник
v;f(p){for(;p-1;p+=v%5?6-v%8:v%2?5:-5)putchar(v="00wwswsnwwseenwwenwnwnenwn"[p]);}
05AB1E ,
4543 байтаПорт ответа @ChasBrown 's Python 2 .
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
Посмотрите эту подсказку 05AB1E (все четыре раздела), чтобы понять, почему
.•DUo¢ê`Ω÷‰₂¡)R€ûK•
это так"a wwswsnwwseenwwenwnwnenwn"
;Ž₁9
есть22449
;Ž₁9₂в
есть[1,7,5,11]
; и'€Ã
есть"news"
.источник
western
лучше. ; pБаш , 120 байт
Попробуйте онлайн!
Некоторое время я играл, пытаясь упаковать строку как кусочки, но для декодирования потребовалось бы больше символов, чем сохраненного числа.
Как это устроено:
Строка $ S содержит один символ (n, w, s, e) для каждой комнаты, показывая, в каком направлении нужно двигаться, чтобы переместиться на одну комнату к выходу, пропуская комнаты 0 и 1.
Строка $ N имеет дельту, которую нужно прибавить / вычесть из номера текущей комнаты для каждого изменения направления (n: -5, w: -1, s: +5, e: +1)
Начните с $ i, равного номеру комнаты, указанному в командной строке ($ 1). Назначьте символ с индексом $ i в строке $ S для $ d. Извлеките значение дельты из $ N для направления в следующую комнату, присвоив его $ j.
Выведите следующее направление, чтобы взять $ d.
Добавьте / вычтите дельту из $ j в / из $ i.
Цикл пока мы не покинем комнату № 2 (пока $ i> 1).
источник
Stax , 31 байт
Запустите и отладьте его
источник
Котлин , 112 байт
Попробуйте онлайн!
источник