Cuando era niño y quería contar los billetes de un dólar en mis ahorros de toda la vida, contaba en voz alta:
uno dos tres CUATRO CINCO SEIS SIETE OCHO NUEVE DIEZ;
once, doce, trece, catorce, quince, dieciseis, diecisiete, dieciocho, diecinueve, veinte;
veintiuno, veintidos, veintitres, veinticuatro, veinticinco ...
Finalmente me cansé de pronunciar cada uno de estos números de múltiples sílabas. Con una mentalidad matemática, creé un método mucho más eficiente de contar:
uno dos tres CUATRO CINCO SEIS SIETE OCHO NUEVE DIEZ;
uno, dos, tres, cuatro, cinco, seis, siete, ocho, nueve, veinte;
uno, dos, tres, cuatro, cinco, seis, siete, ocho, nueve, treinta ...
Como puede ver, solo pronunciaría los dígitos que han cambiado desde el número anterior. Esto tiene la ventaja adicional de que es considerablemente más repetitivo que los nombres en inglés para los números y, por lo tanto, requiere menos capacidad intelectual para calcular.
Reto
Escriba un programa / función que tome un número entero positivo y arroje / devuelva cómo lo contaría: es decir, el dígito más a la derecha que no sea cero y todos los ceros finales.
Ejemplos
1 1
2 2
10 10
11 1
29 9
30 30
99 9
100 100
119 9
120 20
200 200
409 9
1020 20
No debería ser necesaria una lista completa de casos de prueba. Este es A274206 en OEIS.
Reglas
- Su entrada debe funcionar teóricamente para todos los enteros positivos, ignorando la precisión y los problemas de memoria.
- La entrada y la salida deben estar en decimal.
- Puede optar por tomar la entrada y / o salida como un número, una cadena o una matriz de dígitos.
- Se garantiza que la entrada sea un número entero positivo. Su entrada puede hacer cualquier cosa por entrada no válida.
Este es el código de golf , por lo que gana el código más corto en bytes.
[1,0,2,0]
->[2,0]
para el último caso de prueba? (No estoy claro en la frase "matriz de un solo elemento").Respuestas:
Python 2 , 28 bytes
Pruébalo en línea!
Una fórmula recursiva funciona muy limpiamente. Si el último dígito no es cero, imprímalo. De lo contrario, elimine el cero final, calcule la salida para eso y multiplíquelo por 10.
fuente
Gelatina ,
63 bytes-3 bytes al tener E / S como una lista decimal de dígitos .
Conjunto de pruebas en Pruébelo en línea!
¿Cómo?
Si no pudiéramos tomar listas decimales, un byte de 6 es:
Que puedes ver aquí .
Esto hace lo mismo, pero convierte de antemano un número entero en una lista decimal y luego lo convierte nuevamente en un número entero.
fuente
C,
302927 bytesOrgulloso de esto, ya que abuso de dos exploits C para jugar golf (descrito al final de la publicación); Esto es específicamente para C (GCC)
3)
b=10;f(a){a=a%b?:b*f(a/b);}
// 27 bytes2)
// 29 bytesb;f(a){b=a=a%10?:10*f(a/10);}
1)
// 30 bytesf(i){return i%10?:10*f(i/10);}
Pruébelo en línea (versión de 27 bytes)
Primer intento (30 bytes): Abusa del hecho de que en GCC si no se declara ningún valor en ternario, se devolverá el valor condicional. Por eso mi operador ternario está en blanco para el valor de retorno de verdad.
Segundo intento (29 bytes): Abusa del error de memoria en GCC donde, por lo que entiendo, si una función no tiene valor de retorno, cuando más de dos variables se han utilizado de manera significativa en la función, el último valor establecido de la primera variable de argumento Será devuelto.
(Editar: pero este "valor establecido" debe establecerse de ciertas maneras, por ejemplo, establecer una variable con
=
o+=
funciona pero establecerlo con%=
no funciona; extraño)Tercer intento (27 bytes): como de todos modos debo utilizar significativamente la segunda variable (b) para abusar adecuadamente del error de memoria mencionado anteriormente, también puedo usarlo como una variable real para "10" para la sustitución.
(Nota: yo debería ser capaz de cambiar
a=a%b
cona%=b
salvar otro byte pero lamentablemente esto hace que el fallo de memoria por encima de explotar a la parada de "trabajo", por lo que no se puede)fuente
Retina ,
76 bytesPruébalo en línea (todos los casos de prueba)
Las coincidencias de salida de un dígito seguidas de ceros al final de la cadena de entrada. Aunque no es obligatorio, esto también funciona
0
.fuente
[1-9]
(o[^0]
) sería necesario en lugar de\d
. Supongo que la avaricia de*
asegura la salida correcta cada vez.*
sino con el hecho de que se buscan coincidencias de izquierda a derecha.\d0*?$
También funcionaría..0*$
debería funcionar.0*
Cubix , 18
32bytesCreo que tendré que pasar algún tiempo más tarde para ver si puedo comprimirlo un poco. Pero por el momento aquí está.Resulta que estaba pensando en esto totalmente al revés. Ahora el proceso aplica incrementalmente un mod (1,10,100,1000, ...) al entero de entrada e imprime el primero que no es cero. Un poco más aburrido, pero más corto.
Pruébalo aquí
fuente
JavaScript, 21 bytes
Casos de prueba
Mostrar fragmento de código
fuente
Javascript
1918 bytesGracias a ETHproductions por jugar golf en un byte y Patrick Roberts por jugar golf en dos bytes
Devuelve una matriz de cadenas que coinciden con la expresión regular de estar al final de la cadena de entrada con cualquier carácter seguido del mayor número posible de ceros.
Pruébalo en línea
fuente
g
, ya que solo hay una coincidencia para encontrar.x=>x.match`.0*$`
Bash + coreutils, 12
Pruébalo en línea .
fuente
Mugre , 5 bytes
Pruébalo en línea!
Explicación
fuente
Brachylog , 2 bytes
Pruébalo en línea!
El sufijo incorporado
a₁
, para enteros, se implementa como:A Brachylog le gusta poder tratar los enteros como listas de dígitos, y para eso usa el predicado de utilidad personalizado
integer_value/2
. Lo interesante deinteger_value/2
esto es que, dado que tiene que ser capaz de traducir correctamente una lista de dígitos con ceros a la izquierda, también puede traducir un número entero a una lista de dígitos con ceros a la izquierda, por lo que predicados que no quieren que suceden (la mayoría de ellos, especialmente los que no son dedet.a
) prohíben que los encabezados de sus listas de dígitos sean 0. Entonces, mientrasa₁
genera sufijos más cortos primero para listas y cadenas, omite cualquier sufijo de un entero con un 0 inicial, que en Además de eliminar duplicados, también significa que el primer sufijo generado es el dígito que no es cero a la derecha con todos los ceros finales.fuente
Brain-Flak , 74 bytes
Pruébalo en línea!
Solo imprime los últimos 0 que no son 0 y todos los ceros finales.
Explicación:
fuente
Vim, 19 bytes
Dos versiones, ambas de 19 bytes:
Además de un retorno de carro final en cada uno.
¡Verifique todos los casos de prueba en línea! (Se agregó un byte para probar en varias líneas)
fuente
TI-Basic, 18 bytes
fuente
R, 33 bytes
Implementado como una función sin nombre
Esto aplica un mod de 10 ^ 0 a 10 ^ 99.
rle
se usa para reducir los resultados hacia abajo para que el segundo elemento sea siempre el resultado que queremos.Pruébalo en línea!
fuente
Zsh ,
1816 bytesPruébalo en línea!Pruébalo en línea!Golpetazo , 25 bytes
Pruébalo en línea!
Los shells necesitan llamar a programas externos para usar regex, por lo que tenemos que conformarnos con globing.
los
${1%[^0]*}
expansión coincide con el sufijo más corto que comienza con un carácter distinto de cero y lo elimina.(M)
bandera hace que el sufijo coincidente se mantenga en lugar de eliminarse.${1% }
expansión elimina como prefijo lo que queda.fuente
GNU sed ,
1714 + 1 (r flag) = 15 bytesEditar: 2 bytes menos gracias a Riley
Funciona eliminando todo hasta el dígito de la derecha que no sea cero, que luego se imprime junto con los ceros finales existentes. El script puede manejar múltiples pruebas en una ejecución, cada una en una línea separada.
Pruébalo en línea! (todos los ejemplos de prueba)
fuente
Mathematica, 26 bytes
Función pura que toma una lista de dígitos y genera una lista de dígitos:
Explicación
Esto funciona ya que encuentra la coincidencia más a la izquierda para
x
, que debe ser el elemento distinto de cero a la derecha de la lista, ya que es seguido por una secuencia de cero o más0
sy luego el final de la lista.fuente
Java 8, 47 bytes
Esta es una expresión lambda asignable a
IntUnaryOperator
:explicación: multiplique m por 10 hasta
x%m
que no sea 0.return x%m*m/10
requiere la división porque m es un orden de magnitud mayor que el resultado deseado.fuente
Perl 6 , 10 bytes
Solución trivial de expresiones regulares. Introduce y emite un número.
fuente
MATL ,
107 bytes3 bytes guardados gracias a @B. Mehta!
La entrada y la salida son una matriz de dígitos.
Pruébalo en línea!
O verificar todos los casos de prueba .
Explicación
fuente
48-
completo, ahorrando 3 bytes: ¡ Pruébelo en línea!C #,
3028 bytesBasado en esta respuesta de JavaScript , así que supongo que todos los créditos van a él.
Golfed
()
alrededora
gracias a Emignafuente
i
para que esto funcione mientras usa la recursividad.i
, no se declarará para la llamada recursiva).a
embargo, el paréntesis no se requiere de ninguna manera.J, 27 bytes
Se basa en la fórmula de xnor, así que le damos crédito.
fuente
Kotlin, 49 bytes
lambda, asignable a
(List<Int>) -> List<Int>
it
enindexOfLast
..
para construir gamasfuente
Perl 5, 12 bytes
11, más 1 para en
-nE
lugar de-e
fuente
05AB1E , 9 bytes
Pruébalo en línea! o como un conjunto de pruebas
Explicación
fuente
Japt , 6 bytes
Pruébalo en línea!
fuente
Stax , 5 bytes
Ejecutar y depurarlo
Procedimiento:
fuente
05AB1E , 4 bytes
E / S como una lista de dígitos.
Pruébelo en línea o verifique todos los casos de prueba (el conjunto de pruebas contiene una combinación para una mejor legibilidad).
Explicación:
fuente
Pyke,
131110 bytesPruébalo aquí!
11 bytes:
Pruébalo aquí!
13 bytes:
Pruébalo aquí!
fuente
Haskell 57 Bytes
fuente