Escriba un programa o función que tome un entero positivo N. Genere una lista de todos los números decimales distintos que pueden escribirse exactamente en N caracteres usando dígitos ( 0123456789
), puntos decimales ( .
) y signos negativos ( -
).
Por ejemplo, algunos números que serían en la lista de salida N = 4 son 1337
, 3.14
, .999
, -789
, -2.7
, y -.09
.
Los números deben escribirse de la manera normal, pero de la forma más corta posible . Esto significa:
El punto decimal solo debe incluirse si el número no es un entero.
- por ejemplo,
45.0
y45.
debe escribirse como simple45
-45.00
debe escribirse como-45
- por ejemplo,
No debería haber ceros a la izquierda del punto decimal.
03
y003
debe ser escrito como3
, pero30
y300
están bien como están0.3
y00.3
debe escribirse como solo.3
-03
debe escribirse como-3
-0.3
debe escribirse como-.3
No debe haber ceros a la derecha del punto decimal
.50
y.500
debe escribirse como.5
900.090
debe escribirse como900.09
La excepción a las dos últimas reglas es cero en sí, que siempre debe escribirse como simple
0
.Los signos positivos (
+
) no deben usarse ya que alargan innecesariamente el número.
También tenga en cuenta que el signo negativo ( -
) no debe usarse como un signo de resta. Solo debe aparecer como el primer carácter de números menores que cero.
Formateo
El orden de la lista de números de salida no importa. Podría ser ascendente, descendente o completamente mezclado. Solo importa que todos los números distintos que se pueden escribir en N caracteres estén presentes.
La lista puede formatearse de manera razonable, utilizando espacios, líneas nuevas, comas o quizás algo más entre los números, siempre que las cosas sean consistentes. Los corchetes iniciales y finales (o similares) están bien, pero no lo son las comillas alrededor de los números. (es decir, no mezcle cadenas e ints / flotantes en la salida).
Por ejemplo, cuando N = 1, algunas salidas válidas serían:
0 1 2 3 4 5 6 7 8 9
[1, 2, 3, 4, 5, 6, 7, 9, 0]
ans = { 5 8 9 1 3 2 0 3 4 7 6 }
Pero esto sería inválido:
[0, 1, 2, 3, 4, "5", "6", "7", "8", "9"]
Ejemplos
N = 1 -> 0 1 2 3 4 5 6 7 8 9
N = 2 -> -9 -8 -7 -6 -5 -4 -3 -2 -1 .1 .2 .3 .4 .5 .6 .7 .8 .9 10 11 12 ... 97 98 99
N = 3 -> -99 -98 ... -11 -10 -.9 -.8 ... -.2 -.1 .01 .02 ... .98 .99 1.1 1.2 ... 1.9 2.1 2.2 ... 2.9 3.1 ...... 9.9 100 101 ... 998 999
Las listas están en orden ascendente, elipses en algunos lugares para facilitar la lectura.
Puntuación
El código más corto en bytes gana. En caso de empate, la respuesta más votada gana
-0
ser una salida válida?Also note that the negative sign (-) should not be used as a subtraction sign. It should only appear as the first character of numbers less than zero.
0
".Respuestas:
Pyth,
4745 bytesGracias a FryAmTheEggman por señalar que el orden no importa.
Pruébalo en línea.
El tiempo de ejecución es horrible, básicamente O (12 n ), pero lo probé para
n
= 6 en mi computadora (que tomó 2 minutos). Ejecución den
≥ 5 será el tiempo de espera en línea.Debido a la forma en que genero los caracteres,
0123456789.-
la salida está en un orden realmente extraño.Técnicamente, se podría eliminar el
{
extremo cercano, pero daría como resultado una complejidad de O (19 n ). (También produciría muchos duplicados, pero eso está permitido).Explicación
La parte principal del código es
".- \..*\. ^-?0. [.-]0*$"
, que contiene las expresiones regulares que cualquier salida no debe coincidir.fuente
Pyth, 57 bytes
Pruébelo en el intérprete en línea .
Demasiado tiempo y con un tiempo de ejecución horrible (toma varios segundos para N = 4, no se recomienda ejecutar con N = 5).
Explicación de expresiones regulares:
fuente
*Q
en tu permutación antes de+
que solo afecte a los dígitos, esto debería mejorar bastante el rendimiento. ¿Podría incluso ayudar a guardar algunos bytes en la expresión regular?Julia,
126117bytesEsta es una función lambda que acepta un número entero y devuelve una matriz de cadenas. Para llamarlo, asígnelo a una variable. El enfoque aquí es el mismo que la respuesta Pyth de Doorknob .
Sin golf:
fuente
MATL , 60 bytes
Pruébalo en línea!
Utiliza la fuerza súper bruta (a través del poder cartesiano) seguido de filtrado (a través de una expresión regular). Agregaré una explicación más tarde.
Los resultados se muestran al final del programa. Esto puede tardar un rato. Si desea ver los resultados a medida que se generan, agregue
D
al final :fuente