Inspirado por el Google Code Challenge :
El alfabeto latino contiene 26 caracteres y los teléfonos solo tienen diez dígitos en el teclado. Nos gustaría que sea más fácil escribir un mensaje a su amigo usando una secuencia de pulsaciones de teclas para indicar los caracteres deseados. Las letras se asignan a los dígitos como se muestra a continuación. Para insertar el carácter B, por ejemplo, el programa presionaría 22. Para insertar dos caracteres en secuencia desde la misma tecla, el usuario debe hacer una pausa antes de presionar la tecla por segunda vez. El carácter de espacio '' debe imprimirse para indicar una pausa. Por ejemplo, 2 2 indica AA mientras que 22 indica B.
Cada mensaje constará solo de caracteres en minúscula az y de espacio ''. Al presionar cero se emite un espacio.
Su desafío es escribir la función más pequeña que toma la cadena de entrada y devuelve la secuencia de pulsaciones de teclas necesarias para producir la entrada como cadena o salida a stdout. La función que es la menor cantidad de bytes gana.
Ejemplo de entrada / salida
phone("hi")
44 444
phone("hello world")
4433555 555666096667775553
Otras aclaraciones
- Pausas debe solamente ser añadido cuando sea necesario y debe ser un espacio ''.
- Cada mensaje constará solo de caracteres en minúscula az y de espacio ''. Imprimir
0
para significar espacios. - No hay bibliotecas externas.
- Solo se puede pasar la cadena de entrada a su función.
- Para que otros idiomas sean competitivos, la declaración de la función principal no cuenta y tampoco importa otras bibliotecas estándar.
#include
s,import
s yusing
s no cuentan. Todo lo demás lo hace. Esto incluye#define
sy funciones auxiliares. Vea la regla 2 en esta pregunta si está confundido. - Múltiples espacios se pueden denotar como
00
o0 0
ya que realmente no tiene que hacer una pausa entre un espacio
{}
parte de la firma de la función? Por ejemplo, si mi código esfunction f(){alert('hi');}
, ¿debo contar los caracteres dealert('hi');
o{alert('hi');}
?t9
funciona de manera diferente: tienes que hacer clic en cada tecla una vez para obtener una palabra.Respuestas:
Rubí,
129 129122115111108107105Hecho con el golf ...
¡Vaya! Olvidé por completo eliminar espacios innecesarios. Se corrigió ...
Ahorró 2 caracteres gracias a Peter Taylor.
Versión en línea
Explicación:
el espacio se traduce al char con el ordinal 96
los caracteres se asignan primero a series de números: - a a 2 - b a 22 - d a 3222 - ha 444333222
una expresión regex luego coincide con el primer grupo de dígitos iguales
la matriz está unida
todos los espacios en las ocurrencias de "digit space different_digit" se eliminan
fuente
6666
6 no debería necesitar presionarse 4 veces seguidas.\2
esa expresión regular final? ¿Seguramente el segundo grupo es una afirmación de ancho cero?REBELDE -
154110103Esta 'función' acepta la entrada de stdin y envía resultados a stdout.
Pruebas de ejecución (para que no tenga que instalar el intérprete):
fuente
JavaScript (124)
Ejecutar en Firefox
fuente
GolfScript, 46 caracteres
Como de costumbre, lee la entrada de stdin, imprime en stdout. Ver demostración en línea (con entrada enlatada).
Tenga en cuenta que este código se basa en una interpretación muy estricta de la especificación de entrada (solo letras minúsculas y espacios): en particular, cualquier nueva línea en la entrada lo bloqueará. Este problema se puede solucionar, a costa de dos caracteres adicionales, anteponiendo
n-
al código para filtrar cualquier nueva línea.fuente
C ++ - 365 caracteres sin
int main(){}
Utiliza el mismo razonamiento que mi respuesta aquí , solo usando
for
bucles para generar cada letra el número apropiado de veces.fuente
s[i]==32
lugar des[i]==' '
. El valor ASCII del espacio es 32.Perl - 107
110Aquí está mi solución anterior en
120128130155:Pruebas:
fuente
VBA
220253/258/219Sin contar
Function
líneas aquí:Con
String
, 253 :Con un
For
bucle 258 :Se agregaron correcciones para la clave 7/9 (gracias, Danny), que agregó muchos caracteres.
Usando
Choose
219 :No quería correr con este, ya que es más básico en funcionalidad, pero es el código más corto ...
fuente
yes
debería ser999337777
. Me pongo a10338
usar tu función.C,
165 163 153 149138 caracteresMi primer intento de golf de código, cualquier sugerencia es apreciada.
fuente
C ++ -
170168160Golfizado:
Sin golf
fuente
C: 136 caracteres
Y un poco descuidado (sí, así es como se escribió):
Podría reducirlo un poco aplicando algo de recursión, magia negra y una buena cantidad de chile en polvo.
fuente
Java - 243
Solución bastante ingenua de Java. Gracias a los comentaristas por sus sugerencias.
Se corrigió un error que a veces insertaba espacios innecesarios, por ejemplo, para la entrada "hello worlds sup".
fuente
java
. ¿Puedes poner eso en tu título, como hacen las otras respuestas?t.length
con10
i
solo se usa para iterarString
, eliminarlo y hacer un ciclo foreach:for(char c:s.toCharArray())
if(c==' '){o+='0';continue;}
deif(c==' ')o+='0';else{
y añadir la adecuada}
.CoffeeScript - 202 (210 - 8)
fuente
APL, 77 caracteres
Explicación
2+⌊y←7.99,⍨.315×⍳25
o, sin golf,y←(0.315×⍳25),7.99 ◇ 2+⌊y
muestrea una línea inclinada adecuadamente (y = 0.315 x) en los puntos del 1 al 25; la línea está inclinada de tal manera que el piso de estos valores y sigue el patrón repetitivo 000111 ... 777, excepto el sexto grupo de dígitos 5555; se agrega un número al final para obtener el cuarto 7, de modo que la matriz final más 2 es 22233344455566677778889999;⌈3.1×y-⌊y
amplifica la diferencia entre esos valores y y sus pisos, de modo que los límites máximos de las diferencias dan el patrón 123123 ... con un 4 en los últimos dígitos de los dos grupos de 4 dígitos;'0',⍨( ... )/¨⍕¨ ...
o(( ... ) /¨ ⍕¨ ...),'0'
utiliza el último resultado para duplicar dígitos del primero, de modo que la salida es la matriz de cadenas "2" "22" "222" "3" "33" "333" ... con el "7777" correcto y " 9999 "en su lugar y un" 0 "agregado al final;⍵⍳⍨⎕UCS 96+⍳26
o(⎕UCS 96+⍳26)⍳⍵
calcula el índice de cada carácter de entrada, donde "a" es 1, "z" es 26 y el espacio (y todos los demás caracteres) es 27;{ ... }/( ... )[ ... ]
toma el último resultado, el índice de cada carácter de entrada, para traducir cada carácter a la cadena de dígitos correspondiente, luego concatena las cadenas utilizando la función entre llaves;{⍵,⍨⍺,''↑⍨=/↑¨⍺⍵}
o{(⍺,(=/↑¨⍺,⍵)↑''),⍵}
agrega cada nueva cadena ⍺ al acumulador ⍵, interponiendo un solo espacio solo si ambos argumentos comienzan con el mismo carácter.Ejemplos
fuente
Python
155150Desearía ser mejor en este XD. Definición de función no contada. El primer nivel de sangría es un espacio, el segundo es una pestaña y el tercero 2 pestañas.
fuente
JavaScript 234
for(l=-1,r="",I=0,y=(s=prompt()).length;I<y;I++){c=s[I];n="";d=c.charCodeAt(0)-96;if(0>d)n=0;else for(k=J=0;J<8;k=++J){v="33333434"[k];if(d<=v){for(x=K=0;0<=d?K<d:K>d;x=0<=d?++K:--K)n+=k+2;break}d-=v}r+=n[0]==l[0]?" "+n:n;l=n}alert(r)
fuente
R 224
Estoy seguro de que hay una mejor manera de hacerlo, así que seguiré trabajando en ello.
fuente