Dada una matriz de enteros positivos A
como entrada, genera un programa que, cuando se repite por k
tiempos , genera el valor k
th (1-index) de la matriz.
Por ejemplo, si la matriz es [1,11]
, la salida debe ser un programa que emite 1
, y cuando se repite dos veces, la salida 11
. El código como print(end="1");
en Python 3 funciona: print(end="1");
imprime 1 e print(end="1");print(end="1");
imprime 11
La suma más pequeña de longitudes de código para resolver todos los casos de prueba gana. Su metacódigo debería resolver 500 casos de prueba en 60s, y cada uno de sus códigos de solución debería regresar en 10s. El metacódigo y el código de la solución no necesitan estar en el mismo idioma, pero todas las soluciones que genere su metaprograma deben estar en el mismo idioma.
Los datos de prueba previa y el generador se pueden ver aquí . 7 días después utilizará la suma del tiempo de envío (por ejemplo, 12:34, 1234) para ser la semilla aleatoria y generar otro caso de prueba como el caso de prueba final.
La semilla final es 7335 en GMT + 8, por lo que los datos de la prueba final están aquí
fuente
print(end="1");
repetido 2 veces esprint(end="1");print(end="1");
x
. Luegox
debería dar el primer elemento de la lista,xx
debería dar el segundo elemento de la lista,xxx
debería dar el tercero, y así sucesivamente.Respuestas:
Python 3 , genera Stax
Esto usa una variedad de estrategias. La mayoría de las estrategias solo se aplican bajo ciertas condiciones, pero hay una estrategia alternativa que siempre es utilizable. Al final, se selecciona el programa candidato más pequeño.
Pruébalo en línea!
Actualización: Validación Llevará mucho tiempo ejecutar cada multiplicidad de cada programa por separado. Es posible ejecutarlos todos al mismo tiempo. Para hacer esto, se debe usar una pequeña pieza de código. Es responsable de algunas cosas.
Hacer salida implícita si hay alguna. Normalmente, al final de un programa stax, la parte superior de la pila se imprime si no ha habido otra salida. Al ejecutar varios programas en el mismo archivo fuente, esto debe hacerse explícitamente.
Despeja ambas pilas.
Restablecer registros. Para estos programas solo se utiliza el registro x.
Esta repetitiva debe aplicarse después de cada programa individual que se ejecutará.
Por ejemplo, la entrada
[5,2,7,3]
produce el programa stax3527E|X@
. Las cuatro multiplicidades se pueden probar a la vez.Pruébalo en línea!
De esta manera, es posible probar todas las multiplicidades de todos los programas en la misma ejecución, suponiendo que nada se rompa. Probablemente sería el programa stax más grande que se haya ejecutado si se realizan las 500
fuente
Perl 5
-p
, genera Perl 5-p
, gastos generales191713-1 gracias a @Dom Hastings
La puntuación para una entrada será
length of the input + 13
. Obviamente, se puede mejorar generando programas de autodescompresión para entradas más grandes, pero no me molestaré.Proporcione la matriz de entrada separada por comas en una línea en STDIN.
Pruébalo en línea!
Ejecute los
n
tiempos concatenados de salida sin entrada (por ejemplo, redirigir desde / dev / null)Ejemplo de forma de ejecutarlo para la entrada
2,6,4,7
y el programa resultante se repite 4 veces:Pruébalo en línea!
Si no le gusta que el programa resultante intente leer desde STDIN, use esta versión con la sobrecarga 17:
Pruébalo en línea!
Ejemplo de forma de ejecutarlo para la entrada
2,6,4,7
y el programa resultante se repite 4 veces:Pruébalo en línea!
Esta versión se bloquea después de imprimir la salida requerida
fuente
s/ /,/g;$_="die say+($_)[\$-++],"
?05AB1E , genera 05AB1E
Pruébalo en línea!
El programa generado para la entrada
[5,17,7,13,2]
es"5 17 7 13 2"#.g<è
.Conjunto de pruebas para [5,17,7,13,2]
La duración del programa generado es
len(input) + 5
fuente
len(input)
no es el recuento de enteros, sino la longitud de la cadena que los contiene a todos. Al principio entendí mal.APL (Dyalog Unicode)
Prefijo anónimo lambda. Devuelve un cuerpo del programa.
Pruébalo en línea!
Métodos
Esto explora varios métodos y devuelve el primero utilizable, eventualmente recurriendo a un método universalmente aplicable.
Solo elemento
Si la lista tiene solo un elemento, se devuelve tal cual.
2, 22 etc.
Se puede repetir un solo dígito para generar el número 11 veces más grande,
Todos iguales
Acabamos de devolver el
⊢
número ( ) más a la derecha .Lineal
Las secuencias f (n) = k × n simplemente insertan un signo más antes del primer término.
Factorial seguido de todos los 1s
Cuando el primer número n =! My los números siguientes son 1, entonces
!m
es una solución porque!m
es n ym!m
es 1 y!1
es 1.b ab ab ab
Como todos los números de dos dígitos son más grandes que todos los números de un solo dígito, un máximo continuo, donde el frente del primer número está pegado a la parte posterior del segundo número, es una solución.
El código de tres líneas
Compruebe si alguna fórmula del tipo
+a×b
es válida.Caída de cuerda
Las secuencias largas sin números inferiores a 5 (porque 4 es un salto de línea) se pueden codificar como caracteres del SBCS.
Desplazamiento de la cadena de retroceso
Si hay números menores a 5, subimos 9 para evitarlos.
Retroceder
Concatenación de cadena simple de la cadena
"{⍺←⊃⋄1⌽⍺⊢⍵}"
y la⍕
entrada stringified ( ). Por ejemplo,[3,1,4]
devuelve el cuerpo del programa{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
.La parte entre llaves es una función ambivalente, lo que significa que puede ser una función de prefijo o una función de infijo. Por lo tanto, la instancia más a la izquierda se ejecutará en modo prefijo y todas las demás en modo infijo. La diferencia entre los modos es si
⍺
, significando el argumento izquierdo, tiene un valor. Si no es así, se le asignará la función⊃
(primero).Explicación del método alternativo
{
…}
Lambda anónima:⍺←⊃
Si no hay argumento izquierdo (⍺
), asigne la función⊃
(primero) a⍺
⋄
entonces:En este punto, el siguiente código significa dos cosas diferentes dependiendo de si se
⍺
trata de una lista de números (llamada infijada) o la función "primero" (llamada prefijada).Si
⍺
es una lista de números:⍺⊢⍵
descartar el argumento izquierdo a favor del argumento derecho1⌽
gire ese paso hacia la izquierdaSi
⍺
es la función "primero":⊢⍵
dar el argumento correcto⍺
elige el primer elemento de eso1⌽
gírelo un paso (un no-op en un escalar)Ejemplo de ejecución del método alternativo
Al ejecutar
3 1 4
el código{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
,, asigna la "primera" función⍺
y, por lo tanto, devuelve el primer elemento;3
.La ejecución
{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
permite que la lambda más a la derecha "capture" la izquierda3 1 4
como su argumento izquierdo, por lo que⍺
tiene un valor que se descarta a favor del3 1 4
cual luego se gira un paso hacia la izquierda y se obtiene1 4 3
como resultado. Esto se usa como único argumento para el lambda más a la izquierda, donde se⍺
convierte en la "primera" función, lo que hace que el resultado sea el primer elemento;1
.La ejecución
{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
permite que la lambda más a la derecha "capture" el medio3 1 4
como su argumento izquierdo, que luego se descarta a favor del argumento derecho3 1 4
, que cuando se gira un paso hacia la izquierda lo es1 4 3
. Esto se usa como argumento derecho de la lambda media junto con el3 1 4
argumento más a la izquierda como izquierdo. El argumento de la izquierda se descarta por el de la derecha, que gira un paso hacia la izquierda4 3 1
. Esto se convierte en el único argumento de la lambda más a la izquierda, por lo que se⍺
convierte en la "primera función", devolviendo el primer elemento;4
.Puntuación
Cuando llegue el momento de realizar la prueba con datos reales, use este arnés de prueba (vinculado con datos de prueba previa). Los casos de prueba van en el campo Entrada, y la Salida será el recuento total de bytes de los 500 programas juntos. (También arrojará un error, pero eso es solo porque luego intenta evaluar la entrada tal como está).
fuente
Carbón
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Salida de la cadena literal
⎚§⪪
.Convierta la matriz de entrada en una cadena, únase con espacios e imprima.
Salida de la cadena literal
¦ Lυ⊞υω
.Salida de por ejemplo
5,17,7,13,2
es⎚§⪪5 17 7 13 2¦ Lυ⊞υω
. Pruébalo en línea! Explicación:Borre el lienzo para que solo se vea la última salida.
Tome la longitud de la lista predefinida
u
. Use eso para indexar en la lista de enteros que se han dividido en espacios y generar el elemento seleccionado.Empuje una variable ficticia a la lista predefinida
u
, de modo que la próxima copia muestre el siguiente elemento de la lista.Longitud total de salida = (longitud de todos los enteros en todas las listas) + (número de enteros en todas las listas) + (número de listas * 9) caracteres (SBCS).
fuente
Haskell , genera Haskell
Pruébalo en línea! Para el primer caso de prueba
[5,2,7,3,2,3,15,10,7,2,14,11,16,16,3,3,4,3,8,4]
produce el siguiente programa:Pruébalo una vez , duplicado y triplicado . Esto usa el mismo enfoque que mi respuesta de Haskell para Doblar la fuente, tú doblas la salida .
La longitud de cada programa generado es la longitud de la lista de entrada como cadena más 25, por lo tanto, la puntuación para los casos de prueba disponibles actualmente es
12266 + 500 * 25 = 24766
. Esto muestra que la relación de código a datos es básicamente igual, y dudo que sea posible escribir un código de descompresión lo suficientemente pequeño que disminuya la puntuación. Podría ser posible si las listas fueran mucho más grandes.fuente
Python 2 , genera Python 2
Pruébalo en línea!
Para la entrada
el programa generado es
que es de 98 bytes.
Adaptado de esta solución en "Doblo la fuente, ¡doblas la salida!".
Maldición, aparecieron dos respuestas más cortas antes de que terminara de escribir esta respuesta.
fuente
k
print
asys.stdout.write
para eliminar el "algo" final.Java 8, genera Python 2
Pruébalo en línea.
Es decir,
[3,4,5,6,7]
genera este programa Python 2:Pruébelo en línea una vez ; Pruébelo en línea dos veces ; Pruébelo en línea tres veces .
El programa Python generado se basa en la respuesta de @ Mr.Xcoder por tercera vez al desafío del encanto .
Explicación:
Código Java 8:
Código de Python 2:
fuente
Bash, programas de salidas en Perl 5
El programa Bash se puede llamar como
script.sh 1,2,3
.Se debe llamar al programa Perl con la
-E
bandera.El
perl
código generado para una entrada de4,7,8
es:Bastante fuerza bruta. Elimina un elemento de la matriz (
perl
no le importa que la matriz no exista al principio), lo configura si aún no está configurado. Luego hace eco del primer elemento de la matriz al final. (ElEND
bloque se ejecuta en último lugar). Elexec 'true'
sale del programa, de manera que los másEND
bloques no se ejecutan.Ejemplo:
fuente
Python 2, genera C ++
Esto no va a batir ningún registro, estaba principalmente interesado en pensar si podría descubrir cómo hacerlo :) Use el hecho de que las variables globales se ejecutan antes que main, y así puede incrementar una variable global, luego usar un #ifdef para garantizar que main solo se defina una vez.
fuente
Encantamientos rúnicos , genera Runic
Pruébalo en línea!
Toma datos como una lista de valores separados por espacios.
Salida hecha una vez
Salida hecha dos veces
Salida hecha cuatro veces
Utiliza el comando de modo de lectura numérico continuo,
´
que se confirmó el 12 de enero y encontré esta pregunta el 14. Este comando permite la codificación de valores de longitud arbitrarios, ya que sin esta característica sería muy difícil hacerlo (por ejemplo1392
, necesitaría ser representado como1X3+X9+X2+
, lo que requiere un bucle adicional como mínimo); precisamente el problema que quería resolver cuando creé el´
comando.En el código original, el
|
de las cuerdas"{Zs$;|1|l;|y"
y"UwR'10<|I+}"
se sustituyen por\n
(que se sientan en la red y lo modifica, como lo harían normalmente) conw
comandos de rito:74akw
,94/Rakw
,c4akw
, y85akw
. Los personajes originales pueden ser literalmente cualquier cosa.|
fue elegido para ser un marcador de posición simbólico que representaba visualmente lo que quería. Se guardan varios bytes (si no se anulan) al no tener que agregar reflexivamente un punto de entrada, ya que sewR'10<
escribeR
en una ubicación donde ya existe uno (posición0,1
), y luego se llena su pila de basura antes de quedarse sin maná, luego de un bucle secuenciaU"'i34
.El código de salida resultante funciona utilizando el
w
comando rite para cambiar el primer carácter en la segunda línea a unaR
redirección ight (por lo que solo una IP ejecuta una declaración de impresión), con un uso inteligente de la longitud de la pila como resultado de programas cada vez más altos para determinar qué índice leer. Cualquier otra IP cambia esa misma ubicación a la misma instrucción y termina. Todo lo demás queda sin usar.La imagen no está actualizada, pero es suficiente para la explicación del flujo.
Cada ejecución de
1Iy
mantiene la capacidad de la IP para manejar una pila cada vez más grande (causada por ell
comando), cuyo tamaño permite que el programa determine cuántas copias del código fuente base hay. El final1
se usa para incrementar el número anteriorl
al requerido al girar la pila (creada a continuación) para llegar al valor correcto. ElZ
comando niega este valor para que la pila gire en la dirección correcta.La matriz de entrada original se codifica utilizando el modo de lectura continua, cebada con un 0 para evitar modificar gradualmente el mismo valor, para leer las entradas originales. Se requiere el espacio NOP para salir del modo de lectura continua y permitir que el 0 posterior cebe la pila nuevamente.
La puntuación debe ser aproximadamente igual
3+v.toString().length
, para cada entrada de matrizv
,+23
para cada matriz. Aproximadamente(2.55*total length of input)
o33837
para la entrada de muestra, si hice las cosas bien.Se introdujeron cambios menores en mi programa final esperado debido a los efectos secundarios introducidos en la misma compilación con respecto al
s
comando, sin embargo, resultó en una mejor puntuación al mismo tiempo.fuente