Многие старые игры Game Boy часто требовали ввода строки пользователем. Однако клавиатуры не было. Это было сделано путем предоставления пользователю «экрана клавиатуры» следующим образом:
«Указатель на символ» будет начинаться на букву А. пользователя будет перемещаться к каждому нужному символу с D-Pad «s четыре кнопки ( UP
, DOWN
, LEFT
и RIGHT
), затем нажмите кнопку , BUTTON A
чтобы добавить его в конечную строку.
Пожалуйста, обратите внимание:
- Сетка оборачивается , поэтому нажатие
UP
на букву А приведет вас к T. - «Указатель на символ» остается на месте после добавления буквы
Соревнование
Вышеуказанная клавиатура имеет опции для изменения регистра и имеет неправильную форму. Итак, для простоты в этой задаче мы будем использовать следующую клавиатуру (справа внизу - ASCII char 32, пробел):
A B C D E F G
H I J K L M N
O P Q R S T U
V W X Y Z .
Печатание на таких клавиатурах чрезвычайно медленное, поэтому, чтобы упростить эту задачу, вы должны написать программу, которая сообщает пользователю самый быстрый способ ввода заданной строки. Если есть несколько быстрых способов, вам нужно показать только один.
Выходной ключ должен быть:
>
дляRIGHT
<
дляLEFT
^
дляUP
v
дляDOWN
.
дляBUTTON A
(добавить текущее письмо в строку)
Например, когда дана строка DENNIS
, решение будет выглядеть так:
>>>.>.>>v..>>.>>>v.
Правила / Детали
- Пожалуйста, помните, сетка оборачивается!
- Вы можете отправить полную программу или функцию, если она принимает начальную строку и создает строку решения. Пробелы / завершающие символы новой строки не имеют значения, если вывод правильный.
- Можно предположить, что ввод будет состоять только из символов, набираемых на указанной клавиатуре, но он может быть пустым.
- Это код-гольф , поэтому выигрывает самый короткий код. Применяются стандартные лазейки для игры в гольф.
Тестовые случаи
Обычно есть несколько решений одинаковой длины. Для каждого теста я включил оптимальную длину и пример. Вам не нужно печатать длину в вашем ответе, только решение.
FLP.TKC -> 25 steps: <<.<v.<<<v.<<<v.^.<<^.<^.
MOYLEX -> 23 steps: <<v.>>v.>>>v.>^^.^.<<^.
FEERSUM -> 18 steps: <<.<..<vv.>.>>.<^.
MEGO -> 14 steps: <<v.<^.>>.>vv.
A CAT -> 17 steps: .<^.>>>v.<<.<<vv.
BOB -> 10 steps: >.<vv.>^^.
(space) -> 3 steps: <^.
(empty) -> 0 steps: (empty)
Вы можете просмотреть мой генератор тестовых файлов на repl.it - пожалуйста, сообщите мне, если есть какие-либо ошибки.
Спасибо всем за представления! Пользователь ngn в настоящее время является победителем с 61 байтом, но если кто-то может найти более короткое решение, маленький зеленый тик может быть перемещен;)
Ответы:
Дьялог АПЛ , 61 байт
4 7∘{∊'.',⍨⍉↑b⍴¨¨'^v' '<>'⌷¨⍨⊂¨a>b←a⌊⍺-a←⍺|↓2-/0,⍺⊤⍵⍳⍨⎕a,'.'}
предполагает
⎕IO←0
⎕a,'.'
алфавит с последующей остановкой⍵⍳⍨
найдите там символы аргумента в виде индексов 0..26 (' '
а все остальные будут 27)⍺⊤
закодировать в базе 7 (обратите внимание, что левый аргумент⍺
связан с4 7
), получить матрицу 2 × n0,
ставить нули влево2-/
различия между соседними столбцами↓
разбить матрицу на пару векторовa←⍺|
возьмите их по модулю 4 и 7 соответственно, присвойтеa
b←a⌊⍺-a
сделатьb
меньше изa
и его модульной обратной'^v' '<>'⌷¨⍨⊂¨a>b
выберите^
илиv
для первого вектора и<
или>
для второго, в зависимости от того, гдеa
отличается отb
b⍴¨¨
повторить каждый из техb
времен⍉↑
смешать два вектора в одну матрицу и транспонировать ее, получить матрицу n × 2'.',⍨
добавить.
-s справа∊
расплющитьисточник
JavaScript (ES6), 147 байт
Интересным поведением
substring
является то, что он обменивается аргументами, если второе меньше первого. Это означает, что если я вычислю оптимальное количество нажатий влево / вправо как число от -3 до 3, я могу добавить 3 и взять подстроку,<<<>>>
начинающуюся с 3, и получу правильное количество стрелок. Между тем, нажатия вниз / вверх просто обрабатываются путем поиска массива с использованием побитового алгоритма и разницы в строках с 3; этот путь немного короче, так как элементов массива меньше.источник
Рубин, 107 байт
Неуправляемый в тестовой программе
источник
Mathematica, 193 байта
Гольф
Удобочитаемый
источник
Python 2, 298 байт
Это длиннее, чем должно быть, но ...
Любая помощь будет принята с благодарностью!
Вводит в кавычки.
l
возвращает местоположение символа на клавиатуре.Два
if
оператора в серединеd
предназначены для проверки того, будет ли оптимальным «обтекание» вокруг клавиатуры.Ввода,
s
имеет"A"
предваряется к нему , поскольку начальное положение курсораA
.Мы перебираем строку попарно, отбрасывая последнюю (которая не является парой :)
[:-1]
, и находим минимальное расстояние между двумя половинами пары.Спасибо Flp.Tkc за сообщение, что я могу делать,
a=abs
а не говоритьabs
каждый раз!источник
Java 8, 1045 байт
Гольф
Удобочитаемый
объяснение
Решение - прямой подход: плохо оптимизированная грубая сила. Метод
g(...)
представляет собой базовый поиск глубины, проходящий каждую перестановку (вверх, вниз, влево, вправо). С некоторыми небольшими изменениями в заказе для тестовых случаев я получаю вывод:источник