Puede recordar en primer o segundo grado usando la forma expandida para aprender sobre el valor posicional de los números. Es más fácil de explicar con un ejemplo, así que considere el número 123
. En forma expandida, se representa como 100 + 20 + 3
, lo que ayuda a una mente joven a visualizar el valor posicional. Recuerda cómo lo dices: ciento (más) veinte (más) tres.
Podemos extender esto más allá del lugar de las unidades con decimales: 2.718 => 2 + 0.7 + 0.01 + 0.008
Su desafío es escribir un programa o función que tome un número positivo de coma flotante o cero (suponga que es tan grande o preciso como su lenguaje puede manejar; no estará en notación científica) o cadena e imprime / devuelve en forma expandida como se explicó anteriormente.
No necesita espacios entre los +
's ni el cero antes del punto decimal, por lo que el ejemplo anterior podría ser 2+.7+.01+.008
. Deben omitirse los valores que serían iguales a cero ( 101.01 => 100 + 1 + 0.01
) a menos que la entrada sea cero (ver más abajo).
Los valores no deben tener más de un cero a la izquierda antes del punto decimal o cualquier ceros a continuación (no-no:) 0060, 0000.2, 30., 30.000, .0400
. La entrada también se ajustará a esto.
Como los alumnos de primer grado tienen períodos de atención cortos, su código tendrá que ser lo más breve posible.
Casos de prueba
0 => 0
6 => 6
0.99 => 0.9 + 0.09
24601 => 20000 + 4000 + 600 + 1
6.283 => 6 + 0.2 + 0.08 + 0.003
9000000.0000009 => 9000000 + 0.0000009
fuente
Respuestas:
CJam,
3326 bytesEsto no funcionará con el intérprete de Java; imprime flotadores de manera diferente. Pruébelo con el intérprete de CJam .
Se imprime el último caso de prueba
9000000+9e-7
, que ha sido declarado válido por @NinjaBearMonkey .¡Gracias a @ jimmy23013 por jugar golf en 7 bytes!
Cómo funciona
fuente
r_ee\'0fe<f{\~t~}{},'+*0e|
.JavaScript (ES7), 102 bytes
Explicación
Requiere que el número se ingrese como una cadena sin ceros a la izquierda (a menos que el número sea,
0
por supuesto).Nota: Debido a la rareza de punto flotante, algunos números (como
.3
) salen mal, pero en teoría esto funciona para cualquier número.Prueba
Prueba de uso en
Math.pow
lugar de**
compatibilidad del navegador.Mostrar fragmento de código
fuente
Math.floor
=>0|
...?1
lo que se rompería porqueMath.log10(n)
devolvería un número negativo y se|0
redondea a cero en lugar de piso.0|Math.log10(n),p-=p<0
lugar deMath.floor(Math.log10(n))
?n<1
porque0|
haráp
igual0
para ambos0.1
y-0.1
. La forma más corta que se me ocurre esp=Math.log10(n),p=p-(p<0)|0
cuál es la misma longitud que usarMath.floor
. :(n=0.1
todos modos.Retina ,
867775 bytesEl recuento de bytes supone que la fuente está codificada como ISO 8859-1.
El avance de línea final es significativo.
Pruébalo en línea.
Explicación
Comenzamos convirtiendo la entrada en una lista separada de salto de línea de componentes, aunque solo el dígito inicial (o final) es correcto. Esto se hace abusando de una etapa dividida. En lugar de dividir la entrada, coincidimos con todos, por lo que los segmentos restantes están vacíos. Eliminamos esos segmentos vacíos con la
_
opción. El problema es que las etapas divididas también devuelven los valores de todos los grupos de captura. Por lo tanto, usamos una búsqueda anticipada en cada coincidencia para capturar la parte correcta de la cadena: primero intentamos encontrar una.
izquierda de la coincidencia. Si ese es el caso, capturamos todo, desde.
hasta e incluyendo el dígito que estamos haciendo coincidir. De lo contrario, debemos estar en la parte entera de la entrada, por lo que capturamos todos los números después de la coincidencia (incluida la coincidencia). También debemos deshacernos del punto decimal en sí mismo, por lo que la segunda captura es opcional. Si no hay\d
que capturar, esto simplemente eliminará la coincidencia de la entrada.Ahora usamos una etapa de transliteración para convertir todos menos los dígitos iniciales / finales en ceros. Hacemos coincidir un componente que es menor que 1 con
\..+\B
donde se\B
asegura que detengamos la coincidencia un dígito antes del final, o hacemos coincidir una parte entera con(?<=^\d).+
donde el mirar atrás asegura que comencemos un dígito en el número. La etapa de transliteración reemplazará los dígitos (d
) con ceros dentro de las coincidencias.Ahora, el formato de salida real
+
no debe usar saltos de línea como separadores. El¶
coincide con un salto de línea para hacer esa sustitución. Mientras estamos en eso, también eliminamos líneas que contienen solo0
sy.
s.La etapa anterior no elimina un inicio o un final
0
(porque esos no tienen un salto de línea antes y después de ellos), por lo que los eliminamos explícitamente.fuente
Python 2,
216210196175 bytesAquí hay un código ligeramente golfizado que jugaré más cuando tenga tiempo. Utiliza análisis de cadenas.
Explicación
Entonces, la entrada se separa en una parte entera y decimal. Luego, hay una lista de comprensión de bucles. En la parte entera, la longitud de la cadena después de un carácter en el decimal se multiplica por "0" para obtener tantos ceros al final si ese carácter.
Para la parte decimal, el índice del carácter actual es el número de ceros que tiene delante y, por lo tanto, esa parte es simple.
El try and except se usa para determinar si tiene una parte decimal o no (usando un error).
El resultado final se une con signos más.
Pruébalo aquí!
fuente
o if o else ["0"]
puede sero or["0"]
.o=[(...)] for
,e(I) if
,e(i[1]) if
,print "+"
, y el paréntesis exterioro=[(...)
, así, en realidad. Finalmente, puede eliminar el condicional final de la función de unión de esta manera:print"+".join(o)or"0"
porque unir devolverá una lista vacía sio
está vacía, por lo que el condicional evaluará de la misma manera, lo que le ahorrará un byte.Pyth, 30 bytes
Banco de pruebas
La solución básica aquí es reemplazar todos los dígitos en la entrada con
0
, luego insertar cada dígito en la ubicación adecuada, evaluar, filtrar los ceros y unir en los más. Desafortunadamente, la función eval de Pyth no acepta ceros iniciales actualmente. Estaré trabajando para arreglar esto.Para superar este problema, agregué una función auxiliar
y
, que reintenta recursivamente la evaluación hasta que no se produce ningún error, eliminando el primer dígito cada vez. Tenga en cuenta que esta función se repetirá infinitamente en una entrada no válida.Además, se necesitaba un caso especial para la entrada
0
.En general, creo que el código es bastante bueno, pero las instalaciones del lenguaje podrían ser mejores. ¿Quién quiere errores?
fuente
Pitón 3, 138
Esto se basa libremente en el enfoque de TanMath / Ogaday de leer el número como una cadena y analizarlo de esa manera. Tengo que usar la asignación de estrellas
i
para que maneje correctamente los enteros.fuente
Python,
141132128 bytesEste todavía es relativamente legible. Convierta a cadena y maneje los
>1
dígitos por separado de los<1
dígitos. También tenemos un caso especial para cero. Podría eliminar dos espacios más a continuación, pero me gusta mantenerlo bonito.La desventaja es que se desglosará para flotadores con más de 9 decimales.
Debajo está el original. La primera edición fue acortar el caso especial de cero, la segunda edición fue eliminar el 0 antes del decimal, la tercera fue eliminar algunos paréntesis y espacios adicionales.
Explicación:
fuente
Mathematica, 81 bytes
Caso de prueba:
fuente
CJam, 44 bytes
Pruébalo aquí
Falla el último caso de prueba y genera lo siguiente:
Pero digamos que es demasiado preciso que CJam no puede manejarlo.
Explicación
fuente
Python 3,
187180173154 bytesSe las arregló para jugar al golf con una buena cantidad de 19 bytes de descuento gracias a las sugerencias de @Thomas Kwa mencionadas anteriormente
result or['0']
, además de reorganizar algo de álgebra ( 154 bytes ):Mi mejor intento hasta ahora( 173 bytes ). Basado en un nuevo enfoque, vea la parte inferior de la publicación:Golfé mi original hasta 180 bytes :
¡Aprendí una nueva función de lenguaje hoy haciendo esto! Condicionales mediante indexación booleana. Puede que lo haya exagerado un poco.
Intenté resumir las comprensiones, pero no pude acortarlo ( 196 bytes ):
(¡Invertir secuencias es costoso!)
Mientras que la mía es más corto, por ahora, creo que TanMath lata campo de su abajo para que coincida con la mía: El uso
e=enumerate
, en sustituciónpass
de0
, y usar'0'
en su lugar de['0']
en la instrucción de retorno debe guardar 4 + 3 + 2 = 9 bytes! Bajándolo a 187. Estoy seguro de que se pueden eliminar otros pocos bytes en alguna parte ...editar Nuevo enfoque ( 156 bytes ). Sin embargo, solo puede lidiar con una precisión de hasta 6dp similar a la entrada CJam de @ jimmy23013, por lo que falla la prueba final. No pude obligarlo a imprimir más ceros, tal vez alguien más pueda. En cambio, lo utilicé como la base de mi mejor intento hasta la fecha, ver arriba (Además, este enfoque imprime el 0 antes del decimal, pero eso también parece válido). Tomó el
try:... except:...
enfoque de TanMath:fuente
puro golpe, 210
o
Prueba:
fuente
Python, 131 bytes
Una función recursiva muy, muy desordenada, probablemente no sea la mejor manera de hacerlo. Entrada como
f("10.0203")
.fuente
C,
155153161 bytes+2 para vincular en la biblioteca matemática (la fuente en sí es 159).
Sin golf
fuente
Dyalog APL , 47 bytes
Toma el número en forma de vector de caracteres, por ejemplo
'123'
.Ejemplos:
Notas:
○ La razón del último ejemplo modificado es que APL, como algunas de las otras presentaciones, por defecto cambiará a notación científica para tales números extremos.
○ La frase
↑⍕¨f¨,¨
solo es necesaria para procesar todos los ejemplos a la vez.fuente
Retina, 113 bytes
Actualmente es mucho más largo que la solución de Martin, pero utiliza un método diferente, así que decidí publicarlo.
Pruébelo en línea aquí.
fuente
perl, 132 bytes
131 +1 para
-p
interruptor.Esto se basa en mi
sed
respuesta anterior :Banco de pruebas:
fuente
Powershell -
172166193 bytesTodo en una sola línea:
Sin golf:
Casos de prueba, más uno adicional:
fuente
$args = 0
. Aquí hay una solución de error simple que también ahorra 3 bytesPerl, 248 bytes
Ew, soy novato en Perl golf.
Pruébalo aquí
fuente
5
, regreso50
.Java,
284244243 bytesDesafortunadamente, no pude encontrar una forma más corta de crear cadenas repetitivas que:construir unachar[]
de la longitud requeridautilizarArrays.fill
para configurar los personajesusarnew String
para que se pueda concatenarCon la inspiración de @Khaled A Khunaifer, podría eliminar 40 Bytes.
Editar:
indexOf
toma un int, por lo que podría reemplazar'.'
con46
. Desafortunadamente, esto no parece ser posible conreplace
.fuente
.replace('\0','0')
función reemplazar esperarString
nochar
, debería ser.replace("\0","0")
Python, 125 bytes
Después de eliminar mi primera respuesta (¡sry!) Que no podía manejar números pequeños debido a problemas con la máquina épsilon, encontré una solución diferente. Maneja tanto los flotantes como los enteros, ceros finales (!) Y se escribe como función.
¡Gracias a @ogaday por las sugerencias útiles y por el arreglo compacto '0'!
Golfizado:
Sin golf:
Uso:
fuente
f('0')
Sin embargo, falla el caso de prueba, y cuando copio y pego directamente en mi intérprete obtengo la notación científica (que creo que está bien). Además,list(c)
es más corto. Si concatena el'.'
antes de convertirlo en una lista, tampoco necesita agregarlo[]
. Usar enfind
lugar de índice en la cadena antes de convertirlo en una lista, después de agregar'.'
también le ahorra un byte. Reordenar la desigualdad también le permite eliminar un espacio adicional:def f(x):x+='.';i=x.find('.');z=list(x);del z[i];return"+".join([str(int(o)*10**(i-j-1))for j,o in enumerate(z)if"0"<o])or'0'
CoffeeScript, 144 bytes
Solución directa:
Ejecutable:
Mostrar fragmento de código
fuente
Stax , 18 bytes
Ejecutar y depurarlo
Desempaquetado, sin golf y comentado, se ve así.
Ejecute este
Al igual que muchas de las otras soluciones publicadas, produce
9000000+9e-7
para el último caso de prueba. Según el precedente establecido, esto está permitido porque el caso de prueba es demasiado preciso para el idioma.fuente
Lua, 350 bytes
Creo que hay dos formas de jugarlo más:
Podría usar
macro.define
para reemplazar algunas de las expresiones comunes (no puedo probar en este momento, y no estoy seguro de que me haga ganar algunos bytes)Use dividir en el punto en lugar de iterar en toda la cadena. Una vez más, no estoy seguro de que reduciría el tamaño de esta función, ya que manipular cadenas en lua es bastante doloroso.
Explicaciones
Puede probar lua en línea y usar el siguiente código fuente para ejecutarlo con algunos casos de prueba
fuente
C, 253 bytes
Nota:
putchar(8)
debe realizar un retroceso.Detallado , prueba aquí
fuente
sed,
136bytesReducido en 8 caracteres al dejar caer espacios e inútil
0
.Casos de prueba:
fuente
JavaScript (ES7), 114 bytes
Funciona con números de longitud arbitrarios porque utiliza la manipulación de cadenas en todo momento.
Sin la comprensión de la matriz (122 bytes):
Sin golf:
fuente
R - 133 bytes
Robusto, ignora Machine Epsilon y trabaja también con ceros finales.
a) Golfizado:
Sin golf:
Uso:
fuente