Escreva um programa ou função não vazio que, quando chamado, gera um único valor, 1 ou 0, e quando chamado várias vezes, os números de saída produzem a representação binária do código-fonte do seu programa (na mesma página de código da qual seu código é compilado / interpretado).
Por exemplo, se seu código-fonte fosse abc
(em ASCII), as saídas seriam:
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.
A representação binária da fonte deve conter pelo menos um bit 0 e um bit 1.
Em vez de 1 e 0, você pode gerar dois valores consistentes e distintos (como true
e false
).
Os programas de modificação automática que emitem a representação binária da fonte original são permitidos, desde que eles não leiam o código-fonte para descobrir o que imprimir a seguir.
Isso é código-golfe , então a resposta mais curta em bytes vence.
Bash , 105 bytes
NOTA : Verifique se você não possui um arquivo importante chamado
f
no diretório em que está testando isso.Se você quiser testar isso, poderá usar o seguinte comando:
Qual deve dar a mesma saída
xxd -c1 -b path/to/script.sh|cut -d\ -f2|tr -d \\n
.Explicação
Isso é usar o
trap
truque - chamartrap
dentro datrap
ação simplesmente imprime essa linha. Em seguida, essa saída é canalizada para axxd
qual a converte em binária (infelizmentexxd -bp
não funciona - portanto, a solução alternativa paracut
&tr
):A partir disso, estamos interessados apenas em um bit (digamos
N
) com o qual podemos selecionarcut -cN
.Para descobrir o
N
que estamos usando (lembre-se de que é a parte que precisa ser incrementada após cada chamada), tente definirx
o conteúdo do arquivof
e, se ele não existir, defina-o como 1:A última coisa a fazer é atualizar o arquivo
f
- escrevendox+1
nele:fonte
TI-Basic (série TI-83),
592357309 bytesEsta tabela é uma referência possível para a representação binária do código fonte da calculadora, embora, no final das contas, eu apenas tenha usado o depurador da TI virtual.
Para comparação e / ou interesse histórico: os primeiros quines escritos em TI-Basic .
Como funciona
Str1
armazena o código fonte (agora em glorioso hexadecimal, economizando muito espaço em relação à versão binária anterior), deixando de fora os bits onde o conteúdo emStr1
si seria representado.Estamos assumindo que o programa inicia em uma calculadora cuja memória acabou de ser limpa, o mesmo
X
ocorre0
. Sempre que o programa é incrementadoX
.Geralmente, apenas descobrimos o meio byte do qual estamos tentando extrair um pouco, lemos
Str1
, convertemos de hexadecimal em binário e imprimi-lo. Se estamos na parte do código-fonte que está armazenandoStr1
(que é dois terços do comprimento total do programa), então primeiro passo para a parte correspondente da cadeia de armazenamento31
,32
e assim por diante.fonte
Java 8,
249241237234148 bytesDesculpe desde já pelas longas explicações. :)
Experimente aqui.
Explicação:
Explicação adicional:
quine -part:
String s
contém o código fonte não formatado%s
é usado para colocar essa String em si mesma coms.format(...)
%c
,%1$c
E34
são usados para formatar as aspas duplas ("
)s.format(s,34,s)
coloca tudo juntoExperimente aqui com algumas partes removidas / modificadas para verificar as saídas quine do seu próprio código-fonte.
parte binária :
-i/8
truncará automaticamente na divisão inteira; portanto, quandoi
estiver de -7 a 0, ele se tornará0
; sei
for de -15 a -8, ele se tornará1
; etc.s.charAt(-i/8)
ocorre com o caráter atual do código-fonte, oito vezes um após o outro. Experimente aqui com uma versão modificada.--i&7
será7,6,5,4,3,2,1,0,7,6,5,4,3,2,1,0,...
onde o primeiro7
é quandoi=0
(que se torna o-1
primeiro devido ao--i
, e continuará diminuindo).s.charAt(-i/8)>>(--i&7)
produzirá sequências dependendo dos caracteres. Alguns exemplos ('A'
(65) a'E'
(69) são):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
então gera a0
se for um número par e1
se for um número ímpar, que em combinação com as seqüências acima produz o resultado correto.Resposta antiga de 233 bytes :
Experimente aqui.
Explicação:
Explicação adicional:
quine -part:
A mesma explicação acima, com a adição de:
%%
é a forma de escape do sinal do módulo (%
)Experimente aqui com algumas partes removidas / modificadas para verificar as saídas quine do seu próprio código-fonte.
parte binária :
i/8
truncará automaticamente na divisão inteira; portanto, quandoi
for 0-7, ele se tornará0
; sei
é 8-15, ele se tornará1
; etc.s.charAt(i/8)
ocorre com o caráter atual do código-fonte, oito vezes um após o outro. Experimente aqui com uma versão modificada.255
é0xFF
ou11111111
(o valor máximo para um byte não assinado)256
é0x100
ou100000000
.&
upcasts o caractere ASCII para um número inteiro. Nesse ponto, está em qualquer lugar entre0
e255
(00000000
para11111111
).Long.toString(...,2)
converte-o na representação String binária de 9 bits+256
e.substring(1)
garantirá que haja zeros à esquerda e converterá os 9 bits em 8 bits.Experimente aqui com algumas partes removidas / modificadas para verificar os bytes inteiros.
fonte
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 bytesExplicação
Repartição do código:
o=_=>
: define uma função.`o=${o}`
: constrói uma string;o
é convertido em uma string, que nesse caso é o código fonte da função..charCodeAt(
: obtém um caractere na string como seu código de caractere ASCII.(o.n=1+o.n|0)/8
: selecione um caractere. Também é aqui que o contador é incrementado.)>>(7-o.n%8)
: desloque o código de caractere resultante para que o bit desejado esteja na posição correta.&1
: defina todos os outros bits para 0.fonte
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
você pode usar++n||(n=0)
ou++n?n:n=0
oun=++n||0
oun=1+n||0
que todos utilizam o falsiness doNaN
que é produzido pelo incrementoundefined
o=_=>('o='+o).charCodeAt((o.n=1+o.n|0)/8)>>(~o.n&7)&1
q / kdb + , 45 bytes
Solução:
Exemplo:
Explicação:
Eu acho que entendi o breve.
Primeiro configure uma variável global
a
com o valor inicial de-1
. A funçãof
cria a representação binária da representação em cadeia da função (tudo incluindo o{}
) precedido peloa:-1;f:
lixo eletrônico e indexa nessa lista binária no índice a (que é incrementado a cada chamada).fonte
Python 2 , 164 bytes
Experimente online!
Explicação
Vamos começar com um quine padrão do Python 2.
Ok, bem, isso gera exatamente assim. Nós precisamos de binário!
Certo, isso apenas converte tudo em binário. Mas o título diz "um pouco de cada vez". Precisamos de algo para persistir através de várias execuções. Eu sei, vamos fazer disso uma função!
Espere, isso não ajuda ... Hmm, como podemos acompanhar o índice do bit necessário para a saída? Ooh, ooh, vamos ter um número inteiro para acompanhar.
Um ... que sempre gera o primeiro bit. Ah, precisamos incrementar o rastreador! Oh droga, Python não permite que números inteiros como argumentos padrão sejam modificados. E as atribuições não são expressões em Python, então você não pode fazer isso em uma lambda. Welp, isso é impossível em Python, caso encerrado.
... Bem, não exatamente. O Python permite que listas como argumentos padrão sejam modificadas. (E ele morde os programadores Python o tempo todo.) Vamos usar seu comprimento!
Isso ainda não modifica o rastreador ... Podemos acrescentar algo a ele para aumentar seu tamanho ... Mas como? Ah, bem, nós temos
list.append
.lst.append(1)
é equivalente alst += [1]
. Ótimo!Opa, isso pula o primeiro bit porque o comprimento do rastreador é 1 antes da saída do bit. Precisamos diminuir o comprimento em que é usado.
Aí está pessoal! Golf e você tem a minha solução!
fonte
Perl 5 , 59 bytes
Experimente online!
fonte