En los días de tus abuelos, marcar un número de teléfono se hacía con un dial giratorio como este:
Para marcar cada dígito, coloque el dedo en el orificio correspondiente, tírelo hasta el tope y suéltelo. Un mecanismo hará que el dial gire nuevamente a su posición de reposo, y el teléfono se desconectará y volverá a conectar un circuito un número específico de veces, haciendo clics audibles.
Marcar el dígito N requiere N de tales "pulsos", excepto por N = 0 que es diez pulsos.
Los teléfonos rotativos tienen la propiedad de que los dígitos grandes (8, 9, 0) tardan más en marcarse que los dígitos pequeños (1, 2, 3). Esta fue una consideración importante en la elaboración de mapas de códigos de área tempranos, y por qué la ciudad de Nueva York con su densidad de población (y línea telefónica) recibió 212 (solo 5 pulsos), mientras que 907 (26 pulsos) fueron a Alaska escasamente habitada. Por supuesto, todo esto se volvió irrelevante cuando la marcación por tonos se hizo popular.
El reto
Escriba, en la menor cantidad de bytes posible, un programa o función que tome como entrada una cadena (o secuencia de caracteres) que contenga un número de teléfono y genere su número de pulsos de marcación giratoria. Estos deben contarse de la siguiente manera:
Dígitos
- Los dígitos 1-9 cuentan como ese número de pulsos.
- El dígito 0 cuenta como 10 pulsos.
Letras
Tenga en cuenta que los dígitos 2-9 en el dial tienen letras del alfabeto latino asociado con ellos. Originalmente estaban destinados a intercambios con nombre , pero posteriormente se reapropiaron para palabras telefónicas y para sistemas de entrada de mensajes de texto.
Debe admitir tener letras en sus números de teléfono, utilizando la asignación E.161 de letras a dígitos:
- A, B, C = 2
- D, E, F = 3
- G, H, I = 4
- J, K, L = 5
- M, N, O = 6
- P, Q, R, S = 7
- T, U, V = 8
- W, X, Y, Z = 9
Puede suponer que la entrada ya se ha plegado a mayúsculas o minúsculas.
Otros personajes
Usted debe permitir el uso arbitrario de los personajes ()+-./
y el espacio como separadores de formato. Usted puede elegir para permitir que cualquier carácter no alfanumérico para este propósito, si es más fácil de implementar.
Estos caracteres no contribuyen al conteo de pulsos.
Código de ejemplo
Una tabla y función de búsqueda sin golf en Python:
PULSES = {
'1': 1,
'2': 2, 'A': 2, 'B': 2, 'C': 2,
'3': 3, 'D': 3, 'E': 3, 'F': 3,
'4': 4, 'G': 4, 'H': 4, 'I': 4,
'5': 5, 'J': 5, 'K': 5, 'L': 5,
'6': 6, 'M': 6, 'N': 6, 'O': 6,
'7': 7, 'P': 7, 'Q': 7, 'R': 7, 'S': 7,
'8': 8, 'T': 8, 'U': 8, 'V': 8,
'9': 9, 'W': 9, 'X': 9, 'Y': 9, 'Z': 9,
'0': 10
}
def pulse_count(phone_num):
return sum(PULSES.get(digit, 0) for digit in phone_num)
Ejemplo de entrada y salida
911
→ 11867-5309
→ 48713 555 0123
→ 42+1 (212) PE6-5000
→ 571-800-FLOWERS
→ 69PUZZLES
→ 48
+- ()*#.
) al igual que las letras están en mayúsculas. Corrígeme si me equivoco.*
y#
, que tienen significados especiales en los teléfonos de tonos y no se pueden marcar en los rotativos.Respuestas:
05AB1E ,
19181715 bytesPruébalo en línea!
Esta es la primera respuesta para usar π. ¿Por qué usar π, podrías preguntar? Bueno, las cartas están asociados con 22233344455566677778889999, en orden. Observe cómo la mayoría de los dígitos se repiten 3 veces, sino hasta 7 repeticiones 4 veces. Se puede decir que cada uno repite dígito (3 + 1/7) veces, en promedio. Me pregunto si hay cualquier cantidad que es aproximadamente un 3 + 1/7 y tiene un menor número de bytes de 22/7 ...
Esto sólo da 4 7s, no es un 4 9s, por lo que todavía necesita manejar Z como un caso especial.
fuente
"abcdefghijklmnopqrstuvwxyz"
, pero no para"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
. Podría convertir el alfabeto a mayúsculas en lugar de convertir la entrada a minúsculas, pero ese es el mismo bytecount.C # (compilador interactivo de Visual C #) , 51 bytes
Guardado 1 byte gracias a @recursive
Se guardaron 10 bytes gracias a la observación de @ ExpiredData que solo
() +-/.
estará en la entradaPruébalo en línea!
fuente
-10
es decir~9
, que debería funcionar en contexto.APL (Dyalog Unicode) , 27 bytes SBCS de
Función de prefijo tácito anónimo.
Pruébalo en línea!
(
…)∘⍳
Encuentre el ɩ ndex * de cada carácter en la siguiente cadena:* elementos que no se encuentran, obtenga el índice 1 + el índice máximo, es decir, 11
⎕D
dígitos:"0123456789"
1⌽
gire cíclicamente un paso hacia la izquierda;"1234567890"
11|
resto de la división cuando se divide por 11 ** esto da 0 para todos los no-dígitos
...
+
agregue eso a lo siguiente:'@ADGJMPTW'∘⍸
el ter nterval ɩ ndex * para cada carácter* Entonces [−∞, "@") da 0, ["@", "A") da 1, ["A", "D") da 2, etc.
+/
suma quefuente
Python 2 , 74 bytes
Pruébalo en línea!
Hace algo de aritmética en el valor ASCII para cada carácter. La primera opción busca letras y la segunda opción busca números. La aclaración de que todos los caracteres de puntuación permitidos en la entrada son aquellos con valores ASCII inferiores a 48 me permite simplificar la lógica, pero un nuevo método podría ser mejor.
Python 2 , 84 bytes
Pruébalo en línea!
Utiliza una cadena de búsqueda codificada, con cada bloque de 5 caracteres correspondiente a los caracteres que dan cada valor comenzando con 1. Los espacios en blanco se rellenan con
x
, que no pueden estar en la entrada que está en mayúscula. Afortunadamente, los caracteres que no aparecen en la cadena producen-1
el.find
que da un sumando de cero.fuente
JavaScript (Node.js) , ...
7669 bytesPruébalo en línea!
-7 gracias @Arnauld!
Explicación
Todos
[space]().+-/
no son capturados por/\w/g
, por lo que no afectarán el total.fuente
Perl 5
-p
,5251 bytes@Grimy obtiene crédito por -1
Pruébalo en línea!
fuente
/\d/g
debe ser/./g
para -1 (sí, todavía maneja la puntuación correctamente).J , 39 bytes
Pruébalo en línea!
Un puerto de la solución APL de Adám
fuente
Retina 0.8.2 , 34 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Explicación:
Convierte las letras
WTPMJGDA
a los dígitos9..0
.Mezcle todas las letras restantes hacia abajo en 1 y repita hasta que todas las letras se hayan convertido a dígitos.
Reemplace
0
con55
ya que toman el mismo número de pulsos para marcar.Toma la suma digital.
fuente
K4 , 44 bytes
Solución:
Ejemplos:
Explicación:
Enfoque ingenuo, probablemente bastante golfable. Índice de búsqueda del personaje, puntaje de búsqueda, suma.
fuente
Perl 6 , 53 bytes
Pruébalo en línea!
Multiplica el código ASCII con 0.313 en lugar de 1/3 y usa OR bit a bit que se redondea a cero para obtener el sesgo correcto .
fuente
C (gcc) ,
94898680 bytesGracias a ceilingcat, nwellnhof y Rogem por las sugerencias.
Pruébalo en línea!
fuente
c<43U
lugar dec-17<26U
Bash , 256 bytes
Puede reemplazar las
(( … ))
construcciones conlet
un conteo de bytes idéntico. Puede haber un buen algoritmo para reducir las declaraciones de casos, pero no lo hemos encontrado hasta ahora. Con un poco de trabajo adicional, también podría convertirlo en una función (pero no en los mismos bytes o menos, a menos que pueda descontar elfunction fname { … }
parte superior y la cola).Pruébalo en línea!
Una mejor solución usando la técnica del mapa de caracteres hace uso del
tr
herramienta:[Bash con tr], 173 bytes
Pruébalo en línea!
fuente
while((${#p}))
funciona, ahorrando tres bytes.c=${p:0:1};case c in ([0-9]) ((d+=c?c:10));;
ahorra otros 16. Con eltr -dc 0-9
agregado a la tubería tr no necesita una declaración de caso en absoluto y la adición se puede plegar en lawhile
condición con&&
.read p;p=$(echo $p|tr A-Z 22233344455566677778889999|tr -dc [0-9]);while ((${#p}));do c=${p:0:1}&&((d+=c?c:10));p=${p#?};done;echo $d
p=$(head -1|tr A-Z 22233344455566677778889|tr -dc 0-9);while((${#p}));do((d+=(c=${p:0:1})?c:10));p=${p#?};done;echo $d
.. los últimos tres 9 no son necesarios porque tr reutilizará el último carácter de reemplazo si el segundo argumento es demasiado corto.read p;while((${#p}>0));do case ${p:0:1} in ([1-9])((d+=${p:0:1}));;([0])((d+=10));;([ABC)((d+=2));;([P-S])((d+=7));;([W-Z])((d+=9));;([DEF])((d+=3));;([GHI])((d+=4));;([JKL])((d+=5));;([MNO])((d+=6));;(?)d=$d;esac;p=${p#?};done;echo $d
Jalea ,
3324 bytesPruébalo en línea!
Un enlace monádico que toma una cadena como argumento y devuelve el número de pulsos. Reescrito inspirado por la respuesta 05AB1E de @ Grimy, ¡ así que asegúrese de votarlos!
fuente
PowerShell ,
10910287 bytesPruébalo en línea!
EDITAR: Usé la idea de @ mazzy para un cambio de expresiones regulares con algún formato de cadena para emitir char -> int -> cadena y tomar solo el primer 'dígito'
Original:
Esperaba obtener <100 bytes, así que lo seguiré viendo para ver si hay algo más que pueda hacer. Probablemente hay una manera de eliminar la cadena de números
Lo siento si esto es confuso ya que anidé matrices con sentencias de indexación booleanas pero -
Explicación:
[char[]]"$args"|%{
lee la entrada convertida como una cadena y luego la explota en una matriz de caracteres y comienza un bucle for-each con la comprobación()[$_-gt47]
para ver si()+-./
se ingresó (todos tienen valores de caracteres ascii <48)Nota: Powershell acepta
$true
y$false
como1
y0
respectivamente para los índices de matrizLuego obtenemos
48
los símbolos o:('22233344455566677778889999'[$_-65],(58,$_)[$_-ne48])[$_-lt64]
Los
[$_-lt64]
cheques para un número o una letra (todo el capital asumido aquí). Si es una letra,'22233344455566677778889999'[$_-65]
cámbiela a 0-25 para indexarla en la matriz y generar el valor del pulso (como un carácter). Si el carácter es un número, en cambio miramos:(58,$_)[$_-ne48]
verificar0
y generar58
o solo el carácter numérico en sí.Alrededor de todo, se
$a+= ... -=48
inicializa una variable numérica $ a at0
y luego se agrega la salida. La salida es el valor ascii char de un número, así que reste48
.Nota: si la entrada fue un símbolo, obtenemos
$a+=48-48
, ignorándolo efectivamente. Si fuera así0
, obtenemos$a+=58-48
obtendremos nuestro +10Por último,
;$a
solo muestra nuestro valor final para cada ciclofuente
=
restos de mis métodos anteriores para resolver esto, ¡gracias por la captura! Sin embargo, no he visto lot*y
anterior, ¿podría explicar por qué funciona explotar la cadena en una matriz de caracteres?-f
y[0]
.PowerShell ,
958579 bytesinspirado en la respuesta de nwellnhof .
inspirado en la respuesta
[0]
de Sinusoid .Pruébalo en línea!
Versión desenrollada:
fuente
Stax , 21 bytes
Ejecutar y depurarlo
fuente
Kotlin , 113 bytes
Pruébalo en línea!
fuente
Python 3 ,
134123 bytesPruébalo en línea!
-11 bytes gracias a @ dan04
fuente
'ADGJMPTWBEHKNQUXCFILNRVYSZ'
, puede reducir la cadena de números a'23456789'*3+'79'
.