Hacer una impresora entera versátil es agradable y todo, pero escribir un solo código que imprima muchos números diferentes es engorroso. ¿No sería más fácil crear un guión que genere un número, pero que también le proporcione un nuevo guión para obtener el siguiente número?
Reto:
Escriba un código que genere un único entero N
y un código ejecutable. El siguiente código debe salir N+1
y un código que puede salir N+2
. Continúa este camino hasta llegar N = 15
. (El último número impreso debe ser 15).
Reglas:
- Sin entrada (suponga que la entrada está vacía).
- Se permite un programa o función completa u otros formatos convenientes.
- El primer código debería salir
1
. - No puede generar ceros a la izquierda. Es decir, no se puede imprimir
01
para1
. - La salida debe estar en el formato
N, Code_for_N+1
. Tenga en cuenta que la salida está separada por una coma y un solo espacio. El código paraN+1
no tiene comillas circundantes.N , Code_for_N+1
no se acepta (espacio delante de la coma). Las nuevas líneas finales están bien. - Los primeros caracteres de la salida deben ser el número. (Sin espacios iniciales, o
ans = N
). - El número impreso no debe ser parte del siguiente código (el código puede contener este número, pero no puede tomar el número de salida como parte del código)
- Ejemplo: La salida para
N=2
puede ser:2, printer 2
. En este caso,printer 2
es el código paraN=3
. No puede usar toda la salida:2, printer 2
como código paraN=3
.
- Ejemplo: La salida para
- Los guiones pueden estar en diferentes idiomas.
- Los tipos de datos son irrelevantes (el número puede ser una cadena), pero no puede estar rodeado de nada (comillas, paréntesis, etc.).
- Si se emite un código
N=15
, debe imprimirseSTOP!
(ver bonificación) o no imprimir nada (ni siquiera un espacio o una nueva línea).- El código para
N=15
no puede bloquearse (pero la salida a STDERR está bien). - Usted está descalificado si el código de salida para
N=15
impresiones16
o cualquier otra cosa (excepto el caso de bonificación).
- El código para
- Los operadores de quine incorporados no están permitidos.
- No está permitido acceder al archivo fuente a través del sistema de archivos.
Prima:
-10 bytes si el código que imprime 15 también produce un código que imprime " STOP!
"
Ejemplos que usan la sintaxis de Python: (obviamente, estos solo funcionarán para los enteros seleccionados, no del 1 al 15.)
N = 1
print "1, print 2"
1, print 2
---
N = 15
print 15
15
---
N = 15 (Qualifies for the -10 bytes bonus)
print "15, print 'STOP!'"
15, print 'STOP!'
print 'STOP!'
STOP!
----
N = 15 (Qualifies for the -10 bytes bonus)
print "15, disp('STOP!')"
15, disp('STOP!') (disp('STOP!') outputs STOP! in MATLAB)
----
N = 15 (This one is not OK. The submission is disqualified)
print "15, print 16"
15, print 16
Se aplican las reglas estándar de golf. ¡El código más pequeño (para N = 1) en bytes gana!
f=>f+""
¿sería inválido? (f+""
devuelve el código de construcción de la función).14, print(14+1)
o no?Respuestas:
Pyth + ///, 15 bytes - 10 = 5
Esto imprime
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, STOP!
en Pyth, quitandorange(1,15+1)
y quitando los corchetes de inicio y fin, e imprimiéndolo inmediatamente seguido de ", STOP!".Los siguientes catorce programas están en ///, que genera directamente todos los programas que no contienen
/
o\
. Entonces el segundo programada
2
y el tercer programa3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
. El penúltimo programa,15, STOP!
imprime15, STOP!
, por lo que el último programa es justoSTOP!
.fuente
cat
Cuenta como idioma?cat
no hace una prueba de primalidad, así que no.JavaScript, 131238-10 = 131228 bytes
El enfoque ingenuo resultó peor de lo esperado. En retrospectiva, debería haberlo esperado. Pero pensé en compartirlo de todos modos. Código completo aquí.
Idea: escapar iterativamente y agregar el
N-1, ...
fuente
CJam,
262524 bytesPruébalo en línea.
Los programas posteriores simplemente tienen el primer número incrementado. Esto ejecuta el programa 16 veces.
O con bonificación por el mismo puntaje:
Pruébalo en línea.
Los programas posteriores simplemente tienen el primer número incrementado. Esto ejecuta el programa 16 veces.
Solución alternativa para el bono:
fuente
</selfpromotion>
JavaScript (ES6),
6261 bytes - 10 bonus = 51 puntajeExplicación
Una solución que no lee su propio código fuente y tampoco es ridículamente larga.
El primer programa construye los otros 15 programas y los anida uno dentro del otro utilizando una función recursiva. Eludí el problema de la barra diagonal inversa al anidar las funciones mismas (que luego se convierten en cadenas durante la salida) en lugar de cadenas.
Prueba
Mostrar fragmento de código
fuente
"" + (n=>m)
no cuenta como obtener el cuerpo de la funciónn=>m
?Matlab,
226122-10= 202 bytesGracias a @StewieGriffin por unos pocos bytes =)
La primera parte es una cadena que representa la segunda línea (a continuación), el código real (solo desplazado por 9). En Matlab, las cadenas son matrices llenas de caracteres, por lo que puede realizar fácilmente los cambios simplemente agregando / restando un escalar. Entonces, el programa simplemente imprime la misma cadena * nuevamente, más la misma cadena pero desplazada, lo que da como resultado el código.
* No del todo: el primer byte es el contador que debe incrementarse en cada iteración.
El truco de quine con la cuerda fue robado descaradamente de aquí.
Aquí las últimas líneas de la secuencia copiadas de la consola:
fuente
JavaScript,
5047444244 * bytesEs una función que extrae su propio cuerpo (solo
a
) y realiza reemplazos en él. Conseguir que el cuerpo de la función sea una característica incorporada de JavaScript, aunque no sea explícitamente un operador de quine (si no es válido, eliminará la respuesta).En caso de que no funcione correctamente incrustado allí (porque para mí no lo hace), puede ver un ejemplo allí .
*: parece que el fragmento produce el resultado sin
a=
hacerlo, lo que hace que sea imposible realizar más llamadasfuente
.replace(x++,x)
?a=_=>(x=1)+(x<15?`, ${a}`:"").replace(x,x+1)
?Python 2.7.10,
19692-10 = 82 bytesWhee !!! Esto fue divertido. Mucho más corto ahora. :PAGS
Explicación:
Empecé con esto:
Eso es solo una quine simple. Esto es que con un contador agregado:
n
es una variable de contador que se imprime al principio. Luego, cuando imprime lan=
pieza, sustituyen+1
la%d
. Entonces desde aquí contará infinitamente.Y aquí está la versión final. Agrega una cláusula if para detenerse en 15, e imprime "STOP!" también.
Código antiguo
Nunca va a ganar, pero es divertido. : PMucho más corto ahora, aunque todavía no tengo ninguna posibilidad. :PAGSfuente
else
s.PowerShell,
(215-10) = 205197167106104103 bytes(Si su única herramienta es PowerShell, cada problema parece un clavo. Espere ...)
En esencia, se comienza con la configuración
$d
igual a una cadena de grandes ole-largo de un casi- quine del código original. Genera1
y luego$d
con el operador de formato-f
para rellenar correctamente el{0}
,{1}
,{2}
ins-pie, incrementando el{2}
número de la,1*{2}
sección en uno cada vez.La
,x*y
operación en PowerShell crea una nueva matriz dey
elementos, cada uno de los cuales es igual ax
. Por ejemplo,,2*3
es equivalente a@(2,2,2)
.Esto significa que la primera salida será
1, $c=(,1*2).length;$d=(etc...)
, por lo tanto, cuando se ejecute el segundo código,$c
será igual al recuento de la matriz@(1,1)
, o2
etc. Tenga en cuenta que$c
no se utiliza como una variable en el código original, justo en carreras subsiguientes.Se detiene cuando imprime 15 simplemente calculando si
$c
es igual15
y luego indexando en una matriz, el elemento 0 es$c, $d
como se describió anteriormente, el otro es justo15
. Por lo tanto, cuando$c
sea 15, generará15
y nada más. No califica para la bonificación, porque"15, {0}STOP!{0}"
son 5 caracteres demasiado largos para que valga la pena el -10.Requiere un terminal PowerShell de ancho> ~ 150. O para que elimine manualmente el salto de línea adicional (que la terminal ayude inserta ajuste de salida) al copiar y pegar el código. O para que capture la salida en una variable y luego vuelva a ejecutar esa variable. Etc.
Edición 1: guardado algunos bytes al eliminar "¡DETENER!" fraseología.
Edición 2: Durr, no uses .length cada vez, solo llámalo una vez
Edición 3: no es necesario que sea una quine, por lo que la ejecución inicial puede ser mucho más corta
Edición 4: cambió de usar cadenas a matrices para calcular
$c
, lo que ahorró dos bytes. Estoy bastante seguro de que esto es casi óptimo para este enfoque.Edición 5: guardado otro byte contando directamente la igualdad en lugar de modificar
fuente
JavaScript, 79-10 = 69 bytes
Sin usar
Function.prototype.toString
de ninguna manera.fuente
Befunge, 57-10 = 47 bytes
Este es asombroso. Probarlo aquí .
fuente
STOP!
Lote, 73 + 5 - 10 = 68 bytes
Requiere,
CMD /V:ON
así que agregué 5 bytes para eso.fuente
Python 2.7, 107 caracteres
Al usar la recursividad y no escribir un quine, pensé que podría ahorrar mucho, lo cual es cierto, pero no lo suficientemente bueno. Aunque no es un ganador, creo que el enfoque es divertido de compartir.
Comencé haciendo una cadena para N = 4, escapando de los caracteres
\
y"
.Luego creé una función lambda que crea esta cadena, basada en un índice de inicio y un índice de detención, utilizando la recursividad. Eso es todo:
Úselo así:
Salida: [32902 caracteres, demasiado largos para manejar]
Entonces, parece que mi enfoque de complejidad kolmogorov no es tan exitoso ;-)
fuente
SMBF , 28 bytes
\x10
representa un byte literal (valor decimal 16). El entero se emite como un entero (byte). Entonces la salida del primer carácter es\x01
. El programa luego imprime ",". Al imprimir su propia fuente, imprime un extra+
al principio.Explicación:
Tenga en cuenta que no puede ejecutar esto en un intérprete estándar porque requiere un literal hexadecimal en la entrada. También necesita un terminal especial para que la salida hexadecimal funcione correctamente.
fuente
Bash,
787473-10 = 63 bytes (Ejemplo, no puede ganar)Llegué tarde, pero vi que bash no había sido probado, así que probé. Primer desafío del golfo y rompecabezas tipo quine. ¡Ellos son divertidos!
Explicación:
Esto funciona porque los
a
pasos del 1 al 15 y luego esunset
junto conp
. El script (almacenado enp
) los imprime a ambos si estánset
y "¡DETÉNGASE!" de otra manera. Inicialmenteunset
a
esset
0 porque aparece en una expansión aritmética.fuente
𝔼𝕊𝕄𝕚𝕟, 30 caracteres / 47 bytes (no competitivo)
Try it here (Firefox only).
Finalmente encontré una buena quine verdadera para 𝔼𝕊𝕄𝕚𝕟.
Explicación
Aquí está la verdadera quine que usé:
⟮ⒸⅩ222+ᶈ0
¿Lo ves en mi respuesta? Con suerte, ustedes podrán expandirse desde allí.
fuente
Barrilete + PHP, 19-10 = 10 bytes
Cuenta de 1 a 15 y luego se detiene. TIO
Barril, 13 bytes
fuente