Кажется, существует постоянное увлечение людьми, утомительно изучающими новые раскладки клавиатуры, такие как Dvorak или Neo, потому что это якобы делает их более производительными. Я утверждаю, что переключение раскладок клавиатуры - плохая идея, потому что вам могут понадобиться месяцы, чтобы набрать скорость, и когда вы на 5% быстрее остальных, вы облажались, если вам нужно печатать на компьютере, который не работает. твой собственный.
Кроме того, все эти люди забывают, где находится настоящее узкое место в современном общении - телефонная клавиатура.
Вот так выглядит ваша обычная телефонная клавиатура:
Буква «r» - третья буква на кнопке 7; поэтому, если бы вы вводили букву «r» на мобильном телефоне, вы бы нажимали кнопку 7 три раза, для «s» вы нажимали бы ее 4 раза, а для «a» вы нажимали кнопку 2 один раз.
Учитывая это, ставить 'e' после 'd', вероятно, было плохим решением - 'e' - это наиболее часто используемая буква в английском алфавите, поэтому, если бы вы пометили кнопку 3 "EDF" вместо "DEF", вы спасло бы довольно много нажатий клавиш.
Более того, вы, вероятно, испытали на себе, что ввод 2 букв, которые имеют одну и ту же кнопку, создает неудобства - если вы хотите написать «TU», вы не можете просто нажать 8 три раза, потому что это приведет к «V». Поэтому обычно вы пишете 'T', затем нажимаете пробел, затем нажимаете клавишу Backspace, а затем пишете 'U', что равно 5 нажатию кнопок вместо 3.
TL; DR
Учитывая эти два правила:
- Буква набирается нажатием кнопки n раз, где n - это позиция буквы на этикетке кнопки.
- Для написания двух букв, набираемых с помощью одной и той же кнопки, требуются дополнительные нажатия двух кнопок
Какая раскладка клавиатуры телефона требует наименьшего количества нажатий кнопок, учитывая определенный текст? Вы должны использовать только кнопки 2-9, 1 и 0 зарезервированы для специальных символов.
вход
Текст, для которого вы должны найти оптимальный макет, предоставляется через стандартный ввод. Вам не нужно обрабатывать что-либо, кроме строчных букв, и вы можете предположить, что ввод состоит только из этого. Вы также можете предположить, что вводимый текст достаточно велик, и каждая буква присутствует там хотя бы один раз, если это поможет.
Выход
Я не хочу накладывать слишком много ограничений на вывод, так как это иногда дает одни языки преимущества перед другими; поэтому, однако, ваш язык показывает, что массивы в порядке, или вы можете разделить каждую метку новой строкой.
Может быть несколько возможных оптимальных макетов, вы можете распечатать любой из них. Вот простой пример:
>> echo "jackdawslovemybigsphinxofquartz" | foo.sh
ojpt
avhz
cen
skm
dyf
wbq
ixu
lgr
Бонусные очки
-35, если ваш алгоритм не использует все возможные макеты (я смотрю здесь на «перестановки» Хаскелла)
-3, если ваш код помещается в текстовое сообщение (140 символов), и вы публикуете фотографию, на которой вы отправляете код другу.
Это мой первый вызов на StackExchange. Я был бы рад услышать, нравится ли вам это или есть другие отзывы об этом!
26! / (2! * 6!) = 280,063,514,671,253,913,600,000 > 2^77
уникальные перестановки, подсчитывающие простые перестановки клавиш только один раз.Ответы:
Perl, 333
Вот попытка оптимизации для правила № 2. После моего комментария выше и вместо ответов, учитывающих это правило (см. Высокий рейтинг вопросов), я подумал, что должен кое-что приложить здесь ...
Решения, которые не оптимизированы для правила № 2, могут давать результаты, очень далекие от оптимальных. Я проверил длинный естественный текст на английском языке (на самом деле «Алиса в стране чудес»), предварительно обработанный (только строчные буквы) и, например, скрипт Perl из ответа OJW, результат был
er
один только разрушает его, плюс некоторые другие пары никогда не должны заканчиваться на том же ключе ...Кстати,
zxqjvkbpfmygwculdrshnioate
это буквы, отсортированные по частоте, из этого текста.Если мы попытаемся решить ее простым способом (возможно, надеясь получить бонус -35) и размещать буквы одну за другой, выбирая доступный ключ по минимальному количеству пар, мы можем закончить, например:
Я не размещаю код для этого (неправильного) решения здесь. Например, обратите внимание,
c
чаще, чемw
и ставится на первое место.tc
(ct
) пары явно реже, чемac
(ca
) - 43 + 235 против 202 + 355. Но затемw
заканчиваетсяa
- 598 + 88. Мы заканчиваем парамиaw
иtc
(всего 964), хотя было бы лучшеac
иtw
(всего 635). Так далее..Таким образом, следующий алгоритм пытается проверить каждые 8 оставшихся (или 2, если последние) наиболее часто встречающихся буквы по буквам, уже находящимся на клавиатуре, и расположить их так, чтобы парное число было минимальным.
Результат:
Мне не нравится эта
ac
пара (в конце концов, Cat является одним из символов), но, тем не менее, это оптимальное расположение букв для английского, если мой код не ошибается. Не совсем «игра в гольф», просто какое-то рабочее решение, безобразное или нет.источник
Python3, это время Монте-Карло!
Чтобы решить эту проблему, я сначала посчитал, сколько «кликов» вам нужно с помощью клавиатуры по умолчанию (изначально:)
abc,def,ghi,jkl,mno,pqrs,tuv,wxyz
. Затем я изменяю эту клавиатуру и проверяю, дешевле ли она (текст пишется меньше кликов). Если эта клавиатура дешевле, то она становится стандартной. Я повторяю этот процесс1M
раз.Чтобы сменить клавиатуру, я сначала решаю, сколько изменений нужно сделать (максимальное количество изменений - это общее количество букв на клавиатуре). Затем для каждого переключателя я выбираю две кнопки и две позиции и перенесу символ из первой позиции во вторую.
Максимальное количество переключателей за раз - это количество букв на клавиатуре, потому что это минимальное количество изменений, которое вам нужно переключить с двух разных клавиатур. (Я хочу, чтобы всегда можно было переключиться с одной клавиатуры на любую другую)
Вывод
echo "jackdawslovemybigsphinxofquartz" | python .\myscript.py
:Где
61
номер кнопки, нажатой для составления данного сообщения.Символы (без пробелов и без комментариев): 577
Я знаю это долго, но я действительно новичок в этом деле.
Мне было так смешно, что я решил попробовать этот алгоритм с LO HOBBIT (у меня тоже есть оригинальная копия дома!). У него есть
383964
буквы, и это пара кликов против клавиатуры , которую я нахожу:Поэтому я утверждаю, что эта последняя клавиатура является одной из самых практичных (с точки зрения кликов).
источник
Ну, если вы просто хотите, чтобы наиболее популярные символы были назначены для бинов 2-9, Perl может сделать это за 127 символов ...
давая что-то вроде:
Или напечатайте все это в одной строке, удалив 12 символов:
источник
$x{$_}++for split/\s*/,<>;map$o{$n++%8}.=$_,sort{$x{$b}<=>$x{$a}}keys%x;print map"$_:".$o{$_-2},2..9
Хаскелл, 160 - 35 = 125
Пример:
Можно утверждать, что это не оптимизирует для правила 2, но он помещает наиболее часто встречающиеся буквы на разные ключи.
источник
JavaScript, 192 - 35 = 157
Просто заметил правило повторяющихся символов; это не учитывает это. Но, как заметил @mniip в своем ответе:
Вероятно, это было бы в Ruby, но я не дома и вынужден использовать Internet Explorer (eww). Но эй, иногда забавно использовать ужасные языки в игре в гольф! ;)
Пример вывода (для вашего ввода):
Поскольку JS не имеет STDIN, программа предполагает, что ввод хранится в переменной
s
.источник
'abcdefghia'
не совсем оптимален.'azbcdefghizjklmnopqzrstuvwxyz'
b=['','','','','','','','']
дляb=[x='',x,x,x,x,x,x,x]
,s.split('')
чтобыs.split(x)
иo[x]=o[x]?o[x]+1:1
вo[x]=-~o[x]
.Python (119-35 = 84):
Предполагая, что строка является переменной a и содержит только строчные буквы:
ungolfed:
PYG (76-35 = 41):
Аааа, мы можем отказаться от огромного импорта. Опять же, это предполагает, что раздетая строка находится в.
источник