Mecanografía del teclado del teléfono celular
Esta pregunta se hizo hace un tiempo, pero se cerró debido a malas especificaciones. Entonces, lo estoy rehaciendo, con mejores especificaciones. Esta pregunta está relacionada, pero va en la dirección opuesta.
Antes de que apareciera T9, para escribir un carácter en un mensaje de texto, tenía que presionar una de las teclas numéricas varias veces para obtener el carácter que deseaba. Como referencia, aquí está el mapeo estándar:
+-------+-------+-------+
| 1 | 2 | 3 |
| .?!1 | ABC2 | DEF3 |
+-------+-------+-------+
| 4 | 5 | 6 |
| GHI4 | JKL5 | MNO6 |
+-------+-------+-------+
| 7 | 8 | 9 |
| PQRS7 | TUV8 | WXYZ9 |
+-------+-------+-------+
| * | 0 | # |
| ← |SPACE 0| → |
+-------+-------+-------+
*
es retroceso, 0
es un espacio ( ' '
) o el número 0
y #
confirma el carácter actual. En aras de la simplicidad, todos los caracteres son mayúsculas.
Cuando se pulsa una tecla varias veces, los ciclos de caracteres seleccionados a través de los caracteres posibles para esa tecla: 2 -> A
, 22 -> B
, 222 -> C
, 2222 -> 2
, 22222 -> A
, y así sucesivamente. Tenga en cuenta que, dado que *
solo tiene una opción, al presionarla repetidamente se ingresan múltiples espacios de retroceso. Presionar #
varias veces seguidas no tiene ningún efecto. Un seguimiento #
es innecesario.
Además, si se presiona una tecla diferente inmediatamente después de presionar una tecla, la pulsación de tecla anterior se confirma automáticamente. Por lo tanto, 223
es funcionalmente idéntico a 22#3
.
Su desafío es traducir una serie de pulsaciones de teclas en la cadena correspondiente que mostraría un teléfono celular.
Ejemplos
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
Reglas
- Este es el código de golf , por lo que gana la solución correcta más corta (en bytes)
- La respuesta ganadora se elegirá en una semana.
- Las lagunas estándar están prohibidas
- Su respuesta puede ser en forma de un programa completo, una función con nombre o una función anónima, tomando entrada y produciendo salida en uno de los métodos estándar
Tabla de clasificación
El Fragmento de pila al final de esta publicación genera la tabla de clasificación a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
## Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
## Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:
## [><>](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
....) no permite que se produzca ningún número.Respuestas:
K5, 112 bytes
Este es realmente un desastre, pero creo que hay bastante espacio para jugar golf.
Primero necesitamos construir una tabla de búsqueda para el mapa de teclas. Hay teclas con 2, 4 y 5 caracteres asignados a ellas, por lo que rellenar cada entrada a 20 simplifica el proceso de indexación cíclica de esta tabla más adelante:
Luego dividí la entrada en carreras:
Suelte cualquier # ejecución y elimine las ejecuciones finales cada vez que encuentre un *:
Y luego estoy listo para simplemente indexar en esa tabla de búsqueda en función de la longitud y el primer elemento de cada ejecución.
Todos juntos:
Editar:
Ahorre 5 bytes:
fuente
(20#'((" ";".?!"),0 3 6 9 12 15 19 22_`c$65+!26),'$!10)
a(20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10)
.Python 2,
230206 bytesÉste crea una función f que toma una cadena de pulsaciones de teclas como argumento y devuelve la cadena correspondiente que mostrará un teléfono celular. También sucede que toma un segundo argumento opcional como teclas de asignación de diccionario a sus caracteres correspondientes, por ejemplo, {"0": "0", "1": ".?! 1", ...} .
Primero, la cadena de pulsaciones de teclas se agrupa por caracteres repetidos, por ejemplo, ["8", "#", "99999", "#", ...] . Luego, el primer carácter de cada grupo se asigna en el diccionario pasado como segundo argumento, por ejemplo, 9 asigna a WXYZ9 . Finalmente, la longitud del grupo se usa como compensación en el valor del diccionario.
Tenga en cuenta que el desplazamiento debe usar un módulo en la longitud del grupo de caracteres repetidos porque las pulsaciones de teclas pueden alternar. También tenga en cuenta que el carácter # se asigna a \ 0 y solo se elimina al final porque 99 # 99 no es lo mismo que 9999 .
Aquí está el resultado de la función para cada uno de los ejemplos en la pregunta:
fuente
JavaScript,
214184168162 bytesEsto probablemente se puede hacer un poco más pequeño, pero estoy bastante contento con el resultado. Divide los caracteres en grupos repetidos de uno o más, luego avanza por la matriz, asigna cada carácter a su valor en el hash y lo agrega a la cadena final. Si se encuentra con cualquier número de '#', lo ignora. Si se encuentra con un '*', elimina ese número del final de la cadena final.
fuente
Python 2, 237 bytes
Usando el diccionario de cr3, pero sin re.
fuente
Python 2, 265 bytes
Es muy largo IO: stdin, stdout.
fuente