Su tarea es escribir un programa de ordenador de tal manera que cuando se corta en líneas (fractura en el carácter de nueva línea) cada disposición de las líneas dará salida a un número diferente entre 1 y n! (donde n es el número total de líneas). Ningún número debe salir por dos arreglos diferentes y cada arreglo debe emitir un número en este rango. Como hay n! maneras de organizar las líneas de un programa, esto significa que cada número debe salir por una reordenación.
Por ejemplo el programa python
print 1;"""
print 2;"""
Tiene dos arreglos
print 1;"""
print 2;"""
y
print 2;"""
print 1;"""
Las primeras salidas 1
y las segundas salidas 2
.
Puede usar cualquier formato de salida que sea estándar en el idioma que esté usando. No puede asumir ningún tipo de repetitivo. Creo que este desafío es más interesante si tienes que trabajar en cualquier formato en el que el idioma insista.
Puntuación
Su puntaje será el número de líneas en su programa con un puntaje más alto mejor. Si lo desea, puede elegir generar números del 0 al n! -1 .
fuente
n
? ¿Están todos empatados a una puntuación de ∞?Respuestas:
CJam , puntaje: ∞
Cada línea es de la forma
de dónde
x
es un número de0
an-1
. El resultado está en el rango0
den!-1
.Pruébalo en línea! (Por
n=3
)Créditos a jimmy23013 para el código que calcula el índice de permutación real. Solo he reemplazado el bit que lee la entrada con la
];Lx+:L
que descarta el resultado de la línea anterior y luego agrega el índice de la línea actual a la variableL
(que inicialmente es una matriz vacía).fuente
0+:+
) Creo que puedes obtener una versión mucho más corta usando,m!#
.Perl: ∞
Extiende a cualquier longitud que quieras
Se quedará rápidamente sin memoria ya que el uso de la memoria es como O (n ^ n). Sin embargo, sería fácil reemplazar el indexador de permutación por código O (n), solo por más tiempo. Solo estoy ilustrando la forma en que puede usar
END{}
para esta tarea en perl. Todos losEND{}
bloques se ejecutan al momento de la salida, pero solo el primero que se llama (el último en el código) generará algo debido a la/A/
prueba, que solo es cierta una vezTenga en cuenta que el
$m
contador debe contar como una cadena porque como un número se desbordaría (más tarde que el final del universo, pero es el principio el que cuenta). Por la misma razón, "cuento" el número de líneas construyendo una cadena deA
s en lugar de usar un contador real, aunque este desbordamiento ocurriría incluso más tarde.Otra forma de hacer esto en perl:
Esto usa el hecho de que in
foo = bar
bar
se ejecuta despuésfoo
. Por cierto, esta versión no se vuelve loca en el tiempo y el espacio, pero eso hace que el código sea más largoOtra idea más es usar la
DESTROY
que tiene la ventaja de que solo uno de ellos será ejecutado. No voy a repetir el código de indexación de permutación del cual ya di dos ejemplos.O usando
BEGIN
:fuente
Jalea , ∞
(Ejemplo con
n=3
.)Pruébalo en línea!
231311 bytes por línea.Para un programa con
n
líneas, las líneas tendrán el formato;
<i>
ÇQŒ¿$⁼Q$?
donde
<i>
representa el número literali
y cada línea tiene un valor diferente parai
variar de1
an
. (Los valores para eni
realidad no tienen que ser estos números específicos, solo tienen que tener valores positivos únicos). Este programa ya no se usan
en la estructura de línea.¿Cómo?
0
.;1
anexa1
al0
o la lista activa.⁼Q$
es la mónada condicional para la instrucción if (?
) que verifica si los elementos de la lista son únicos. Si lo están, se llama al enlace de arriba (Ç
) y se agrega otro número a la lista. Si no son únicos, eso significa que hemos llegado al primer enlace. El elemento repetido se elimina de la lista (Q
) y se encuentra el índice de la permutación (Œ¿
). Tenga en cuenta que hay un0
al principio de la lista cuandoŒ¿
se toma, pero no afecta a la salida, ya que todos los valoresi
son positivos.Nueva función de gelatina
Con el nuevo agregado
Ƒ
rápido, podemos reducirlo⁼Q$
yQƑ
guardar un byte.10 bytes / línea (para dígitos individuales)
Pruébalo en línea!
fuente
Brain-Flak , 3
Pruébalo en línea!
Publiqué esto en el chat antes, pero espero que al publicarlo aquí la gente pueda construir a partir de él.
Explicación
Comenzamos con el programa básico.
Esto puntúa 2 por sí solo. Para avanzar al siguiente nivel, quiero agregar una nueva línea. Mi conjetura inicial fue
Esto establece el TOS en
2
si es cero y no hace nada diferente. Esto en realidad es un buen comienzo. Con las otras dos líneas podemos obtener todos los números de1
a6
excepto4
, porque hay2
formas de salida2
:y
Para remediar esto, hacemos que nuestra línea también
2
sea4
. Esto se puede hacer conPara mayor claridad, esto básicamente implementa la función Haskell
Esto soluciona nuestro problema porque uno de los programas que antes estaba generando
2
ahora sale4
sin ningún otro cambio de programa.fuente
Java 7, puntuación: ∞
Pruébalo en línea!
Esto se puede imprimir 0 a n! -1 . Las líneas adicionales tienen el siguiente formato (donde INDEX es un número de 1 a n! -1 ):
Este método funciona leyendo su propia fuente para determinar las clases de orden que figuran en él. Lamentablemente, no pude encontrar ningún método más interesante al analizar el archivo compilado o al crear un ClassLoader personalizado gracias a cómo Java compila JIT. Supongo que podría hacer que cada clase adicional imprima un número estáticamente definido, pero esto me pareció más divertido. Eso también lo haría para poder eliminar la
B
interfaz, pero la puntuación no se basa en bytes, por lo que lo dejaré por diversión.Cómo funciona (alto nivel):
Lee su propio código fuente línea por línea. Como cada línea declara una nueva clase, utilizamos la reflexión para crear una instancia de la nueva clase e invocar su
a
método que necesita tener porque implementa laB
interfaz.fuente
Ruby , puntaje: ∞
Pruébalo en línea!
Este programa tiene 61 bytes por línea (para n <10). Tiene el mismo formato básico que la solución de dylnan ; el primer número en cada línea será un valor diferente entre
1
yn
, y el segundo número en cada línea serán
.Tenía la esperanza de encontrar una manera de evitar incluir
n
en el programa, pero no pude encontrar una.fuente
Brain-Flak , 2 (con
-d
)Pruébalo en línea!
fuente
2
que pueda usar({}())
y(({}){})
.05AB1E , puntuación: 1,114,112
Pruébalo en línea! 0 indexado. El ˆ al comienzo de cada línea empuja los caracteres distintos a la matriz global. El resto del código se ejecuta inútilmente excepto en la última línea, donde concatena los valores en una cadena, luego encuentra su índice de permutación. 1,114,112 es el número de caracteres Unicode posibles al momento de escribir (los puntos de código 48-57 son los más fáciles de demostrar, por supuesto).
fuente