Es el 10 de agosto de 2019, pero su tarea aún involucra Y2K. Raro, verdad?
Cree un programa que se imprima solo, con un número de dos dígitos adjunto. La primera vez que lo ejecute, debería agregar 00 a su salida (su código fuente, porque esta es una variante quine). Cuando ejecuta esa salida, el programa original sin un número de dos dígitos, debe generar el programa original, pero con 01 añadido. Ejecute esa salida para obtener el programa OG con 02 añadido, luego para obtener el programa con 03 ... Esta cadena debería continuar hasta 99. Ese programa debería salir BREAKING NEWS: WORLD ENDS
.
Si su programa es Y2Kparanoia: yes
entonces:
- Debería salir
Y2Kparanoia: yes00
- Esa salida debería imprimir
Y2Kparanoia: yes01
- Esa salida debería imprimir
Y2K paranoia: yes02
- Repita hasta el paso 100: este programa emite las noticias del día del juicio final especificadas
Este es el código de golf, por lo que gana el programa más corto que puede imprimirse mientras sigue estos pasos.
2Kparanoia: yes97
y produciendo2Kparanoia: yes98
, así que ¿no debería (4) leerRepeat to step 100, but step 101 will output "BREAKING NEWS: WORLD ENDS"
? (es decir,2Kparanoia: yes99
produce la noticia)Respuestas:
Perl 6 ,
122114106bytes-8 bytes gracias a Shelvacu
Pruébalo en línea!
Toma el formato estándar de quine y agrega la cadena de noticias de última hora, así como una nueva llamada de función con el número adjunto. Esto se utiliza
END
para ejecutar la función cuando finaliza el programa.fuente
END
y unaour
variable:END {<print $s-199??"END\{<$_>~~.EVAL};our\$s="~($s-1&&$s-99)+100!!"BREAKING NEWS: WORLD ENDS">~~.EVAL};our$s=1
Ruby,
158154146128122100 bytesInspirado por esta respuesta .
EDITAR: pude eliminarlo
(s.split(35.chr)[0]+35.chr).inspect
y reemplazarlo cons[0..-2]
(rango de cada valor excepto el último) y la%{ ... }
sintaxis de cadena que usé antes. ¡Guardado 22 bytes!Versión antigua:
EDITAR: guardó un par de parens (y el par correspondiente en la sección de datos) al darse cuenta de que
"BREAKING NEWS: WORLD ENDS"
es una cadena de formato perfectamente válida, y ruby ignora los parámetros extraneos.Al iniciar este me di cuenta de que, dado que el número tiene que ir al final del programa, y el rubí no permite el uso de variables antes de que se declaran, que tendría que hacer que el código se ejecute después de los dígitos de alguna manera. Podría haber hecho algo como lo
def a(s) ... end;a 1
que sería...end;a 100
, sin embargo, usar laEND
sintaxis menos conocida de Ruby usa menos bytes. Sin embargo, el bloque interiorEND
tiene un alcance diferente, por lo queS
debe ser una variable global o constante.Explicación:
END{ ... };S=1
: Ejecute el bloque de código justo antes de que finalice el programa; Establezca constanteS
en1
(o100
-199
en futuras iteraciones)$><<( ... )
:$>
es un atajo en ruby para stdout, y<<
en un IO escribe en el IO. Los padres son obligatorios, de lo contrario se convierte en($><<S)>198...
S>198?"BREAKING NEWS: WORLD ENDS":(q=...)%[q,S<2?0:S-99]
: Si tuviera que dividir esto en un código un poco más razonable sería:El
%
operador aplicado a una cadena es efectivoprintf
, con LHS como cadena de formato y RHS como argumentos.%{ ... (q=%%{%s}) ... S=1%02d}
: ruby tiene una sintaxis interesante para las cadenas que también permite que aparezcan pares de llaves dentro de la cadena sin escapar siempre que estén equilibradas. Esto es muy útil, ya que de lo contrario una quine similar tendría que escapar de la cadena para colocarla en sí misma como un literal de cadena. Las dos sustituciones en la cadena de formato son%s
para una cadena normal y%02d
para un número rellenado a la derecha a un tamaño de 2 con el carácter0
.Mis pensamientos sobre acortar aún más:
Sería bueno poder usarlo enEDITAR: ¡Las constantes son globales y pueden ser un solo personaje!s
lugar de hacerlo$s
, pero al definir ss=$s;
o hacer una función,def a(s) ...
ambos usan más bytes de los que guardan, y no se me ocurre otra forma de hacerlo.S
siempre fuera menor100
, de modo que pudiera compararse usando números de 2 dígitos en lugar de números de 3 dígitos. Sin embargo, si utilizoS=0
al final, los dos dígitos siguientes se interpretan como octal, y8
y9
son válidos y todo está litera.S=
simplemente no es válido, y no conozco otra forma de hacer que un valor sea válido tanto antes como después de agregar dos dígitos. Es de destacar que0
(y cualquier otro número entero) es verdadero en rubí.Cualquier idea sobre cómo hacer esto más corto, ¡hágamelo saber!
Pruébalo en línea!
fuente
s=100-1
? Entoncess
será 99, 0, -1 ...- 99, y-s
será -99, 0 ... 99.Ir,
382366354340305298272bytesNo ganará pero me divertí con el desafío.
¡Pruébalo en Go Playground!
Basado en una quine. Si la variable
n
es inferior a 199, agrega a la variable de cadenan
un acento grave (\x60
), el carácter de Go para cadenas de varias líneas, seguido de una coma,
. Continúa imprimiendo los primeros 147 caracteres des
(para evitar imprimir,
porque solo ocurre al final), luego imprimes
como un todo y finalmente imprime100
sin == 1
y de lon+1
contrario. El resultado es que las ejecuciones sucesivas cambian la variablen
al final del programa a 100, 101, etc. Si la variablen
es 199 o más, imprime las últimas noticias.fuente
Haskell ,
240232218216 bytesPruébalo en línea!
Adaptado de una quine
fuente
JavaScript (ES6), 116 bytes
94 bytes, si se permiten funciones de cadena
fuente
f=${f}
), eso no es una quine según codegolf.meta.stackexchange.com/a/4878/13400C # (compilador interactivo de Visual C #) , 193 bytes
Pruébalo en línea!
fuente
Pyth ,
8180 bytesPruébalo en línea!
Explicación:
Y el código en la cadena es (noticias de última hora acortadas):
fuente