Давайте разберем и обработаем Key-Language! Учитывая ввод последовательности нажатий клавиш клавиатуры и / или специальных клавиш, напишите программу, функцию и т. Д., Которые выводят продукт, когда все действия обрабатываются на основе следующей клавиатуры:
+-------------------------------------------------------+
| ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | - | + | |
| ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ | = |Del|
+-------------------------------------------------------+
|TAB| q | w | e | r | t | y | u | i | o | p | [ | ] | \ |
| | Q | W | E | R | T | Y | U | I | O | P | { | } | | |
+-------------------------------------------------------+
|CAPS | a | s | d | f | g | h | j | k | l | ; | ' | RET |
| | A | S | D | F | G | H | J | K | L | : | " | |
+-------------------------------------------------------+
| SHIFT | z | x | c | v | b | n | m | , | . | / | SHIFT |
| | Z | X | C | V | B | N | M | < | > | ? | |
+-------------------------------------------------------+
| |
| SPACEBAR |
+-------------------------------------------------------+
Клавиши, которые выводят действительные символы, не состоящие из пробелов, и которые могут быть изменены другими клавишами, будут называться «символьными клавишами», а те, которые изменяют вывод других клавиш или пробелов, будут называться «специальными клавишами». Клавиши алфавита символов, которые будут показаны на входе с прописными буквами, могут быть изменены либо Shift
или Caps Lock
к продукции заглавных букв, а остальные клавиши символов может быть изменены только с Shift
производить свои альтернативные символы. Следовательно, A
на входе соответствует a A
символьная клавиша, чей обычный вывод a
и модифицированный вывод, который можно получить с помощью клавиши Shift
или Caps Lock
, есть A
. С другой стороны,/
, который соответствует / ?
символьной клавише, имеет нормальный выходной сигнал /
и модифицированный выходной сигнал, который ?
можно получить только с Shift
этим временем.
правила
Ввод всегда будет строкой, состоящей из последовательности символьных клавиш и специальных клавиш. Полный специальный ключ для сопоставления строк для ввода (т. Е. Формат, в котором они гарантированно находятся во входе) и их соответствующие действия / выходы заключаются в следующем:
<DEL> -> Delete the previous character (including whitespace). If called when string is empty, nothing happens. If called 2 or more times in a row, 2 consecutive deletes happen. For instance, "RE<DEL><DEL>" should return an empty string ("") and also "R<RET><DEL><DEL>E" should return just "E".
<CAPS> -> Enable Caps Lock until <CAPS> appears again, upon which it is disabled, although it is not guaranteed to be disabled by the end of the input. Enabling this only modifies the upcoming alphabet keys resulting in them outputting only uppercase letters. For instance, "<CAPS>RE<CAPS>" results in the output "RE", but <CAPS>.<CAPS> would still result in a ".".
<RET> -> Add a new line.
<SPC> -> Add a single blank space.
<TAB> -> Add 4 spaces.
<SHFT> -> Shift is held down resulting in the alternate character of the upcoming keypress to be output, after which the key is released. For instance, "<SHFT>A" results in the output "A", "<SHFT>1" results in the output "!", and "<SHFT>1234" results in the output "!234" as only the first upcoming keypress is modified and nothing else. It is guaranteed that a character key will succeed a <SHFT>. Therefore, <SHFT><SPC> is not a possible input.
Пустая строка также возможна в качестве входных данных, для которых выходные данные должны быть ничем.
- Использование любых встроенных программ, которые решают эту проблему напрямую, запрещено.
- Использование стандартных лазеек запрещено.
Тестовые случаи
Представлено в формате с Actual String Input -> Actual String Output
последующим объяснением для немногих.
1<SHFT>2<TAB><CAPS>R.KAP.<SPC><SHFT>123 -> 1@ R.KAP. !23
Вывод,
1
когда1
клавиша нажата без переключателя, затем удерживается Shift и2
клавиша нажимается, что приводит к@
выводу. Затем клавиша Shift отпускается и нажимается Tab, что приводит к отступу в 4 интервала. Следуя, Колпачки нажатии на клавишу блокировки, после чегоR
,.
,K
,A
,P
, и.
клавиши нажаты, в результате чего на выходеR.KAP.
. И, наконец, одно выходное пространство с последующим смещением в результате!23
выводимого , когда1
,2
и3
клавиши нажаты в конце.<SHFT>ABCDEFG<SHFT>HIJK<SHFT>1<SHFT>2<SHFT>3<SHFT>4567890 -> AbcdefgHijk!@#$567890
Клавиша «Shift» удерживается нажатой, а затем
A
клавиша, что приводит к выводу сA
последующим выводомbcdefg
приB-G
нажатии клавиш. Затем клавиша переключения удерживается в нажатом положении снова сменилаH
ключ, после чего выхода естьH
, а затем ,ijk
когдаI-K
клавиши нажаты. Наконец, все1-4
клавиши изменяются по мере того, как нажатие клавиши shift удерживается перед каждым нажатием клавиши, в результате чего вывод!@#$
завершается567890
после5-0
повторного нажатия клавиш.<CAPS>THIS<SPC>IS<SPC>IN<SPC>ALL<SPC>CAPS<CAPS><SPC>NOW<SPC>THIS<SPC>IS<SPC>IN<SPC>ALL<SPC>LOWERCASE -> THIS IS IN ALL CAPS now this is in all lowercase
<TAB><SPC><TAB><SHFT>1 -> !
<CAPS>WWW<CAPS>.CODEGOLF.STACKEXCHANGE<SHFT>.COM -> WWW.codegolf.stackexchange>com
PROGRAMMING<CAPS><SPC>IS<SPC><CAPS>AWESOME -> programming IS awesome
<DEL><RET><DEL><RET><DEL> -> "" (Empty String)
Клавиша удаления нажимается в начале, после чего ничего не происходит. Затем нажимается клавиша возврата, в результате чего появляется новая строка, которая удаляется после повторного нажатия клавиши возврата. Наконец, та же самая последовательность (новая строка, сопровождаемая backspace) повторяется. После всего этого на выходе получается пустая строка.
<SHFT>HI<SPC>HOW<SPC>ARE<SPC>YOU<SHFT>/<RET><SHFT>I<SPC><SHFT>AM<SPC>O<DEL><SHFT>GOOD<SHFT>1 -> Hi how are you?\nI Am Good!
<SHFT>,<CAPS>RET<CAPS><SHFT>. -> <RET>
Строка
<RET>
должна быть фактической строкой вывода. Таким образом, это не должно выводить новую строку.<CAPS>67890,.;'[]<CAPS> -> 67890,.;'[]
<CAPS><SHFT>A -> A
RE<DEL><DEL> -> "" (Empty String)
U<RET><DEL><DEL>I -> i
<DEL><DEL><DEL>5<DEL> -> "" (Empty string)
"" (Empty String) -> "" (Empty String)
Это codegolf поэтому выигрывает самый короткий код в байтах!
AbcdefgHijk!@#$567890
? Кроме того, в тесте № 8<SHFT>
находится в конце строки, но правила гласят: «Гарантируется, что символьная клавиша будет следовать за <SHFT>».Ответы:
16-битный машинный код x86,
140139 байтСохраняется 1 байт, заменяя DL на DX в последнем опкоде. Также исправлены смещения прыжка при разборке, чтобы соответствовать шестнадцатеричному дампу.
Поскольку характер задачи требует некоторых предварительно инициализированных данных, и ответом является не полная программа, а функция, я предполагаю, что в программе есть раздел данных, и компоновщик оперативно обновляет адрес данных. Заполнитель адреса обозначается как «????».
Это шестнадцатеричное представление кода. Параметры - указатель на входную строку в SI и указатель на выходной буфер в DI. Предполагается, что строки имеют нулевое окончание.
Содержимое таблицы сопоставления (25 байт):
Количество байтов учитывает как код, так и данные.
Разборка:
Для набора 32-битных команд код абсолютно одинаков, за исключением первой инструкции, которая длиннее на 2 байта из-за 32-битной адресации (8d1d ???????? lea ebx, ds: ??????? ?)
источник
i
для тестаU<RET><DEL><DEL>I
и пустую строку для вводаRE<DEL><DEL>
? Я немного разъяснил правила, касающиеся ключа удаления, поэтому, если эти 2 контрольных примера не работают, не могли бы вы также обновить свой код, чтобы он выдавал правильный вывод для этих контрольных примеров? Спасибо!Сетчатка, 136 байт
Вероятно, можно играть в гольф дальше.
Проверьте все тестовые случаи. (Немного изменен, чтобы запускать все тестовые сценарии одновременно.)
источник
Caps+Shift+A = A
. Человек моя клавиатура странно ...JavaScript (ES6), 207
Обновлен, чтобы исправить ошибку с повторным удалением, даже на несколько байт короче.
меньше гольфа
Тестовое задание
источник
I
для тестаU<RET><DEL><DEL>I
и пустую строку для вводаRE<DEL><DEL>
? Я немного разъяснил правила, касающиеся ключа удаления, поэтому, если эти 2 контрольных примера не работают, не могли бы вы также обновить свой код, чтобы он выдавал правильный вывод для этих контрольных примеров? Спасибо!U<RET><DEL>I
должен датьi
неI