Головоломка:
Рассмотрим консольную / портативную игру с D-Pad, где вы должны ввести название своего рода. Это появилось во многих старых играх до того, как использование QWERTY было популяризировано в консолях (например, я считаю, что Wii использует раскладку клавиатуры QWERTY для ввода). Как правило, экранная клавиатура выглядит с эффектом *:
По умолчанию:
0 1 2 3 4 5 6 7 8 9
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 _ + ^ =
С переключенным корпусом:
0 1 2 3 4 5 6 7 8 9
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 - + ^ =
То есть все буквенно-цифровые клавиши и следующее:
_
: Один пробел
-
: дефис
+
: переключать регистр только на следующую букву: переключать регистр
^
букв (то есть переключать регистр всех букв)
=
: ввод, завершение
* Очевидно, я заменил ключи типа «BKSP» и «ENTER» на более короткие версии.
И тогда аппаратный будет включать в себя D-Pad (или какую - либо форму контроля , где вы могли бы пойти up
, down
, left
и right
)
Экран также обычно позволяет перемещаться с одной стороны непосредственно на другую. То есть, если вы сфокусировались на букве J
, нажатие right
позволит вам перейти к букве A
.
Всякий раз, когда я вводил свое имя, я всегда старался найти самый быстрый способ сделать это.
Цель:
Ваша программа будет принимать строковый ввод, который может включать любой буквенно-цифровой символ, включая пробел и дефис, и ваша цель - вывести кратчайшее количество нажатий клавиш на клавиатуре d для вывода требуемой строки.
Соображения:
Вам не нужно включать нажатой клавишу для нажатия фактического символа.
Фокус всегда начинается с A
Ввод =
должен быть нажат в конце
Пример:
input: Code Golf
output: 43
Объяснил:
A
-> C
= 2
C
-> ^
= 6 (движется влево)
^
-> o
= 5
o
-> d
= 2
d
-> e
= 1
e
-> +
= 5
+
-> _
= 1
_
-> +
= 1
+
-> G
= 3
G
-> o
= 3
o
-> l
= 3
l
-> f
= 5
f
-> =
= 6
Обратите внимание, что +
для a _
и a быстрее ударить дважды, G
чем для удара ^
один раз, а затем поменять местами назад.
Представление победителя (я позволю по крайней мере 1 Вт) будет самым коротким решением (в байтах). Поскольку это мой первый вопрос, я надеюсь, что это понятно и не слишком сложно.
Ответы:
Рубин (369 байт)
Принимает данные из командной строки.
Благодаря @Charlie :) сэкономил кучу байтов :)
источник
j=(K.index(c.upcase) or 36)
может быть заменен на,j=K.index(c.upcase)||36
чтобы сохранить 4 байта.def d(x,y)
можно заменить на,def d x,y
чтобы сохранить байт, и то же самое дляdef v
.v(...) if
чтобыv(...)if
для другого байта. В последней строкеv(...)
можно заменить на,v ...
чтобы сохранить 1 байт, иtrue
на,!!0
чтобы сохранить другой байт.&&
на&
и||
с|
.K=...
) может быть заменена на диапазон (K='0123456789'+('A'..'Z').to_a.join+' +^='
)Swift 1.2,
812588670 байтРедактировать: Убрал 224 байта, заменив большие массивы чисел на Range и преобразовав его вместо Array.
Edit2: добавлен цикл по вертикали
Чтобы запустить, поместите код в
.swift
файл и запустите его сswift <filename> <your name>
При этом используется простой подход, при котором две «клавиатуры» хранятся в виде массивов.
B:(I)->(I,I)={a in(a%10,a/10)}
Преобразует индекс из массива в позицию x, y на виртуальной клавиатуре.func C(e:I,f:I)->I{let(a,b)=B(e),(c,d)=B(f) return abs(d-b)+min(abs(c-a),abs(10-(c-a)))}
Принимает начальный / конечный индекс и возвращает минимальное количество ходов, которое нужно получить от одного к другому (с учетом горизонтального переноса)func D(c:S,_ e:I=10,_ f:Bool=false,_ g:Bool=false)->I
Является основной рекурсивной функцией, выполняющей большинство вычислений. Он вычисляет расстояние от текущей позиции до целевого характера, если дело не должно измениться, то он рассчитывает как на сдвиг и на колпачках блокировку методов и принимает наималейшие.Бегущие
swift codegolf.swift Code Golf
отпечатки43
источник
Python
679661619602589576539520496482 байтЗапустите это, и он запросит ввод (без текста подсказки). Для ввода
Code Golf
он печатает43
.Полная программа:
Расширенный вывод из полной программы:
источник
C 675 байт
Принимает входные данные из аргумента командной строки. Использует рекурсивную магистраль:
источник