Здається, цей мандрівник про те, що люди втомливо вивчають нові розкладки клавіатури, як Дворак або Нео, тому що це нібито робить їх більш продуктивними. Я стверджую, що переключення макетів клавіатури - це погана ідея, тому що швидкість роботи може зайняти у вас місяці, і коли ви на 5% швидше, ніж решта, вам накрутить, якщо вам потрібно набрати на комп’ютері, який не є твій власний.
Також усі ці люди забувають, де лежить справжнє вузьке місце в сучасному спілкуванні - телефонна клавіатура.
Ось як виглядає ваша середня телефонна клавіатура:
Буква 'r' - третя літера на кнопці 7; тож якби ви набрали букву 'r' на мобільному телефоні, ви натискали б кнопку 7 тричі, для 's' ви натискали її 4 рази, а для 'a' ви натискали кнопку 2 один раз.
Враховуючи це, введення "e" після "d", ймовірно, було поганим рішенням - "e" - це найпоширеніша літера в англійському алфавіті, тож, якщо ви мали позначити кнопку 3 "EDF" замість "DEF", ви врятувало б досить багато натискань на клавіші.
Більше того, ви, напевно, самі переконалися, що введення двох літер, які мають одну і ту ж кнопку, викликає неприємності - якщо ви хочете написати "TU", ви не можете просто тричі натиснути 8, тому що це призведе до "V". Тому зазвичай ви пишете "T", потім натискаєте пробіл, потім натискаєте на "backspace", а потім пишете "U", що дорівнює 5 натисканням кнопок замість 3.
TL; DR
Враховуючи ці два правила:
- Буква вводиться натисканням кнопки n разів, де n - місце, де знаходиться буква на етикетці кнопки
- Для написання двох літер, які вводяться за допомогою однієї кнопки, потрібно додатково натиснути 2 кнопки
Який розклад клавіатури телефону вимагає найменшої кількості натискань кнопок з урахуванням конкретного тексту? Слід використовувати лише кнопки 2-9, 1 і 0, зарезервовані для спеціальних символів.
Вхідні дані
Текст, для якого ви повинні знайти оптимальний макет, подається через stdin. Вам не потрібно обробляти що-небудь, окрім малого алфавіту, і можна вважати, що вхід складається лише з цього. Ви також можете припустити, що вхідний текст досить великий, і кожна буква є хоча б раз, якщо це допомагає.
Вихідні дані
Я не хочу ставити занадто багато обмежень на вихід, оскільки це іноді дає деяким мовам переваги перед іншими; тож якби ваша мова показує масиви, це нормально, або ви можете розділити кожну мітку новим рядком.
Можливо кілька можливих оптимальних макетів, ви можете надрукувати будь-яку з них. Ось простий приклад:
>> echo "jackdawslovemybigsphinxofquartz" | foo.sh
ojpt
avhz
cen
skm
dyf
wbq
ixu
lgr
Бонусні бали
-35, якщо ваш алгоритм не змушує всіх можливих макетів (я переглядаю "перестановки" Haskell тут)
-3 якщо ваш код поміститься всередині текстового повідомлення (140 символів), і ви опублікуєте фотографію з відправленням коду другові.
Це мій перший виклик на StackExchange. Буду радий почути, чи подобається вам це, чи є якісь інші відгуки про нього!
26! / (2! * 6!) = 280,063,514,671,253,913,600,000 > 2^77
унікальні перестановки, рахуючи прості перестановки клавіш лише один раз.