Este desafío es similar a este otro , sin embargo, hice una restricción (ver texto en negrita a continuación) que creo que lo haría muy diferente y (espero) divertido.
El reto
Escriba un programa o una función en cualquier lenguaje de programación que tome como entrada el nombre en inglés de un entero positivo que n
no exceda 100
y regrese n
como un entero.
Las lagunas estándar están prohibidas y no puede utilizar ninguna función integrada, herramienta externa o biblioteca que ya haga este trabajo .
El código fuente más corto en bytes gana.
Prueba
Aquí todos los input->output
casos:
one -> 1
two -> 2
three -> 3
four -> 4
five -> 5
six -> 6
seven -> 7
eight -> 8
nine -> 9
ten -> 10
eleven -> 11
twelve -> 12
thirteen -> 13
fourteen -> 14
fifteen -> 15
sixteen -> 16
seventeen -> 17
eighteen -> 18
nineteen -> 19
twenty -> 20
twenty-one -> 21
twenty-two -> 22
twenty-three -> 23
twenty-four -> 24
twenty-five -> 25
twenty-six -> 26
twenty-seven -> 27
twenty-eight -> 28
twenty-nine -> 29
thirty -> 30
thirty-one -> 31
thirty-two -> 32
thirty-three -> 33
thirty-four -> 34
thirty-five -> 35
thirty-six -> 36
thirty-seven -> 37
thirty-eight -> 38
thirty-nine -> 39
forty -> 40
forty-one -> 41
forty-two -> 42
forty-three -> 43
forty-four -> 44
forty-five -> 45
forty-six -> 46
forty-seven -> 47
forty-eight -> 48
forty-nine -> 49
fifty -> 50
fifty-one -> 51
fifty-two -> 52
fifty-three -> 53
fifty-four -> 54
fifty-five -> 55
fifty-six -> 56
fifty-seven -> 57
fifty-eight -> 58
fifty-nine -> 59
sixty -> 60
sixty-one -> 61
sixty-two -> 62
sixty-three -> 63
sixty-four -> 64
sixty-five -> 65
sixty-six -> 66
sixty-seven -> 67
sixty-eight -> 68
sixty-nine -> 69
seventy -> 70
seventy-one -> 71
seventy-two -> 72
seventy-three -> 73
seventy-four -> 74
seventy-five -> 75
seventy-six -> 76
seventy-seven -> 77
seventy-eight -> 78
seventy-nine -> 79
eighty -> 80
eighty-one -> 81
eighty-two -> 82
eighty-three -> 83
eighty-four -> 84
eighty-five -> 85
eighty-six -> 86
eighty-seven -> 87
eighty-eight -> 88
eighty-nine -> 89
ninety -> 90
ninety-one -> 91
ninety-two -> 92
ninety-three -> 93
ninety-four -> 94
ninety-five -> 95
ninety-six -> 96
ninety-seven -> 97
ninety-eight -> 98
ninety-nine -> 99
one hundred -> 100
Respuestas:
C, 160 bytes
Pruébalo
Cómo funciona
Después de algunos intentos, me encontré con una función que asigna los números de "excepcionales"
one
,two
,three
,four
,five
,six
,seven
,eight
,nine
,ten
,eleven
,twelve
,thirteen
,fourteen
,fifteen
,sixteen
,seventeen
,eighteen
,nineteen
,twenty
,thirty
,forty
,fifty
,sixty
,seventy
,eighty
,ninety
,one hundred
, a los caracteres ASCII imprimiblesk
,.
,[
,<
,*
,,
c
,K
,w
,y
,e
,(
,S
,_
,-
,C
,)
,7
,=
,4
,&
,o
,]
,s
,Y
,g
,m
,N
, Respectivamente.Esta función es:
El programa de golf calcula la
hash
función de la entrada hasta que alcanza el final de la cadena o el carácter-
. Luego busca el hash en la cadenak.[<* cKwye(S_-C)7=4&o]sYgmN
y determina el número correspondiente. Si se alcanzó el final de la cadena de entrada, se devuelve el número, si en su lugar-
se alcanzó a, se devuelve el número más el resultado del programa de golf aplicado al resto de la cadena de entrada.fuente
JavaScript (ES6),
175166163156153147 bytesGuardado 7 bytes gracias a @Neil
Verifíquelo aquí:
Mostrar fragmento de código
Cómo funciona
La idea básica es dividir cada número en sus palabras de dígitos, luego asignar cada palabra al dígito correspondiente. Casi todas las palabras están configuradas para que coincidan correctamente con una expresión regular simple, pero hay algunas anomalías:
eleven
throughnineteen
: si la palabra contiene unel
, o ate
en el medio (para evitarten
), agregamos unon-
al principio, cambiándolos aon-eleven
travéson-nineteen
.twenty
,thirty
, Etc .: la sustitución de un arrastrey
con-d
cambios estos atwent-d
,thirt-d
, etc.Ahora nos dividimos en guiones, espacios y
dr
s. Esto divide todo de 11 a 99 en sus correspondientes palabras de dígitos, y"one hundred"
en[one,hun,ed]
. Luego mapeamos cada una de estas palabras a través de una matriz de expresiones regulares, y mantenemos el índice de la que coincide primero.Por ahora, cada entrada será la matriz de los dígitos adecuados. Todo lo que tenemos que hacer es unirnos a ellos
join``
, convertirlos en un número con unario+
y listo.fuente
.findIndex(y=>x.match(y))
funcionareplace
.sh + coreutils, 112 bytes
Se puede ejecutar en todos los casos de prueba a la vez, uno por línea.
Explicación
El backticked
awk
evalúa elsed
guiónque transforma partes de números en su representación numérica.
Las líneas adicionales del script sed
cuidar de
-ty
s yone hundred
.Finalmente, elimine los
+
s iniciales y todo lo que no sea+
,*
o un dígito.Solo quedan expresiones matemáticas
y se pueden verter en
bc
.fuente
Pyth,
79767568 bytesGracias a @ETHproductions por 7 bytes.
Básicamente, primero verifica el caso de la esquina de 100, luego usa una matriz de las dos primeras letras de los números del 0 al 11 para determinar la semántica de la entrada y modificar el valor de acuerdo con el sufijo ("-ty" y "-teen"; " lv "en 12 es otro caso de esquina). Primero divide la entrada en una lista de palabras, luego asigna cada una a un valor y las resume.
En pseudocódigo pitónico:
Banco de pruebas
Python 3, 218 bytes
Básicamente idéntico a la respuesta de Pyth.
Sin relación:
Acabo de descubrir una versión significativa de la respuesta a la vida, el universo y todo: son ramitas sedientas de té. ¡Guau, ramitas que anhelan el té! No estoy seguro de cuántas otras respuestas hacen esto, pero para mi respuesta si la entrada es "ramitas sedientas de té", la salida es 42.
fuente
"ontwthfofisiseeiniteel"
en este programa.Python 3,
365361310303 caracteresGolfed
Sin golf
fuente
n="one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen,twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,one hundred".split(",")
pero como veo, debería funcionar sin asignarlo a la variable n, solo invoca.index()
directamente."one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir;four;fif;six;seven;eigh;nine;twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,one hundred".replace(";","teen,").split(",")
.Haskell
252231 bytesEsto crea una lista de todos los nombres de números en inglés desde "uno" hasta "noventa y nueve" y luego busca el índice de la entrada. Si no existe, estamos en el caso límite "cien", por lo que devuelve
100
, de lo contrario, devolverá el índice.Sin golf
fuente
Python 2, 275 caracteres
Simplemente construye una lista de cada número y encuentra el índice.
fuente
Japt, 82 bytes
Cada uno
¿
representa un carácter no imprimible. ¡Pruébalo en línea!Basado en mi respuesta JS. Reste un byte si la salida no necesita ser un número entero, ya que aparecería exactamente igual que una cadena.
Cómo funciona
fuente
JavaScript,
214199 bytesComo siempre: resulta que esto es demasiado largo para competir, pero ahora que he terminado, sería un desperdicio no publicar esto.
¿Quizás hay una manera obvia de jugar golf más allá que he pasado por alto?
JSFiddle para casos de prueba
fuente
f
af=s=>([t,u]=s.split('-'),~s.indexOf('le')?11:~s.indexOf('lv')?12:e(t)+(t.slice(-3)=='een')*10+''+(u?e(u):t.slice(-1)=='y'?0:''))
? Además, un argumento de cadena simple se puede pasar a una función como esta:s.indexOf`lv`
Perl, 158 bytes
Se ejecuta desde la línea de comando.
one hundred
debe ingresarse como"one hundred"
para evitar que se interprete como dos entradas.fuente