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 truey 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
fen 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
traptruco: llamartrapdentro de latrapacción simplemente imprime esa línea. A continuación, ese resultado se canaliza a loxxdque lo convierte en binario (desafortunadamentexxd -bpno 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é
Nestamos usando (recuerde que esa es la parte que debe incrementarse después de cada llamada), simplemente intente configurarxel contenido del archivofy, 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
Str1almacena 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 deStr1sí mismo.Suponemos que el programa comienza en una calculadora cuya memoria acaba de borrarse, por lo que
Xes 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,32y 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 scontiene el código fuente sin formato%sse utiliza para poner esta cadena en sí misma cons.format(...)%c,%1$cy34se 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/8se truncará automáticamente en la división de enteros, por lo que cuandoies -7 a 0, se convertirá0; siies -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&7será7,6,5,4,3,2,1,0,7,6,5,4,3,2,1,0,..., donde el primero7es cuándoi=0(que se convierte en el-1primero 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,...:;...&1luego emite un0si es un número par, y1si 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/8se truncará automáticamente en la división de enteros, por lo que cuandoies 0-7, se convertirá0; siies 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.255es0xFFo11111111(el valor máximo para un byte sin signo)256es0x100o100000000.&transmisión del carácter ASCII a un número entero. En ese punto, se encuentra entre0y255(00000000a11111111).Long.toString(...,2)lo convierte a la representación de cadena binaria de 9 bits+256y.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;ose 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)&1o=_=>('o='+o).charCodeAt(('n'in top?++n:n=0)/8|0)>>(7-n%8)&1'n'in top?++n:n=0que puede utilizar++n||(n=0)o++n?n:n=0, on=++n||0, on=1+n||0la que todos utilizar el falsiness deNaNque se produce mediante el incrementoundefinedo=_=>('o='+o).charCodeAt((o.n=1+o.n|0)/8)>>(~o.n&7)&1q / kdb + , 45 bytes
Solución:
Ejemplo:
Explicación:
Yo creo que entendí el breve.
Primero configure una variable global
acon un valor inicial de-1. La funciónfconstruye 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