Всі ми знаємо, що програмісти, як правило, лінуються. Щоб максимально збільшити вільний час, ви вирішили написати програму, яка видає мінімальну кількість натискань клавіш на текст, поданий в неї.
Введення : Текст , який повинен бути перетворений в натискання клавіш. Ви можете вирішити, як ввести текст (STDIN / читання з файлу, наданого в аргументах)
Вихідні дані : необхідні дії у такому форматі:
- Вони повинні бути пронумеровані
H
це: натискання клавіші та негайно відпускаючи їїP
ress: натискання клавіші і не відпускання її (це ніколи не буде оптимальним, коли клавішу будеR
знято як наступний натискання клавіші)R
elease: звільненняP
відтвореного ключа
Приклад :
Вхід:
Hello!
Вихід:
Наївним рішенням було б:
1 P Shift
2 H h
3 R Shift
4 H e
5 H l
6 H l
7 H o
8 P Shift
9 H 1
10 R Shift
Це було б більш ефективно:
1 P Shift
2 H h
3 H 1
4 R Shift
5 H Left
6 H e
7 H l
8 H l
9 H o
Середовище:
- Редактор використовує одношаровий шрифт
- Текст м'який, обгорнутий на 80 символів
- Стрілка вгору та стрілка вниз зберігають стовпчик, навіть якщо між ними є короткі лінії
- Буфер обміну вважається порожнім
- Передбачається, що блокування чисел увімкнено
- Блокування Caps передбачається вимкнено
- Caps lock працює лише для літер (тобто немає блокування Shift)
Гарячі клавіші / ярлики :
- Home: Перейти до початку поточного рядка
- End: Перейти до кінця поточного рядка
- Ctrl+ A: Позначте все
- Ctrl+ C: Скопіювати
- Ctrl+ X: Вирізати
- Ctrl+ V: Вставити
- Shift+ Курсор переміщення: Позначення
- Ctrl+ F: Відкриває діалогове вікно пошуку.
- Тупа відповідність тексту, відсутність регулярних виразів
- Залежно від регістру
- Пошук обертається
- Одно рядкове введення тексту для пошуку
- Вхід попередньо заповнений поточним виділенням, якщо між ними немає нового рядка, вибирається повний вхід
- Копіювання / вставка працює як завжди
- Натискання Enterвиконує пошук, вибираючи першу відповідність після поточної позиції курсору
- F3: Повторіть останній пошук
- Ctrl+ H: Відкриває діалогове вікно заміни
- Тупа відповідність тексту, відсутність регулярних виразів
- Залежно від регістру
- Замініть все, оберніть навколо
- Однорядкові введення тексту
- Вхід пошуку попередньо заповнений поточним виділенням, якщо між ними немає нового рядка, вибирається повний вхід
- Вхід для заміни порожній
- Копіювання / вставка працює як завжди
- Tab переходить на вхід заміни
- Натискання Enterвиконує заміну всіх. Курсор розміщується після останньої заміни
Правила :
- Рішення повинні бути повноцінною програмою, яка збирає / аналізує та виконує без будь-яких подальших змін
- Клавіатура, що відображається вище, - це клавіатура, яку можна використовувати
- Не потрібно обробляти символи, які не можна набрати з ним
- Кожен ключ повинен бути випущений наприкінці
- Курсор не повинен бути в кінці файлу в кінці
Оцінка :
Ваш бал - це сума дій, необхідних для введення наступних текстів. Переможець - рішення з найнижчою оцінкою. Використовуючи своє наївне рішення, я отримую 1371 + 833 + 2006 = 4210
. Вдарь це! Я виберу переможця через два тижні.
1 Моє наївне рішення
number = 1
H = (char) -> console.log "#{number++} H #{char}"
P = (char) -> console.log "#{number++} P #{char}"
R = (char) -> console.log "#{number++} R #{char}"
strokes = (text) ->
shiftActive = no
for char in text
if /^[a-z]$/.test char
if shiftActive
R "Shift"
shiftActive = no
H char
else if /^[A-Z]$/.test char
unless shiftActive
P "Shift"
shiftActive = yes
H char.toLowerCase()
else
table =
'~': '`'
'!': 1
'@': 2
'#': 3
'$': 4
'%': 5
'^': 6
'&': 7
'*': 8
'(': 9
')': 0
'_': '-'
'+': '='
'|': '\\'
'<': ','
'>': '.'
'?': '/'
':': ';'
'"': "'"
'{': '['
'}': ']'
if table[char]?
unless shiftActive
P "Shift"
shiftActive = yes
H table[char]
else
H switch char
when " " then "Space"
when "\n" then "Enter"
when "\t" then "Tab"
else
if shiftActive
R "Shift"
shiftActive = no
char
R "Shift" if shiftActive
input = ""
process.stdin.on 'data', (chunk) -> input += chunk
process.stdin.on 'end', -> strokes input
2 Легке повторення
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
3 Більш складне повторення
We're no strangers to love
You know the rules and so do I
A full commitment's what I'm thinking of
You wouldn't get this from any other guy
I just wanna tell you how I'm feeling
Gotta make you understand
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
We've known each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it
And if you ask me how I'm feeling
Don't tell me you're too blind to see
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
(Ooh, give you up)
(Ooh, give you up)
(Ooh)
Never gonna give, never gonna give
(Give you up)
(Ooh)
Never gonna give, never gonna give
(Give you up)
We've know each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it
I just wanna tell you how I'm feeling
Gotta make you understand
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Ви можете скористатися написаною мною програмою повтору для тестування ваших рішень (Примітка. Він ще не підтримує пошук / заміну, все інше має працювати).