На современных игровых приставках и других устройствах без традиционных клавиатур попытки ввода текста - это кошмар. Необходимость печатать с помощью нескольких кнопок и джойстика на виртуальной клавиатуре раздражает, и мне нравится делать как можно меньше движений / нажатий кнопок.
Клавиатура, которую вы будете использовать, выглядит следующим образом:
+---+---+---+---+---+---+---+---+---+---+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |
+---+---+---+---+---+---+---+---+---+---+
| q | w | e | r | t | y | u | i | o | p |
+---+---+---+---+---+---+---+---+---+---+
| a | s | d | f | g | h | j | k | l | - |
+---+---+---+---+---+---+---+---+---+---+
| z | x | c | v | b | n | m | _ | @ | . |
+---+---+---+---+---+---+---+---+---+---+
Можно использовать следующие операции:
L
: сдвинуть одну клетку влево на клавиатуре (оборачивает)R
: на клавиатуре переместиться на один квадрат вправо (оборачивает)U
: сдвинуть на квадрат вверх на клавиатуре (оборачивает)D
: сдвинуть на квадрат вниз на клавиатуре (оборачивает)Y
: вставить пробелB
: переместить указатель вставки на одну позицию влево (ничего не делает, если указатель находится в начале)F
: переместить указатель вставки на одну позицию вправо (ничего не делает, если указатель находится в конце)C
: тумблерA
: вставить выбранный символ в позицию указателя вставки
При наличии входной строки, содержащей только символы ASCII, которые можно набрать с помощью вышеуказанной клавиатуры и команд (совпадений [a-zA-Z0-9 _@.-]*
), выведите последовательность команд, которая приведет к выходной строке. Начальная позиция курсора находится на 1
клавише (вверху слева), а заглавные буквы изначально отключены.
счет
Для любой данной строки наивным подходом было бы, для каждого символа в строке, перейти к символу на клавиатуре по кратчайшему пути, переключить при необходимости заглавные буквы и выбрать символ. Такой наивный подход породил бы команду длины (length of input string) + (sum of Manhattan distances on keyboard between consecutive non-space characters) + (number of times the string alternates between lowercase and uppercase characters) + (1 if string starts with an uppercase letter else 0)
. Например, наивный подход для 101
приведет ALARA
к команде длины 5 и Noob 5
приведет DDDRRRRRCAUURRRCAADDLLLLAYUUUA
к команде длины 30.
Ваше представление, однако, стремится сделать лучше, чем наивный подход. Для каждой входной строки ваша отправка получит баллы, равные количеству команд, которые использует наивный подход, минус количество команд, которые ваша отправка выдает. Ваш общий балл будет суммой индивидуальных баллов.
правила
- Материалы будут выполняться в бесплатном виртуальном рабочем пространстве Cloud9 . Рабочая область имеет 512 МБ ОЗУ, 2 ГБ дискового пространства, 8 процессоров Intel (R) Xeon (R) с тактовой частотой 2,50 ГГц (полную информацию о процессоре, которую можно найти при запуске
cat /proc/cpuinfo
, можно найти здесь ), и работает под управлением 64-битной Ubuntu 14.04 Trusty. Вы можете запросить доступ к рабочему пространству тестирования , чтобы запустить и оценить свою работу, или я могу оценить ее для вас. - Представления будут выполняться один раз для каждого теста. Хранение состояния между запусками запрещено. Материалы не могут записывать или читать из каких-либо файлов, кроме исходного файла (который не может быть изменен между запусками), с возможным исключением чтения входного файла, если это необходимо.
- Отправка ограничена 1 минутой времени выполнения для каждого теста. Представления могут выводить несколько решений, но для оценки будет использоваться только последнее действительное решение в течение отведенного времени. Если в течение отведенного времени вывести какие-либо действительные решения, результат теста будет равен 0.
- Пожалуйста, включите инструкции о том, как вызвать ваше представление, а также о любых инструментах / библиотеках, которые необходимо установить, которые не включены в стандартную установку Ubuntu 14.04.
- Победителем станет представление с наибольшим количеством очков. В случае ничьей победит представление с лучшей алгоритмической сложностью. Если ничья еще не решена, победит первая заявка, набравшая очки и сложность алгоритма.
- Представленные материалы могут не оптимизироваться для тестовых случаев. Я оставляю за собой право изменять контрольные примеры, если я чувствую необходимость.
Контрольные примеры
Формат: input string => naive score
(если вы видите какие-либо ошибки в них, пожалуйста, оставьте комментарий с исправлением)
101 => 5
quip => 12
PPCG => 15
Mego => 25
Noob 5 => 26
penguin => 27
867-5309 => 32
2_sPoOkY_4_mE => 60
The Nineteenth Byte => 76
penguins@SouthPole.org => 95
8xM3R__5ltZgrkJ.-W b => 98
correcthorsebatterystaple => 104
verylongRUNSOFCAPSandnocaps => 118
This is an English sentence. => 122
WNtza.akjzSP2GI0V9X .0epmUQ-mo => 131
Programming Puzzles and Code Golf => 140
Ответы:
С
Счет 193.
Скомпилируйте как "gcc virtualKeyboard.c". Запустите его без аргументов "./a.out". Он читает входные данные из стандартного ввода и записывает вывод в стандартный вывод.
источник
C99
Вот моя попытка решения. Получено 62 балла.
Похоже, что правильно работает для меньших слов, и я просто предположил, что более крупные слова работают правильно, потому что они слишком велики, чтобы я мог проверить вручную.
Скомпилировать с помощью "gcc -std = gnu99"
Использование "virtualKeyboard" string ""
источник
Noob 5
isRRRRRUCALCAYRRRRARRRRDBBBAA
, который производитN33b @
, и ваш второй выводLLDAAYRRRRAUBBARBBBCA
, который производит4oo3 e
. В настоящее время ваша текущая оценка равна 5, потому что ваша программа печатает только допустимые последовательности команд для первых 3 тестовых случаев.