Todos estamos acostumbrados al teclado del teléfono de la vieja escuela, ¿verdad? Como referencia, así es como se ve:
Dada una Cadena que consiste solo en letras minúsculas ASCII y espacios individuales , su tarea es devolver el número de toques que uno debe hacer para escribir la Cadena completa con un teclado de teléfono como el de arriba.
Para aquellos que no están familiarizados con esto, así es como funciona:
La clave con el dígito
2
, por ejemplo, también tiene la cadenaabc
escrita en ella. Para escribira
, debe presionar esta tecla una vez, parab
presionar dos veces y parac
presionar tres veces.Para letras consecutivas que están en la misma tecla, debe esperar 1 segundo antes de presionar nuevamente. Por lo tanto, si desea escribir
cb
, debe presionar 3 veces parac
, esperar un segundo y luego presionar dos veces parab
, así que todavía 5 toques.Lo mismo se aplica para todas las demás teclas, excepto para un solo espacio, que solo requiere 1 pulsación. También tenga en cuenta que las teclas
7
y9
tienen cuatro letras en ellas. Se aplica el mismo algoritmo, la única diferencia es el número de letras. Las cadenas correspondientes a cada tecla se pueden encontrar en la imagen de arriba (pero en minúsculas), o en la siguiente lista, que contiene todos los caracteres que puede recibir:"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz", " "
Casos de prueba
Entrada -> Salida (Explicación) "" -> 0 (no se debe tocar nada) "agua" -> 8 ("w, a, t" cada uno requiere 1 toque (en las teclas 9, 2 y 8), "e" requiere 2 toques (en la tecla 3), "r" requiere 3 toques (en la tecla 7 ), 1 + 1 + 1 + 2 + 3 = 8) "jabón" -> 9 (4 + 3 + 1 + 1) "candela" -> 13 (3 + 1 + 2 + 1 + 2 + 3 + 1) "código golf" -> 20 (3 + 3 + 1 + 2 + 1 (para el espacio) + 1 + 3 + 3 + 3) "rey de la colina" -> 33 (2 + 3 + 2 + 1 + 1 + 3 + 3 + 1 + 1 + 2 + 2 + 1 + 2 + 3 + 3 + 3)
Especificaciones
Se aplican las reglas estándar de E / S y las lagunas predeterminadas.
Solo puede ingresar datos en el tipo de cadena nativo de su idioma. La salida puede ser un entero o una representación de cadena de ese entero.
Este es el código de golf , gana la respuesta más corta en todos los idiomas .
Respuestas:
JavaScript (ES6)
77666460 bytes(Ahorré algunos bytes gracias a @Johan Karlsson y @Arnauld).
Mostrar fragmento de código
fuente
(s,t=0)=>[...s].map(l=>t+=(1+'behknquxcfilorvysz'.indexOf(l)/8|0)+1)&&t
por 71 bytesf=s=>[...s].map(c=>t+=((c=parseInt(0+c,36))>23?c+3:c&&~-c%3)%7%4+1,t=0)|t
.05AB1E ,
292625 bytesPruébalo en línea!
Explicación
fuente
Python 2 , 56 bytes
Utiliza el mismo algoritmo que la solución Javascript de @ RickHitchcock
Pruébalo en línea!
fuente
'...'.find(c)
devuelve-1
. Al sumar 2 obtenemos una pulsación de tecla.-1
, pero no me di cuenta de que tenías una+2
placa posterior ... De todos modos, la solución Python más corta con diferencia.Python 3 ,
69676564 bytes1 byte gracias al Sr. Xcoder.
1 byte gracias a Felipe Nardi Batista.
Pruébalo en línea!
fuente
i==" "
coni<"a"
, porque solo recibe letras y espaciosDyalog APL, 37 bytes
Pruébalo en línea!
¿Cómo?
Obtenga el
⍳
ndex de cada carácter de la entrada en la cadena'adgjmptw behknqux~cfilorvy~'
(s
y elz
valor predeterminado será 28), divida por 9, redondee y sume.fuente
'adgjmptw ' 'behknqux' 'cfilorvy' 'sz'
para guardar algunos bytesf←
por lo que son 47 bytesJavaScript (ES6), 71 bytes
¡No busques tablas de cartas! No entendía bien la fórmula de @ LeakyNun, así que se me ocurrió la mía.
fuente
s=>[...s]
por qué no solo?s=>s.map()...
s
es una cadena, por lo que no puedemap
hacerlo directamente....s
itera sobres
, mientras[...s]
convierte la iteración en una matriz, dividiéndose efectivamentes
en una matriz de caracteres.DO,
211196 bytesLa primera presentación aquí ... parece bastante larga y veo que este no es un enfoque eficiente, pero al menos funciona :)
Versión sin golf:
fuente
*(k+i)
puede serk[i]
.*
(pchar*n
. Ej. ), Y agregar sus declaraciones a sufor
declaración vacía (en lugar deint s=0,j=0;(for(;
lo que tendríafor(int s=0,k=0;
) y en lugar dei==0
usar!i
s
en el bucle for porque lo uso más adelante, pero puse lasint
declaraciones juntas y usé asignaciones donde las necesitaba.Haskell -
747162 bytesEditar: eliminó 3 bytes usando una lista de comprensión en lugar de filtro
Editar: ¡Ahorre 9 bytes gracias a Siracusa, Laikoni y Zgarb!
Uso
Pruébalo en línea!
fuente
f
enf=length.(=<<)(\x->x:[y|y<-l,y==x])
, donde(=<<)
estáconcatMap
aquí.filter
:f=length.(=<<)(\x->x:filter(==x)l)
l
solo una vez, puede estar en línea.Jalea , 25 bytes
Pruébalo en línea!
fuente
Clojure,
8276 bytesOh, es más simple de usar
filter
ycount
de usarfrequencies
. Original:La cadena codifica cuántas veces más que solo una vez necesita presionar la tecla para un carácter dado :)
fuente
Python 3 , 91 bytes
Pruébalo en línea!
fuente
Python 3 , 60 bytes
Probablemente subóptimo, ya que este es mi primer golf en Python.
Pruébalo en línea!
fuente
Retina ,
4636 bytesGracias a CalculatorFeline por guardar 6 bytes.
Pruébalo en línea!
fuente
Java,
9573 bytesGracias a Kevin Cruijssen por hacer de la función una expresión lambda (donde
a
es de tipoString
). ¡95 bytes se convirtieron en 73 bytes!Una expresión lambda resume el recuento de prensa de cada carácter usando
map()
.map()
convierte cada carácter (ASCII en el rango caso inferior es 97-122) en la corriente en el valor adecuado (se parece a la onda de sierra simple, pero teniendo en cuenta tanto 4 ciclos es molesto) usando este matemáticas:1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)
. Aquí hay un gráfico desmos de ese modelo.fuente
interface Z{static void main(String a){System.out.print(a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum());}}
a->{return a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum();}
está permitido. Y dado que es una declaración de devolución única,a->a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum()
( 73 bytes ) sería su respuesta. Además, aquí hay un enlace TryItOnline de su respuesta que quizás desee agregar a su respuesta. Nuevamente: bienvenido y buena respuesta. +1 de mi partef=
ni el punto y coma principal;
. Y tampoco tiene que agregar el tipo de parámetro siempre que mencione cuál es el tipo (por lo que en lugar de(String a)->
usarloa->
y mencionar que la entradaa
es unString
en su respuesta). Ah, y Consejos para jugar al golf en Java y Consejos para jugar al golf en <todos los idiomas> pueden ser interesantes de leer, en caso de que aún no lo haya hecho.Mathematica, 83 bytes
fuente
a
falta al comienzo de"bc1..."
?)QBIC , 94 bytes
Explicación
fuente
Bash ,
6968 bytesPruébalo en línea!
Dobla un carácter por línea, translitera cada nueva línea con
+
, cada espacio con1
y cada letra con el número correspondiente de pulsaciones. bc hace la suma.fuente
bc <(fold -1|tr "\n "adgjmptwbehknquxcfilorvysz +[1*9][2*8][3*8]44;echo 0)
C,
9288 bytesfuente
s=n
para reemplazarreturn n
y combinars++;
conc=*s
. Podría ser 9 bytes más corto.s=n
no funcionaría, ya ques
es un local. Y*s=n
no funcionaría ya que solo hayCHAR_BIT
bits*s
, lo que no sería suficiente para algunos mensajes. Pero tienes razón sobre els++
. Gracias.APL (Dyalog) , 36 bytes
Pruébalo en línea!
Encuentra el mod 3-índices en el alfabeto sin S y Z . Como el espacio, S y Z no se encuentran, "tienen" el índice 25 (uno más que el índice máximo), lo cual es bueno para el espacio. A continuación, sólo tenemos que añadir 3 para cada S o Z .
{
función anónima donde el argumento está representado por ⍵ :⎕A~'SZ'
el alfabeto en mayúscula A , excepto S y Z819⌶
minúsculas⍵⍳⍨
los ɩ nices del argumento en ese¯1+
agregar uno negativo3|
mod-31+
agregue uno (esto convierte todos los 0-mods a 3)(
...),
anteponer:⍵∊'sz'
Booleano donde el argumento es o s o z3×
multiplicar por 3+/
sumafuente
C (gcc) , 75
77bytesLa cadena no imprimible
""
es una tabla de04 01 02 03 01 02 03 04
.Pruébalo en línea!
fuente
Pip ,
10090 bytesVerifique cada carácter de la entrada para una coincidencia en cada elemento de b. El índice de esa coincidencia más 1 se agrega al total.
Pruébalo en línea!
fuente