Gol
Escriba un programa o función que traduzca un número de teléfono numérico en texto que lo haga fácil de decir. Cuando se repiten los dígitos, deben leerse como "doble n" o "triple n".
Requisitos
Entrada
Una cadena de dígitos.
- Suponga que todos los caracteres son dígitos del 0 al 9.
- Suponga que la cadena contiene al menos un carácter.
Salida
Palabras, separadas por espacios, de cómo estos dígitos pueden leerse en voz alta.
Traducir dígitos a palabras:
0 "oh"
1 "uno"
2 "dos"
3 "tres"
4 "cuatro"
5 "cinco"
6 "seis"
7 "siete"
8 "ocho"
9 "nueve"Cuando el mismo dígito se repite dos veces seguidas, escriba " número doble ".
- Cuando el mismo dígito se repite tres veces seguidas, escriba " número triple ".
- Cuando el mismo dígito se repite cuatro o más veces, escriba " número doble " para los primeros dos dígitos y evalúe el resto de la cadena.
- Hay exactamente un carácter de espacio entre cada palabra. Un único espacio inicial o final es aceptable.
- La salida no distingue entre mayúsculas y minúsculas.
Tanteo
Código fuente con la menor cantidad de bytes.
Casos de prueba
input output
-------------------
0123 oh one two three
4554554 four double five four double five four
000 triple oh
00000 double oh triple oh
66667888 double six double six seven triple eight
19999999179 one double nine double nine triple nine one seven nine
code-golf
kolmogorov-complexity
Hand-E-Food
fuente
fuente
Respuestas:
05AB1E ,
5352515049 bytesPruébalo en línea!
Explicación:
fuente
M
también mira dentro de las listas al determinar el número entero máximo en la pila? No lo sabia. Suena como algo para recordar. :)8088 Assembly, IBM PC DOS,
164159156155 bytesBinario:
Construya y pruebe el ejecutable usando
xxd -r
desde arriba, o descargue PHONE.COM .Listado sin ensamblar:
TL; DR:
La cadena de entrada se lee de derecha a izquierda para que sea más fácil encontrar un triple. La salida se inserta en la pila x86 para simplificar la inversión del orden de visualización y también facilita la reorganización de las palabras "doble" y "triple" para preceder al nombre del dígito.
Si el siguiente dígito es diferente al último, el nombre se busca en la lista de palabras y se pasa a la pila. Como no hay un concepto formal de una "matriz indexada de cadenas de longitud variable" en el código de máquina, la lista de palabras se escanea
i
(el índice de la palabra) varias veces para que el delimitador de cadena ($
) encuentre la palabra correspondiente. Con ayuda, x86 tiene un par de instrucciones cortas (REPNZ SCASB
que es similar a lamemchr()
de C), que simplifica esto (¡gracias CISC !).Si el dígito es el mismo que el anterior, el contador para la duración de una "ejecución" se incrementa y continúa girando hacia la izquierda en la entrada. Una vez que finaliza la ejecución, el nombre del dígito se toma de la pila, ya que deberá colocarse después del "doble" o "triple" para cada grupo. Si la longitud de la ejecución es impar (y la longitud de la ejecución es
> 1
), el nombre del dígito seguido de la cadena "triple" se empuja a la pila y la longitud de la ejecución se reduce en 3. Dado que la longitud de la ejecución ahora será par, el paso se repite para "doble" hasta que la longitud de ejecución es 0.Cuando la cadena de entrada ha llegado al final, la pila se descarga con cada cadena guardada escrita en la pantalla en orden inverso.
E / S:
Un ejecutable independiente de PC DOS, entrada desde la salida de línea de comandos a la consola.
Descargue y pruebe PHONE.COM .
fuente
repne scasb
esmemchr
(ostrchr
si sabes que va a haber un éxito), nostrstr
.mov cl, byte[si]
es equivalente amovzx cx, byte [si]
. Me pregunto si usar un registro diferente, comoAH
, para el conteo endec ah / jnz
lugar deloop
ahorraría algo de no tener que presionar / hacer estallar CX. Probablemente no, y no le quedan registros de 16 bits que permitan 1 bytedec
.CH=0
ir por fysnet.net/yourhelp.htm , que para cualquier versión razonable de DOS siempre se pone a cero, lo mismo conBX
. Bien pensado sobre la extensión ceromov
, aunque técnicamente no creo quemovzx
esté disponible en el 808x (manteniendo la plataforma de destino como una PC 5150 de IBM y todo). Jugueteé con todos los registros lo mejor que pude para guardar los bytes, pero si ves algo que probablemente me perdí, ¡házmelo saber!memchr
IMO. El nombre de "instrucción de cadena" induce a error a las personas a pensar que trabajan en cadenas C de longitud implícita, pero realmente funcionan en cadenas de longitud explícita comostd::string
o buffers. Comomemcpy
,memset
(mov / stos),memchr
/memrchr
(repne scas con DF = 0 o 1), ymemcmp
(repe cmps). El único equivalente de Crepe scas
esstrspn
porque no creo que haya unamem
función para eso. Incluso puedes describirstosw
ostosd
comowmemset
por ejemplo.movzx
cuesta un byte de código de operación adicional, y sí, solo se introdujo con 386. Simplemente fue más fácil escribir para describir el hecho de que está haciendo una combinación de bajo byte y suponiendo que está correctamente extendido a cero. Si conoce CX o al menos CH = 0, entonces sí para jugar al golf siempre vayamov
a CL. Pero fuera del golf, las instrucciones de carga de bytes de x86 sonmovzx
ymovsx
: evitan cualquier dependencia falsa u otras travesuras de registro parcial. En las CPU modernas con un destino dword, son tan rápidas como semov
carga dword .05AB1E ,
6156535251 bytes-9 bytes gracias a @Grimy .
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
Vea esta sugerencia mía 05AB1E (sección ¿Cómo usar el diccionario? ) Para comprender por qué
… ‹¶½¿
es" double triple"
y“Šç€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“
es"oh two three four five six seven eight nine"
.fuente
if(length>=4)
antes de agregar el resto, pero por supuesto no es necesario para enteros de tamaño1,2,3
, porque;Å2¨3ª£
dejarán las cadenas intactas (simplemente envueltas en una lista que aplastamos después del mapa de todos modos). ¡Gracias por notarlo! Y esperando ver tu respuesta conÅγ
. De hecho, tuve la sensación de que la primera parte podría hacerse mucho más corta de alguna manera.Dg;LàäR
sigue siendo un byte más cortoāɨšJõK
y mucho más similar al que tenía originalmente.á
lugar deõK
al final. :)á
! Aquí hay un 51 y otro . 50 se siente posible.QuadR , SBCS de 137 bytes
Título de caso con un espacio principal.
Pruébalo en línea!
∊
ε nlist (aplanar)¯2↑¨
tomar los dos últimos caracteres (relleno a la izquierda con un espacio) de cada uno de los personajes@
en posiciones en las(∊∘⎕A)
los personajes son miembros de la mayúscula A lphabet⍵
en el resultado de la operación por debajo de PCRE reemplazar ...(.)
cualquier personaje\1
seguido por sí mismo*
cero o más veces, se reemplaza por el resultado de lo siguiente ...{…}⍵M
"dfn";⍵
es el M atch del patrón anterior('OhOneTwoThreeFourFiveSixSevenEightNine'(
...)⎕A)
Aplique la siguiente función tácita anónima con la cadena larga y el alfabeto A mayúscula como argumentos izquierdos:∊
membresía (de letras en la cadena larga en el alfabeto en mayúscula)⊂
particiones (con una nueva partición que comienza cada vez que es un miembro⊣
el argumento izquierdo (es decir, la cadena larga)(
...)⎕R
PCRE R eplace las siguientes pautas con estas palabras:⎕D
los dígitos del 0 al 9,¨
tratar cada uno como un patrón separado⍺←
asignar esta función de reemplazo a⍺
(para una alfabetización)⋄
luego,⊃⍵
el primer personaje del partido,
como una cuerda⍺
aplicar⍺
a ellaw←
asignar esto aw
(por palabra )' '∊
...:
si el espacio es un miembro del mismo (es decir, si la coincidencia estaba vacía):⍬
no devuelve nada (se convierte en la cadena vacía)⋄
más,1=≢⍵:
si uno es igual al recuento de caracteres en el partido (es decir, su longitud):⍺⍵
alfabetizar ese dígito⋄
más,3=≢⍵:
si tres es igual al recuento de caracteres en el partido (es decir, su longitud):'Triple',w
prepend "Triple" al w ord⋄
más,2↓⍵
caer a dígitos del partido∇
recurse en esow,
anteponer la palabra'Double',
anteponer "Doble"fuente
JavaScript (ES6),
161160152144bytesLa salida incluye un solo espacio inicial.
Pruébalo en línea!
o Ver el código fuente formateado
¿Cómo?
La conversión se procesa en tres pasos:
"X X"
con"double X"
"double X X"
con"triple X"
Para guardar bytes, usamos la misma expresión regular para todos los pasos:
que funciona de la siguiente manera:
En el paso 1, usamos una función de devolución de llamada que selecciona la palabra correcta de una tabla de búsqueda:
"799999"
→" seven nine nine nine nine nine"
En el paso 2, reemplazamos con
"$1 double$2"
:" (seven)( nine)( nine)"
→" seven double nine"
"( nine)( nine) nine"
→" double nine nine"
En el paso 3, reemplazamos con
"triple$2"
:" (double)( nine)( nine)"
→" triple nine"
fuente
Wolfram Language (Mathematica) , 115 bytes
Pruébalo en línea!
Toma una lista de dígitos como entrada. La salida incluye un espacio inicial.
fuente
Stax , 56 bytes
Ejecutar y depurarlo
fuente
Python 2 ,
171169168 bytesPruébalo en línea!
-1 byte, gracias a Jitse
fuente
1312
;)['','double ','triple '][n]
to' eellpbiurotd'[-n:0:-2]
for 168 bytes: Try it online!Perl 5
-p
, 111 bytesTry it online!
Explanation:
fuente
Scala, 213 bytes
Got it. Somehow the recursive version I was trying to build was strongly more verbose-y than this one (still recursive though, but only in one case). Function
f
takes as an input string the phone number and outputs its phonetics with a trailing whitespace.Try it online!
Edit : -8b thanks to DrY Wit!
Scala, 215 bytes
And here comes the leading whitespace version, two bytes longer for some reason (even with massive refactoring).
Try it online!
fuente
(o(0)+"").toInt
witho(0)-48
.PHP,
174169166159 bytesTry it online!
For each digit at index of
$i
starting from 0:$i
is equal to 3, prints'triple '
and adds 2 to$i
so next iteration will have 2 digits jumped over.$i
is equal to or more than 2 but is not 3, prints'double '
and adds 1 to$i
so next iteration will have 1 digit jumped over.$i++
.fuente
Retina 0.8.2, 105 bytes
Try it online! Outputs a leading space. Explanation: I originally tried a regex that automatically matches 2 or 3 digits but @Arnauld's approach of turned out to be golfier. Explanation:
Match pairs of identical digits and replace the first with a
=
. Then repeat, so that for an odd number the second last digit is also replaced with a=
.Space the digits (and
=
s) out.Handle the case of three identical digits.
Replace all remaining characters with words.
fuente
Jelly, 59 bytes
Try it online!
A monadic link that takes a string of digit characters as its argument and returns a Jelly string of space-separated words. When called as a full-program, outputs implicitly.
fuente
T-SQL 2017, 238 bytes
Added some linebreaks to make it readable
Try it online
fuente
C++, 382 bytes
It's not superclever, but someone needed to write a C++ version. The recursive function R goes through the input string and counts repeated values. If there are more than 3 repeats, it pretends there were 2 repeats, then rewinds and tries again.
A few more source chars could probably be squeezed out with
#define
major, but I'm sure a better algo could squeeze out more.and verification of test cases:
fuente
#include <sstream>
? Or could you move that down after the golfed part for the test function? I think typingstd::ostream&s
would take less space thanusing namespace std;
, unless there are other places where you'd need astd::
.Perl 6,
9693 bytesTry it online!
This is an anonymous code block that takes a number and returns a string with the numbers in uppercase, e.g.
0123 => oh ONE TWO THREE
with a single trailing space.This was deleted for a while until I found out how to use captures in a lookahead, but it should be fixed now.
fuente
Red, 242 bytes
Try it online!
fuente
Scala, 253 bytes
Try it online!
fuente
Oracle SQL, 578 bytes (in formatted form)
Solution is not concise by any means so posting it in formatted way.
Test in SQL*Plus
The main trick is that digits converted into words using Oracle format models instead of hard-coded literals "one" ... "nine".
fuente
union all
withselect regexp_replace(s,case when length(regexp_substr(s, '(.)(\1)+')) = 3 then '^...' else '^(.)\1|^.' end) from r
.JavaScript, 142 bytes
Try it online!
fuente
(Roblox) Lua 5.1, 166 bytes
Ensure
s
is a predefined string value populated only with digits; that will be the variable to be modified. The result will include a leading space[\u20]
character.fuente
s
to already have the input. Aside from that, you've got a good first post! I would recommend you include a link to an online testing site e.g. tio.run/#lua so that others can test your solution