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


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. ";
}_~

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.


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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.