Escriba un programa o función no vacío que, cuando se llama, genera un valor único, 1 o 0, y cuando se lo llama varias veces, los números de salida producen la representación binaria del código fuente de su programa (en la misma página de códigos desde la que se compila su código /interpretado).
Por ejemplo, si su código fuente fuera abc
(en ASCII), los resultados serían:
1st call: 0 // ASCII letter 'a'
2nd call: 1
3rd call: 1
4th call: 0
5th call: 0
6th call: 0
7th call: 0
8th call: 1
9th call: 0 // ASCII letter 'b'
10th call: 1
11th call: 1
12th call: 0
13th call: 0
14th call: 0
15th call: 1
16th call: 0
17th call: 0 // ASCII letter 'c'
18th call: 1
19th call: 1
20th call: 0
21st call: 0
22nd call: 0
23rd call: 1
24th call: 1
After the 24th call, the behaviour is undefined.
La representación binaria de la fuente debe contener al menos un bit 0 y un bit 1.
En lugar de 1 y 0, puede generar dos valores distintos y consistentes (como true
y false
).
Los programas auto modificables que generan la representación binaria de la fuente original están permitidos, siempre que no lean el código fuente para averiguar qué imprimir a continuación.
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
Bash , 105 bytes
NOTA : Asegúrese de no tener un archivo importante llamado
f
en el directorio que está probando.Si desea probar esto, puede usar el siguiente comando:
Lo que debería dar el mismo resultado
xxd -c1 -b path/to/script.sh|cut -d\ -f2|tr -d \\n
.Explicación
Esto está utilizando el
trap
truco: llamartrap
dentro de latrap
acción simplemente imprime esa línea. A continuación, ese resultado se canaliza a loxxd
que lo convierte en binario (desafortunadamentexxd -bp
no funciona, por lo tanto, la solución concut
&tr
):A partir de eso, solo estamos interesados en un bit (digamos
N
) con el que podemos seleccionarcut -cN
.Para saber qué
N
estamos usando (recuerde que esa es la parte que debe incrementarse después de cada llamada), simplemente intente configurarx
el contenido del archivof
y, si no existe, configúrelo en 1:Lo último que debe hacer es actualizar el archivo
f
, escribiéndolex+1
:fuente
TI-Basic (TI-83 series),
592357309 bytesEsta tabla es una posible referencia para la representación binaria de la calculadora del código fuente, aunque finalmente utilicé el depurador de Virtual TI.
Para comparación y / o interés histórico: las primeras citas escritas en TI-Basic .
Cómo funciona
Str1
almacena el código fuente (ahora en glorioso hexadecimal, ahorrando mucho espacio sobre la versión binaria anterior), dejando de lado los bits donde se representaría el contenido deStr1
sí mismo.Suponemos que el programa comienza en una calculadora cuya memoria acaba de borrarse, por lo que
X
es así0
. Cada vez a través del programa, incrementamosX
.Por lo general, solo descubrimos el medio byte del que estamos tratando de extraer un poco, leerlo
Str1
, convertirlo de hexadecimal a binario e imprimirlo. Si estamos en la parte del código fuente que está almacenandoStr1
(que es dos tercios de la longitud total del programa), entonces primer movimiento de la parte correspondiente de la cadena de almacenamiento31
,32
y así sucesivamente.fuente
Java 8,
249241237234148 bytesLo siento de antemano por las largas explicaciones. :)
Pruébalo aquí
Explicación:
Explicación adicional:
quine -parte:
String s
contiene el código fuente sin formato%s
se utiliza para poner esta cadena en sí misma cons.format(...)
%c
,%1$c
y34
se utilizan para formatear las comillas dobles ("
)s.format(s,34,s)
lo pone todo juntoPruébelo aquí con algunas partes eliminadas / modificadas para verificar que quine genera su propio código fuente.
parte binaria :
-i/8
se truncará automáticamente en la división de enteros, por lo que cuandoi
es -7 a 0, se convertirá0
; sii
es -15 a -8, se convertirá1
; etc.s.charAt(-i/8)
toma el carácter actual del código fuente, ocho veces uno después del otro. Pruébelo aquí con una versión modificada.--i&7
será7,6,5,4,3,2,1,0,7,6,5,4,3,2,1,0,...
, donde el primero7
es cuándoi=0
(que se convierte en el-1
primero debido a--i
, y seguirá disminuyendo).s.charAt(-i/8)>>(--i&7)
producirá secuencias dependiendo de los personajes. Algunos ejemplos ('A'
(65) a'E'
(69) son):0,1,2,3,4,8,16,32,65,0,1,2,4,8,16,32,65,...
;0,1,2,4,8,16,33,66,0,1,2,4,8,16,33,66,...
;0,1,2,4,8,16,33,67,0,1,2,4,8,16,33,67,...
:;0,1,2,4,8,17,34,68,0,1,2,4,8,17,34,68,...
:;0,1,2,4,8,17,34,69,0,1,2,4,8,17,34,69,...
:;...&1
luego emite un0
si es un número par, y1
si es un número impar, que en combinación con las secuencias anteriores produce el resultado correcto.Antigua respuesta de 233 bytes :
Pruébalo aquí
Explicación:
Explicación adicional:
quine -parte:
Misma explicación que la anterior, con la adición de:
%%
es la forma escapada del módulo-signo (%
)Pruébelo aquí con algunas partes eliminadas / modificadas para verificar que quine genera su propio código fuente.
parte binaria :
i/8
se truncará automáticamente en la división de enteros, por lo que cuandoi
es 0-7, se convertirá0
; sii
es 8-15, se convertirá1
; etc.s.charAt(i/8)
toma el carácter actual del código fuente, ocho veces uno después del otro. Pruébelo aquí con una versión modificada.255
es0xFF
o11111111
(el valor máximo para un byte sin signo)256
es0x100
o100000000
.&
transmisión del carácter ASCII a un número entero. En ese punto, se encuentra entre0
y255
(00000000
a11111111
).Long.toString(...,2)
lo convierte a la representación de cadena binaria de 9 bits+256
y.substring(1)
se asegurará de que haya ceros a la izquierda, y convertirá el de 9 bits a 8 bits.Pruébelo aquí con algunas partes eliminadas / modificadas para verificar los bytes completos.
fuente
int i;v->{String s="int i;v->{String s=%c%s%1$c;return 1&s.format(s,34,s).charAt(-i/8)>>(--i&7);}";return 1&s.format(s,34,s).charAt(-i/8)>>(--i&7);}
Javascript ES6,
735852 bytesExplicación
Desglose del código:
o=_=>
: define una función.`o=${o}`
: construye una cadena;o
se convierte en una cadena, que en este caso es el código fuente de la función..charCodeAt(
: obtiene un carácter en la cadena como su código de carácter ASCII.(o.n=1+o.n|0)/8
: selecciona un personaje. Aquí también es donde se incrementa el contador.)>>(7-o.n%8)
: cambia el código de caracteres resultante para que el bit deseado esté en la posición correcta.&1
: establece todos los demás bits a 0.fuente
o=_=>(o+'').charCodeAt(('n'in top?++n:n=0)/8|0)>>(7-n%8)&1
o=_=>('o='+o).charCodeAt(('n'in top?++n:n=0)/8|0)>>(7-n%8)&1
'n'in top?++n:n=0
que puede utilizar++n||(n=0)
o++n?n:n=0
, on=++n||0
, on=1+n||0
la que todos utilizar el falsiness deNaN
que se produce mediante el incrementoundefined
o=_=>('o='+o).charCodeAt((o.n=1+o.n|0)/8)>>(~o.n&7)&1
q / kdb + , 45 bytes
Solución:
Ejemplo:
Explicación:
Yo creo que entendí el breve.
Primero configure una variable global
a
con un valor inicial de-1
. La funciónf
construye la representación binaria de la representación de cadena de la función (todo incluido el{}
) antepuesto con laa:-1;f:
basura, e indexa en esta lista binaria en el índice a (que se incrementa en cada llamada).fuente
Python 2 , 164 bytes
Pruébalo en línea!
Explicación
Comencemos con una quine estándar de Python 2.
Bien, bueno, esto lo genera así. ¡Necesitamos binario!
Correcto, eso simplemente convierte todo a binario. Pero el título dice "un poco a la vez". Necesitamos algo para persistir a través de múltiples ejecuciones. Lo sé, ¡hagámoslo una función!
Espera, eso no ayuda ... Hmm, ¿cómo podemos hacer un seguimiento del índice del bit necesario para la salida? Ooh, ooh, tengamos un número entero para hacer un seguimiento.
Um ... eso siempre genera el primer bit. ¡Oh, necesitamos incrementar el rastreador! Oh, mierda, Python no permite que se modifiquen los enteros como argumentos predeterminados. Y las asignaciones no son expresiones en Python, por lo que no puedes hacer eso en una lambda. Welp, esto es imposible en Python, caso cerrado.
... Bueno, no del todo. Python hace permitir que las listas como argumentos por defecto a ser modificados. (Y muerde a los programadores de Python todo el tiempo.) ¡Usemos su longitud!
Sin embargo, eso todavía no modifica el rastreador ... Podemos agregarle algo para aumentar su longitud ... ¿Pero cómo? Ah, bueno, lo tenemos
list.append
.lst.append(1)
es equivalente alst += [1]
. ¡Excelente!Vaya, esto omite el primer bit porque la longitud del rastreador es 1 antes de que salga el bit. Necesitamos disminuir la longitud donde se usa.
¡Ahí está, amigos! ¡Golf y tienes mi solución!
fuente
Perl 5 , 59 bytes
Pruébalo en línea!
fuente