Клавиатура сотового телефона
Этот вопрос был задан некоторое время назад, но был закрыт из-за плохой спецификации. Итак, я переделываю это, с лучшими характеристиками. Этот вопрос связан, но идет в противоположном направлении.
До того, как T9 пришел в себя, чтобы ввести символ в текстовом сообщении, вам нужно было нажать одну из цифровых клавиш несколько раз, чтобы получить нужный символ. Для справки вот стандартное отображение:
+-------+-------+-------+
| 1 | 2 | 3 |
| .?!1 | ABC2 | DEF3 |
+-------+-------+-------+
| 4 | 5 | 6 |
| GHI4 | JKL5 | MNO6 |
+-------+-------+-------+
| 7 | 8 | 9 |
| PQRS7 | TUV8 | WXYZ9 |
+-------+-------+-------+
| * | 0 | # |
| ← |SPACE 0| → |
+-------+-------+-------+
*
Backspace, 0
пробел ( ' '
) или число 0
, и #
подтверждает текущий символ. Для простоты все символы в верхнем регистре.
При нажатии на клавишу несколько раз, выбранные циклов символов через возможные символы для этой клавиши: 2 -> A
, 22 -> B
, 222 -> C
, 2222 -> 2
, 22222 -> A
, и так далее. Обратите внимание, что, поскольку *
имеется только одна опция, нажатие на нее несколько раз приводит к вводу нескольких пробелов. Нажатие #
несколько раз подряд не имеет никакого эффекта. Трейлинг#
не нужен.
Кроме того, если сразу после нажатия клавиши нажать другую кнопку, предыдущее нажатие автоматически подтверждается. Таким образом, 223
функционально идентичен 22#3
.
Ваша задача состоит в том, чтобы перевести последовательность нажатий клавиш в соответствующую строку, отображаемую на мобильном телефоне.
Примеры
8#99999#055#33#999#22#666#2#777#3#1 -> T9 KEYBOARD
4433555#55566609666666677755533*3111 -> HELLO WORLD!
7##222#222**7#222#4 -> PPCG
00#0#00 -> 0 0
правила
- Это код-гольф , поэтому выигрывает самое короткое правильное решение (в байтах)
- Победивший ответ будет выбран через неделю
- Стандартные лазейки запрещены
- Ваш ответ может быть в форме полной программы, именованной функции или анонимной функции, принимающей ввод и производящей вывод одним из стандартных методов.
Leaderboard
Фрагмент стека в нижней части этого поста создает таблицу лидеров из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
## Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:
## Perl, 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать имя языка ссылкой, которая будет отображаться во фрагменте кода:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 61545; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 45941; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
2 -> A
,22 -> B
...,2222 -> A
....) не позволяет производить какие-либо числа.Ответы:
К5, 112 байт
Это действительно беспорядок, но я думаю, что есть достаточно места для игры в гольф.
Сначала нам нужно создать таблицу соответствия для раскладки ключей. Существуют ключи с назначенными им 2, 4 и 5 символами, поэтому заполнение каждой записи до 20 упрощает процесс циклического индексирования этой таблицы позже:
Затем я разделил ввод на прогоны:
Бросайте любые # пробежки и отбрасывайте конечные пробежки каждый раз, когда я сталкиваюсь с *:
И тогда я готов просто индексировать в эту таблицу поиска на основе длины и первого элемента каждого прогона.
Все вместе:
Редактировать:
Сохранить 5 байтов:
источник
(20#'((" ";".?!"),0 3 6 9 12 15 19 22_`c$65+!26),'$!10)
до(20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10)
.Python 2,
230206 байтЭта функция создает функцию f, которая принимает строку нажатий клавиш в качестве аргумента и возвращает соответствующую строку, отображаемую мобильным телефоном. Также бывает, что необязательный второй аргумент в качестве словаря сопоставляет ключи с соответствующими им символами, например {"0": "0", "1": ".?! 1", ...} .
Во-первых, строка нажатий клавиш группируется по повторяющимся символам, например, ["8", "#", "99999", "#", ...] . Затем первый символ каждой группы отображается в словаре, передаваемом в качестве второго аргумента, например, 9 соответствует WXYZ9. . Наконец, длина группы используется как смещение в значении из словаря.
Обратите внимание, что смещение должно использовать модуль по длине группы повторяющихся символов, потому что нажатия клавиш могут циклически повторяться. Также обратите внимание, что символ # отображается в \ 0 и удаляется только в конце, потому что 99 # 99 не совпадает с 9999 .
Вот вывод функции для каждого из примеров в вопросе:
источник
JavaScript,
214184168162 байтаЭто, вероятно, можно сделать немного меньше, но я очень доволен результатом. Разбивает символы на повторяющиеся группы из одного или нескольких, затем проходит по массиву, сопоставляя каждый символ его значению в хэше и добавляя его в окончательную строку. Если он встречает любое число «#», он игнорирует его. Если он сталкивается с каким-либо '*', он удаляет это число из конца последней строки.
источник
Python 2, 237 байт
Используя словарь cr3, но без ре.
источник
Python 2, 265 байт
Это слишком долго. IO: стандартный ввод, стандартный вывод.
источник