Escreva um contador binário em quine

10

Escreva dois fragmentos de código, que chamaremos de s_zero e s_one.

O programa (l, n) consiste em l cópias de s_zero e s_one correspondentes aos dígitos de n em binário, preenchidos com s_zero à esquerda.

Por exemplo, se s_zero = fooe s_one =, barentão
Programa (4, 0) = foofoofoofoo
Programa (4, 1) = foofoofoobar
Programa (4, 2) = foofoobarfoo
etc.

O programa (l, n) deve imprimir a fonte do programa (l, (n + 1) mod (2 ^ l)) para sair do padrão. No exemplo acima, foobarfoofoodeve-se imprimir foobarfoobarquando executado.

Sua pontuação é a soma dos comprimentos dos fragmentos s_zero e s_one

QuadmasterXLII
fonte
Quase duplicado para codegolf.stackexchange.com/questions/35974/… - computação feita pelo programa de quining com 2 blocos de código diferentes.
precisa saber é
O programa pode ler seu próprio código-fonte?
Maçaneta
2
@feersum Eu discordo. Este é muito mais fácil, em particular, você não precisa determinar quebras de linha. Além disso, acho que a tarefa faz a diferença, caso contrário, todo desafio generalizado ao quine seria um embuste do desafio básico do quine.
Martin Ender
A vantagem da tarefa mais simples é que ela incentiva a concorrência a criar as respostas surpreendentemente curtas vistas até agora - espero que justifique esse desafio como diferente!
precisa saber é o seguinte
11
Provavelmente vale a pena notar que s_zero e s_one precisam ser diferentes. Caso contrário, tenho muitas soluções com pontuações 2 * n.
Aleatório

Respostas:

6

CJam, 29 + 29 = 58 bytes

O código 0:

0{"_~"]]z(3\+2b(2b2>a\+z~[}_~

O código 1:

1{"_~"]]z(3\+2b(2b2>a\+z~[}_~

Explicação

0                       " Push the current bit. ";
{"_~"                   " The basic quine structure. ";
    ]                   " Make an array of the current bit, the function and _~.
                          That is the code fragment itself. ";
    ]                   " Make an array of all code fragments in the stack. ";
    z(                  " Extract the array of the bits. ";
    3\+2b(2b2>          " Convert from base 2, decrease by one and convert back,
                          keeping the length. ";
    a\+z                " Put the bits back to the original position. ";
    ~                   " Dump the array of code fragments back into the stack. ";
    [                   " Mark the beginning position of the array of the next code fragment. ";
}_~
jimmy23013
fonte
2
todas as vezes ...
Optimizer
3

CJam, 47 + 47 = 94 bytes

O código 0:

{`"_~"+]:+T2*0+:T)\AsSerS/_,(@2Y$#+2bU@->]zs}_~

O código 1:

{`"_~"+]:+T2*1+:T)\AsSerS/_,(@2Y$#+2bU@->]zs}_~

Desculpe o palavrão.

Tenho certeza de que ainda posso cortar alguns bytes por lá. Acrescentarei uma explicação assim que decidir que não posso mais me dar ao trabalho de jogar golfe.

Teste aqui.

Martin Ender
fonte
1

CJam, 45 + 45 = 90 bytes

O código 0 :

{`]W=L0+:L,Ua*L2b)2b+L,W*>\f{X$!s/\s*"_~"}}_~

O código 1 :

{`]W=L1+:L,Ua*L2b)2b+L,W*>\f{X$!s/\s*"_~"}}_~

Explicação em breve.

Experimente online aqui

Optimizer
fonte
1

GolfScript, 37 + 37 = 74 bytes

0{`".~"+:q;]-2%1\{1$^.@&q@}%\;-1%~}.~
1{`".~"+:q;]-2%1\{1$^.@&q@}%\;-1%~}.~

Não é tão curto quanto a solução CJam do user23013 , mas achei que iria postar isso de qualquer maneira, apenas para (marginalmente) aumentar a diversidade dos idiomas usados.

Minha solução não se baseia diretamente em nenhuma das soluções existentes (e, de fato, não as examinei em detalhes, pois ainda não leio muito bem o CJam), mas todas elas apresentam variantes da mesma estrutura básica de quine ( {".~"}.~em GolfScript, {"_~"}_~em CJam). Isso não é realmente muito surpreendente, pois parece ser uma das maneiras mais eficientes de escrever um quine com uma carga arbitrária nesses idiomas.

Não gosto muito de várias partes desse código e suspeito que talvez seja possível jogar mais, mas passei muito tempo nisso.

Ilmari Karonen
fonte