Tarea
Dada una cadena de nombres en inglés de dígitos "colapsados" juntos, así:
zeronineoneoneeighttwoseventhreesixfourtwofive
Divide la cadena de nuevo en dígitos:
zero nine one one eight two seven three six four two five
Reglas
La entrada siempre es una cadena. Siempre consta de uno o más nombres de dígitos en minúscula en inglés, contraídos, y nada más.
- Los nombres de dígitos en inglés son
zero one two three four five six seven eight nine
.
- Los nombres de dígitos en inglés son
La salida puede ser una lista de cadenas o una nueva cadena donde los dígitos están delimitados por cadenas no alfabéticas y no vacías. (Su salida también puede tener opcionalmente tales cadenas al principio o al final, y los delimitadores no necesitan ser consistentes. Por lo tanto, incluso algo así
{{ zero0one$$two );
es una respuesta válida (si es absurda)zeroonetwo
).La respuesta más corta en bytes gana.
Casos de prueba
three -> three
eightsix -> eight six
fivefourseven -> five four seven
ninethreesixthree -> nine three six three
foursixeighttwofive -> four six eight two five
fivethreefivesixthreenineonesevenoneeight -> five three five six three nine one seven one eight
threesevensevensixninenineninefiveeighttwofiveeightsixthreeeight -> three seven seven six nine nine nine five eight two five eight six three eight
zeroonetwothreefourfivesixseveneightnine -> zero one two three four five six seven eight nine
Respuestas:
Retina , 20 bytes
Pruébalo en línea!
fuente
C (gcc) ,
89 80 76 75 72 71 7069 bytesPruébalo en línea!
(89) Crédito al gastropner por el hash XOR.
(76) Crédito a Toby Speight por la idea de usar 1st y 3rd.
(75) Crédito a Michael Dorgan por
'0'
→48
.(72) Crédito a Michael Dorgan y Lynn por literales con caracteres de control.
(69) Crédito a Lynn por
x?y:0
→x&&y
fuente
Python 2 , 50 bytes
Pruébalo en línea!
-3 gracias a Lynn .
-4 gracias a Uriel 's respuesta expresiones regulares' s.
fuente
import re;re.compile('…').findall
debería guardar un par de bytes. Esperaba que esto se convirtiera en regex golf :)Befunge,
87858176 bytesPruébalo en línea!
Befunge no tiene instrucciones de manipulación de cadenas, así que lo que hacemos es crear una especie de hash de los últimos tres caracteres encontrados, ya que los estamos procesando.
Este hash es esencialmente un número de tres dígitos, base 104. Cada vez que se lee un nuevo personaje, modificamos el hash con 104 2 para deshacernos del personaje más antiguo, lo multiplicamos por 104 para hacer espacio para el nuevo personaje, luego agregamos el valor ASCII del nuevo carácter 27 (para asegurarnos no se desborda).
Para fines de comparación, tomamos este valor mod 3817, lo escribimos en la memoria (truncando así a 8 bits), lo que da como resultado números más pequeños que son más fáciles de manejar para Befunge. Los hashes con los que tenemos que comparar son 0, 38, 59, 64, 88, 92, 114, 117 y 123. Si coincide con alguno de ellos, sabemos que hemos encontrado una secuencia de caracteres que marca el final de un número, por lo que generamos un espacio adicional y restablecemos el hash a cero.
Si se pregunta por qué la base 104, o por qué mod 3817, esos valores fueron elegidos cuidadosamente para que la lista de hash con la que necesitáramos comparar pudiera representarse en la menor cantidad de bytes posible.
fuente
Java (OpenJDK 8) ,
554643 bytesAhorro de 9 bytes gracias a Forty3 / FrownyFrog
Ahorrando 3 bytes gracias a Titus
Pruébalo en línea!
editar: ¡Gracias por la bienvenida y la explicación de lambdas!
fuente
g
sufijo regex en lugar deAll
).f=(s)=>
lugar des->
, que es 4 bytes más corto.C (gcc) ,
179159146139137116107103102 bytesEdición 1: (Sugerencias agregadas del Sr. Xcoder - ¡gracias! - Mi versión macro era del mismo tamaño que la tuya, pero me gusta más la tuya).
Edición 2: el carácter cambiado de char se compara con las llamadas a
strchr()
Edición 3: K & R's las declaraciones var (¡Eww!)
Edición 4: cuando 1 macro no es suficiente ...
Edición 5: rehecho con el nuevo algoritmo sugerido anteriormente. ¡Gracias a James Holderness por esta gran idea!
Edición 6: Se eliminó el conjunto 0, ya que parece ir allí automáticamente. Se utilizaron técnicas de golf de código de nivel maestro (comas, truco printf, etc.). ¡Gracias gastropner !
Edición 7: Usa memchr y reparó un error señalado por James Holderness .
Edición 7: Usar
&&
en la verificación final para reemplazar?
- gracias jxh .Pruébalo en línea!
No golf (que honestamente sigue siendo muy golfista ...)
Vieja y sencilla solución grep-esqe:
Versión antigua y más limpia.
Pruébalo en línea!
fuente
#define
ingputchar
y la eliminación de un par de soportes innecesarios.#define p putchar(
lugar (tenga en cuenta el paréntesis abierto).c,h=0;f(char*s){while(c=*s++)putchar(c),h=h%10816*104+c%27,c=h%3817,printf(" "+!(c&&strchr("&;@X\\ru{",c)));}
JavaScript
6657524441 bytess=>s.replace(/one|t[wh]|.i|[fsz]/g," $&")
Bastante ingenuo, pero funciona.
Buena captura de FrownyFrog para usar 2 caracteres ... a excepción de "uno" que un cheque puro de 2 caracteres podría estropear zeronine. Editar: el sencillo
f
ys
fueron buenas capturas de FrownyFrog que pasé por alto mis dos primeros campos de golf.Gracias, Neil, por la sugerencia de una lambda sin nombre y poder usar un solo carácter para
z
llegar a 52.Titus viene con un RegEx más pequeño. Siento que finalmente nos dirigimos hacia la expresión regular de Uriel.
fuente
z|tw|th|f|s|ei|ni|on
on|t[wh]|.i|[fsz]
(-4 bytes)on|
coincidirázeronine
zer onine
Retina ,
2423 bytesPruébalo en línea! Editar: guardado 1 byte gracias a @FrownyFrog.
fuente
.....
->.{5}
trabajar?C,
10399 bytesEsto funciona para cualquier codificación de caracteres (incluidos los incómodos como EBCDIC), ya que no utiliza el valor numérico de los caracteres de entrada. En cambio, localiza la primera y la tercera letra en una cadena mágica. La distancia entre estos indica cuántas letras avanzar con cada impresión.
Programa de prueba
fuente
J ,
3735 bytesPruébalo en línea!
fuente
f=:[:>'..[eox]|[tse]?....'&rxall
y funcionó en interpeter, pero no funciona en TIO.C (gcc) ,
106 bytes104 bytes-2 bytes gracias a @jxh
Pruébalo en línea!
XOR es verdaderamente nuestro mayor aliado.
fuente
s[1]
Será más corto.Retina , 28 bytes
Pruébalo en línea!
fuente
Pyth ,
35 2723 bytesAhorró muchos bytes al portar el enfoque de Uriel .
Pruébalo aquí! Acercamiento inicial.
fuente
Pip , 27 bytes
Toma entrada como argumento de línea de comando. Pruébalo en línea!
Reemplazo simple de expresiones regulares, inserta un espacio antes de cada partido de
[zfs]|one|[ent][iwh]
.Saltar al carro de
robarprestado La expresión regular de Uriel da 23 bytes (con-s
bandera):fuente
Jalea ,
2321 bytesUn programa completo que imprime la salida separada del avance de línea. Nota: una vez hecho, imprime repetidamente líneas vacías "para siempre" (hasta un límite de recursión enorme o una falla seg)
Pruébalo en línea! (La salida TIO se acumula, una implementación local imprimirá línea por línea)
¿Cómo?
Comenzando con una lista de caracteres, el programa repetidamente:
La longitud de la primera palabra se decide inspeccionando los primeros tres caracteres de la lista actual de caracteres (necesariamente parte de la primera palabra). El programa los convierte en ordinales, los multiplica, modula el resultado por 953, modulos que por siete, modulos que por tres y agrega tres:
fuente
C
168,145,144141 bytesEDITAR: Intenté init 'i' a 1 así
Para deshacerse del espacio en blanco
inicial , pero se rompe en la entrada comenzando con tres, siete u ocho
141
Pruébalo en línea
144
Pruébalo en línea
168
Pruébalo en línea!
Sin golf
int constantes se vuelve innecesariamente grande cambiando un << 8
pero en caso de que pueda compararse con las cadenas de alguna manera, debería ser lo más natural
146 Uso de la comparación de cadenas
Usando la comparación de cadenas
Ofuscado
fuente
Jalea , 44 bytes
Pruébalo en línea!
fuente
Una muy larga. Eres bienvenido a jugar golf.
R , 109 bytes
Pruébalo en línea!
fuente
intToUtf8
! Sería posible 90 bytes utilizando un enfoque diferente utilizando regexp:function(x,p=paste,z=p("(",p(c("zero",broman::numbers),collapse="|"),")"))gsub(z,"\\1 ",x)
Haskell , 81 bytes
Pruébalo en línea!
Explicación:
fuente
Python 3 (sin expresiones regulares) , 85 bytes
Pruébalo en línea!
fuente
while s[i:]
y luego puede reducirlo a 93 bytes enviando un recursivolambda
(las funciones solo necesitan devolver el resultado en lugar de imprimirlo ellos mismos).Excel, 181 bytes
Coloca un espacio frente a:
z
,on
,tw
,th
,f
,s
,ei
,ni
fuente
Conjunto Z80,
4645 bytes(Fue divertido adaptar la expresión regular fría de Uriel a un entorno poco amigable con la expresión regular).
fuente
Jalea ,
4039 bytesPruébalo en línea!
Cómo funciona
fuente
QuadS ,
2120 bytesPruébalo en línea!
Este es un puerto de mi respuesta de retina .
fuente
APL (Dyalog Unicode) , 25 bytes
Pruébalo en línea!
fuente
Python 3 , sin expresiones regulares,
83 68 6563 bytes-15 gracias a Lynn (refactorizar en una sola función)
-3 más gracias a Lynn (evitar indexar en una lista con más aritmética)
... lo que lleva a otro ahorro de 2 bytes (evitando paréntesis con módulos negativos) :)
Una función que imprime las palabras separadas por nuevas líneas y luego genera un
IndexError
.Pruébalo en línea! (suprime las excepciones para permitir múltiples ejecuciones dentro del conjunto de pruebas)
fuente
def f(s):h=[4,5,3][ord(s[0])*ord(s[1])%83%7%3];print(s[:h]);f(s[h:])
h(s)
yh(s)
cómo no me di cuenta? Gracias Lynn!h=(ord(s[0])*ord(s[1])%83%7+1)%3+3
son 65 bytes! :)Jalea , 36 bytes
Pruébalo en línea!
Algoritmo:
Apuesto a que podemos hacerlo aún mejor.
fuente
Mathematica, 125 bytes
Pruébalo en línea!
TIO genera un mensaje de error sobre "CountryData" (???)
No sé por qué sucede esto, pero todo funciona bien en Mathematica
fuente
Perl 6 ,
4230 bytesPruébalo
Pruébelo
(Traducido de otras respuestas)
fuente
q / kdb +,
5951 bytesSolución:
Ejemplo:
Explicación:
Solución rápida, probablemente enfoques mejores y más golfables.
Notas:
46 bytes con un juego de golf simple, reemplazando q llamadas por k unas, pero sigue siendo una solución considerable.
asc[(,/)x ss/:($)`z`one`tw`th`f`s`ei`ni]cut x:
fuente