Ваша задача - рассчитать общее количество нажатий клавиш, необходимое для ввода данного текста на старом мобильном телефоне.
Таблицы ключей:
1:1
2:abcABC2
3:defDEF3
4:ghiGHI4
5:jklJKL5
6:mnoMNO6
7:pqrsPQRS7
8:tuvTUV8
9:wxyzWXYZ9
0:<space><newline>0
Чтобы набрать exaMPle TExt 01
, вы должны нажать 33 99 2 6666 77777 555 33 0 8888 33333 99 8 0 <a 1-sec pause here in real life but we'll ignore it>000 1
в общей сложности 37 нажатий клавиш.
*
Ключ выводит карту специальных символов:
.,'?!
"-()@
/:_;+
&%*=<
>£€$¥
¤[]{}
\~^¡¿
§#|`
с первым .
выделенным ( ). Вы можете перемещаться, чтобы выделить нужный символ, используя прямоугольные клавиши навигации, и для выбора требуется еще одно нажатие.
Таким образом, чтобы вставить $
, вы должны нажать *↓↓↓↓→→→<select>
т.е. всего 9 нажатий клавиш.
- Входные данные будут из файла с именем,
source
помещенного в текущий каталог / каталог вашей программы. РЕДАКТИРОВАТЬ: В соответствии с запросами в комментариях я добавляюSTDIN
в качестве действительного метода ввода. Извиняюсь за изменение спецификации после получения ответов. - Вы должны вывести
Total key presses <total_keypresses>
- Если входной файл содержит какой-либо символ, отсутствующий в данной таблице ключей, то ваша программа должна вывести
Invalid character <character> in source
и выйти.
Короче говоря, ввод и вывод вашей программы должны быть похожи на этот (ungolfed) скрипт на python:
# This Python file uses the following encoding: utf-8
from __future__ import print_function
import sys
general_dict = { '1':1,
'a':1, 'b':2, 'c':3, 'A':4, 'B':5, 'C':6, '2':7,
'd':1, 'e':2, 'f':3, 'D':4, 'E':5, 'F':6, '3':7,
'g':1, 'h':2, 'i':3, 'G':4, 'H':5, 'I':6, '4':7,
'j':1, 'k':2, 'l':3, 'J':4, 'K':5, 'L':6, '5':7,
'm':1, 'n':2, 'o':3, 'M':4, 'N':5, 'O':6, '6':7,
'p':1, 'q':2, 'r':3, 's':4, 'P':5, 'Q':6, 'R':7, 'S':8, '7':9,
't':1, 'u':2, 'v':3, 'T':4, 'U':5, 'V':6, '8':7,
'w':1, 'x':2, 'y':3, 'z':4, 'W':5, 'X':6, 'Y':7, 'Z':8, '9':9,
' ':1, '\n':2, '0':3
}
special_chars = ['.',',',"'",'?','!','"','-','(',')','@','/',':','_',';','+','&','%','*','=','<','>','£','€','$','¥','¤','[',']','{','}','\\','~','^','¡','¿','§','#','|','`']
for x in special_chars:
general_dict[x]=(special_chars.index(x)/5) + (special_chars.index(x)%5) + 2
key_press_total = 0
with open('source') as f: # or # with sys.stdin as f:
for line in f:
for character in line:
if character in general_dict:
key_press_total+=general_dict[character]
else:
print('Invalid character',character,'in source')
sys.exit(1)
print('Total key presses',key_press_total)
Это код-гольф, выигрывает самая короткая в байтах программа.
Беззастенчивый отказ от ответственности: я сделал эту задачу, чтобы иметь переводы вышеописанного скрипта Python на разные языки, которые будут использоваться для оценки этой задачи в песочнице .
1ce5a2fdd0316e37c0a07d151d02db766a3adbb7
.Ответы:
GolfScript, 219 символов
Основной подход с использованием справочной таблицы:
Попробуй здесь .
источник
source
, а не из STDIN"#{File.read('source')}"
"#{File.read'source'}"
Ruby 2.0, 232
Пока очень простая схема кодирования: более 75% символов используются для литералов строк / массивов ...
источник
CJam, 207 байтов
Эта программа имеет 207 символов. При соответствующей кодировке (Windows-1252) он умещается в 207 байтов.
Обратите внимание, что Stack Exchange преобразует вкладки (которые я использую в качестве разделителя в таблице поиска) в пробелы, поэтому вы не можете скопировать и вставить приведенный выше код.
использование
Кодировка Windows-1252
Кодировка UTF-8
источник
PHP,
711708676 символов (чтение из STDIN сейчас)Мой первый гольф пока что :)
Хотел попробовать довольно нетрадиционный подход. Вместо того, чтобы иметь список каждого символа и сколько кликов нужно для его создания, я использую значения ASCII символа и вычисляю их требуемые нажатия клавиш. Подумал, что сначала это избавит меня от некоторых символов, теперь я думаю, что это даже дольше, чем использование массива.
Моя главная проблема - клавиши 7 и 9, которые имеют 4 буквы вместо 3. Поэтому мне нужно было создать пару запасных вариантов, которые взорвали мой код почти на 200 символов.
Неуправляемая версия
Я предполагаю, что есть еще много возможностей для улучшения, но я очень доволен этим.
Еще одна плохая вещь - обязательное использование
iconv()
списка специальных символов. Некоторые из них (€
,¥
, ...) не изначально поддерживается PHP.источник
utf8_decode
будет работать нормально для каждого символа , кроме из€
. Вот почему я должен был использоватьiconv
вместо этого. Мой код не рассчитывает эти специальные символы, как это происходит с обычными символами, поскольку они не в порядке, и я не могу надежно работать с их соответствующими значениями ASCII. Он использует обычный список для них.Python 3, 239 символов
источник
JavaScript (E6) 291
редактировать
Версия оболочки, используя оболочку spydermonkey. Чтение из исходного файла, запись в sdtout
Первая попытка, работает в консоли FireFox, используя всплывающее окно для ввода и вывода
Удобочитаемый
источник
VBScript 435
Не поддерживает символы не ASCII. Я был довольно далеко со своим кодом, поэтому решил опубликовать его для справки. Я не думаю, что кто-то еще использовал этот подход.
источник