CodeGolf Challenge
PWSSHHHH! Te despiertas en un laboratorio de criogenia en el año 3000. Al ser escoltado a la oficina de asignación para recibir tu chip de carrera, presumiblemente el de un repartidor, una sonda detecta que eres del año 2000. Debido a esto, y algunos estereotipos, se supone estúpido en comparación con el de hoy humano moderno y se ve obligado a repetir la escuela primaria.
Entras en tu clase de primer grado y el maestro está asignando una tarea. Ella dirá o escribirá un número hasta 50. Si escribe el número en la pizarra (por ejemplo: 25), entonces debe decir los números hasta ese número "uno, dos, tres, ..., veinticinco ". Si dice el número en voz alta (por ejemplo: "seis"), entonces, en su tableta, debe escribir los números hasta ese número "1, 2, 3, 4, 5, 6"
Esto se vuelve muy tedioso y decides que automatizarás el proceso con tu conocimiento de programación aún funcional, pero arcaico, del siglo XXI.
Objetivo:
Su programa debe tomar una entrada. Esta entrada será un número decimal ( 1 thru 50
) o un número escrito ( one thru fifty
).
• Si la entrada es un número decimal, su salida debe contar de uno a dicho número, utilizando un estilo escrito. (por ejemplo, treinta y dos )
• Si la entrada es un número escrito, su salida debe contar de 1 a dicho número, usando el estilo decimal. (por ejemplo, 32 )
Reglas:
La entrada y la salida pueden ser en cualquier caso de su elección (por lo que puede hacer un programa que solo acepte mayúsculas si lo desea).
Los números decimales de entrada no tienen que ser de un tipo de número (por ejemplo, int), pueden ser una cadena de entrada que contiene números (25 frente a "25"). O bien, puedes elegir cuál quieres que acepte tu programa. (Su programa no necesita aceptar ambos)
El estilo escrito NO requiere un guión entre palabras compuestas, pero puede hacerlo si lo desea.
Los valores de salida deben estar separados de alguna forma, cualquier separador está bien 1,2,3
1 2 3
etc
No puede agregar bibliotecas adicionales como num2words (python) etc. (Sin embargo, las bibliotecas del sistema están bien)
Aunque la historia de fondo dice que eres del año 2000, puedes usar idiomas creados después de esa fecha (risas)
Este es el código de golf , por lo que gana el programa con el bytecount más corto.
Respuestas:
Perl 6 ,
119113bytesBase de datos Unicode FTW!
Utiliza números escritos en mayúscula sin guión, por ejemplo
TWENTYTWO
.Devuelve una lista de cadenas o un rango de números. (Ambos usan el espacio como separador cuando se imprime con
put
).fuente
Python3,
276271269243237235232217 bytesSiguiendo el ejemplo de la presentación de @smls perl ...
Sospecho que podría jugarse un poco más.
Utiliza la biblioteca del sistema
unicodedata
para buscar nombres para números. Requiere nombres en mayúsculas (separados por espacio:FORTY TWO
:) o enteros decimales como entrada.(Esta es mi primera presentación de código de golf).
(También me di cuenta de que estaba contando mal la longitud (codificación), por lo que son unos pocos bytes menos de lo que se pensaba anteriormente. Sin embargo, solo he actualizado el recuento de bytes más reciente. Vaya).
fuente
unicodedata
es una biblioteca del sistema que viene con la instalación predeterminada, no una biblioteca "adicional" que debe instalarse por separado.for
bucle y teniendo nuevas líneas entre cada salida.print()
no le importa si es un entero o una cadena entonces. Pruébalo en línea!import*
lugar deimport name
guardar un par de bytesLisp común,
297253243242144128Detalles
~[ 0 ~; 1 ~; ... ~:; else ~]
es un conmutador, basado en el siguiente valor del argumento disponible, que salta al formato de subcontrol apropiado. Aquí, solo tengo un caso de "0" y de "else". Esto se utiliza para insertar un separador antes de cada número, excepto el primero, gracias a U a partir de cero.~:[ FALSE ~; TRUE ~]
es un formato condicional; aquí sacamos cosas de manera diferente si la entrada s es una cadena o no.~R
escribe un número como un número cardinal en inglés, mientras que~D
simplemente imprime el número.Ejemplos
fuente
f
que "(f 2)" imprime "uno, dos" e(f "two")
imprime "1, 2", ¿le parece bien?JavaScript ES6,
559 526 381 368 364 358 332 327315 bytesGracias a Kritixi Lithos por la idea de dividir la matriz y Arnauld por el truco de 1 / n.
fuente
var
y puede cambiar la matriz['one,'two',..]
a"one0two0three0...".split(0)
null, Array(n)
.!isNaN(n)
por1/n
. Esto le proporcionaNaN
una cadena (falso), un flotador distinto de cero para un número entero distinto de cero (verdadero), oInfinity
para 0 (también verdadero).Python 2 ,
503499494490479 bytes-5 gracias a @JonathanAllan
Pruébalo en línea!
Ingrese un número o una ortografía separada por espacios de un número.
Versión ligeramente menos golfizada y más legible:
fuente
l="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nin#".replace("#","teen ").split()
e
denineteen
.Esquema,
161,152, 149Sin comprimir:
fuente
string->number
hacer esto, lo verifiqué rápidamente y parece que se usa para convertir, por ejemplo, de cadena"4"
a número4
.(string->number "four")
vuelve#f
.PHP -
397372349344329 bytesInspirado en la solución JS de TomDevs
Ahorró 25 bytes al reemplazar
$a=[...]
por$a=explode(...)
Ahorró otros 23 bytes volviendo a una matriz sin delimitadores de cadena y almacenando
teen
en una variable, gracias a @ user59178Se guardaron otros 5 bytes al eliminar el
(int)
encasilladoAhorró otros 15 bytes al soltarlos
$b
,$i
en lasfor
declaraciones y las llaves, gracias a @ user59178 nuevamenteSin golf:
Pruébelo para una cadena de entrada o para un número de entrada
fuente
teen
en una variable en lugar de repetirlo cada vez. Como tal, se convertiría en:$a=[one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir.$t=teen,four.$t,fif.$t,six.$t,seven.$t,eigh.$t,nine.$t];
;)
$b
y colocar la segunda matriz directamente en el foreach, 6 bytes más al soltar todos los corchetes (aunque necesita ponerlos$a=$c
en la configuración del bucle for) y 6 bytes más mediante el incremento posterior$i
cuando lo usas en lugar de en el bit 'after' de los bucles for.for ($i=0;$i<9;)$a[]=$c.'-'.$a[$i++];
Python 2, 262 bytes
repl.it
Las cadenas de entrada y salida están en minúsculas y concatenadas *, por lo que para probar una entrada de cadena, ingrese, por ejemplo,
"thirtyfive"
en el indicador.Construye la lista de todas las palabras (más
"fiftyone"
a"fiftynine"
),x
luego comprueba siinput
es una palabra con el proxyv>50
(las cadenas son mayores que los números en Python 2, y todos los números en el rango de entrada válido de la especificación son<=50
) y sonprint
los apropiados los valores por rebanar ya sea la lista,x[:v]
o la construcción de una serie de números enteros,range(1,x.index(v)+2)
.* Agregar guiones en ambos costos 11 bytes, reemplazando
a+"ty"b
cona+"ty"+'-'*(b>'')+b
.fuente
Wolfram Language, 92 bytes
(Soy nuevo en esto, avíseme si hice algo mal)
fuente
Do[Print@If[#>0,i,,IntegerName@i],{i,If[#>0,#,,Interpreter["SemanticNumber"]@#]}]&
JavaScript (ES6), 261 bytes
Nota: la cadena asignada a z está codificada con
atob
. En la cadena codificada hay 11 bytes que no puedo publicar en este sitio, incluso si son caracteres válidos en una cadena de JavaScript. Entonces usé un escape hexadecimal en la forma \ xHH. Cada uno de estos escapes se cuenta como 1 byte.La cadena original sin comprimir es la versión menos golfizada .
Menos golf
Prueba
fuente
ö\x89ÞöÜ(öØ...
esto es genial jajajaPython 3 ,
305303 bytesConvertido a Python 3 después del consejo de @ nedla2004. Ahora tampoco tiene espacio entre los números escritos en la entrada o salida, por ejemplo, ingrese veinte
Pruébalo en línea 3!
Python 2 ,
327320313308 bytesPruébelo en línea 2!
163170177 bytes más corto que mi respuesta original, así que lo publico como alternativa. Esto se usafor
en las dos listas para construir una lista completa de todas las representaciones de cadena de los números, luego identifica la correcta en la lista e imprime todo en ella, ya sea por valor o por índice. Emite una nueva línea para cada valor.fuente
Python 2,
432 422 416403 bytesEstoy seguro de que esto se puede mejorar. Por lo menos, si puedo evitar codificar el valor en el que se va a trabajar y no necesitar una función, puedo guardar 20. Necesita un espacio para separar las palabras en la entrada de texto. Ahorré 6 bytes gracias al comentario de JonathanAllan sobre la respuesta de ElPedro, 4 por reorganizar las matemáticas.
(Nota: la versión real de esto usa pestañas para sangrar en lugar de espacios. QPaysTaxes agregó un solo espacio porque no se procesó correctamente, para garantizar que el código dado se compila. No debería cambiar el recuento de bytes).
fuente
len(`f`)>2
puede ser...`f`[2:]
por otros 3, creo. (ignore que...
parece que los backticks no funcionan correctamente)f>50
6. (y otro por no usard
)TypeError: 'int' object has no attribute '__getitem__'
. Si paso la entrada numérica como una cadena,f[2:]
se acerca pero sigue fallando cuando se trata como un booleano (print f[2:] and True
imprime una línea en blanco si len (f) <2, noTrue
oFalse
)f>50
funciona, gracias. Dejar caerd
no es tan simple como siempre pongo el valor final del bucle en laf
línea 8 para que no se pueda cambiarif f>50
ya que nunca será cierto.C ++ 11,
484480477 bytesEntrada de texto en minúsculas sin guiones.
fuente
PowerShell , 362 bytes
Pruébalo en línea! entrada de palabras o entrada de números
Esto es un desastre, y no estoy terriblemente feliz con eso, pero aquí está. Sugerencias de golf bienvenidas.
La primera línea se establece
$z
como un conjunto de palabras completas en inglés. Se puede ver la-split0
de los números1
a12
, y el bucle para construir todas lasteen
s, y luego hay un montón de lógica para poner todo junto derecha.Pruébalo en línea!La segunda línea comienza con algo de lógica. Tomamos la entrada
$args
(como una cadena), la-split
almacenamos en un espacio en blanco, la almacenamos$n
para usarla más tarde, tomamos la primera[0]
palabra y el primer[0]
carácter de eso, y verificamos si es-in
un rango48..57
(es decir, ASCII0
para9
). Entonces, estamos verificando si tenemos entrada decimal o entrada en inglés.Pruébalo en línea!En el primer caso, construimos un rango basado en las entradas decimales
$n[0]..$n[2]
y lo usamos para indexar$z[...]
. En el otro caso, encontramos la.indexOf()
primera palabra y la última palabra, y construimos solo un rango numérico a partir de eso. En cualquier situación, ahora tenemos una matriz de objetos en la tubería (cadenas o enteros), y un implícitoWrite-Output
al finalizar el programa nos da una nueva línea entre los elementos.fuente
Swift3, 402 bytes
Sin golf:
Nada especial aquí, solo usando una matriz para hacer una copia de seguridad de los números escritos.
Originalmente pensé que esta solución usaba esta otra forma de calcular la
values
matriz:Que podría ser golf para:
reemplazando la tercera línea en el código de golf
Podría haber puntuado 381 bytes, pero hay un error del compilador que dice: "la expresión era demasiado compleja para ser resuelta en un tiempo razonable", puede encontrar más información sobre el error aquí
fuente
R,
452430424 bytesColoca los números en un marco de datos con números escritos como nombres de columna, lo que hace que la traducción entre los dos (y la posterior impresión) sea bastante fácil.
El principal intento de jugar golf fue crear los números escritos para 20-49, probablemente mucho más para jugar golf aquí.
Hice un intento de
as.matrix
imprimir el hoja.de.datos con sólo los números, pero aún tengo una cabecera de matriz. Espero que esté bien.Sin golf:
fuente
o=c("","one","two","three","four","five","six","seven","eight","nine") ; v=c("ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"); w=c("twenty","thirty","forty"); a=data.frame(0:50, c(o,v, sapply(w[1:3],function(y) sapply(o,function(x) paste0(y,x))),"fifty")); b=which(a==i); a[if(b<52) 2:b else 2:(b-51),ifelse(b<52,2,1)]
C,
342331 bytesPruébalo en línea!
fuente
SAS, 179
La salida se escribe en el registro separada por nuevas líneas. SAS tiene un formato incorporado para convertir dígitos a palabras, lo cual es una gran ventaja para este desafío, pero molestamente carece de información para hacer lo contrario.
fuente