Ecrire un compteur binaire en quine

10

Écrivez deux fragments de code, que nous appellerons s_zero et s_one.

Le programme (l, n) se compose de l copies de s_zero et s_one correspondant aux chiffres de n en binaire, complété par s_zero à gauche.

Par exemple, si s_zero = fooet s_one = baralors
Program (4, 0) = foofoofoofoo
Program (4, 1) = foofoofoobar
Program (4, 2) = foofoobarfoo
etc.

Le programme (l, n) doit imprimer la source du programme (l, (n + 1) mod (2 ^ l)) sur la sortie standard. Dans l'exemple ci-dessus, foobarfoofoodoit imprimer foobarfoobarlors de l'exécution.

Votre score est la somme des longueurs des fragments s_zero et s_one

QuadmasterXLII
la source
Presque en double vers codegolf.stackexchange.com/questions/35974/… - calcul effectué par programme de quining avec 2 blocs de code différents.
feersum
Le programme peut-il lire son propre code source?
Poignée de porte
2
@feersum Je ne suis pas d'accord. Celui-ci est beaucoup plus facile, en particulier, vous n'avez pas besoin de pouvoir déterminer les sauts de ligne. En outre, je pense que la tâche fait une différence, sinon chaque défi de quine généralisé serait une dupe du défi de quine de base.
Martin Ender
L'avantage de la tâche plus simple est qu'elle encourage la concurrence à créer les réponses scandaleusement courtes vues jusqu'à présent - j'espère que cela justifie ce défi comme différent!
QuadmasterXLII
1
Il convient probablement de noter que s_zero et s_one doivent être différents. Sinon, j'ai de nombreuses solutions avec 2 * n scores.
randomra

Réponses:

6

CJam, 29 + 29 = 58 octets

Le code 0:

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

Le 1 code:

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

Explication

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
la source
2
chaque fois ...
Optimizer
3

CJam, 47 + 47 = 94 octets

Le code 0:

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

Le 1 code:

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

Excusez le juron.

Je suis sûr que je peux encore raser quelques octets là-bas. J'ajouterai une explication une fois que je déciderai que je ne peux plus m'embêter à jouer au golf.

Testez-le ici.

Martin Ender
la source
1

CJam, 45 + 45 = 90 octets

Le code 0 :

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

Le 1 code:

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

Explication bientôt.

Essayez-le en ligne ici

Optimiseur
la source
1

GolfScript, 37 + 37 = 74 octets

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

Pas tout à fait aussi court que la solution CJam de user23013 , mais j'ai pensé que je publierais cela de toute façon, ne serait-ce que pour augmenter (marginalement) la diversité des langues utilisées.

Ma solution n'est pas directement basée sur l'une des solutions existantes (et, en fait, je ne les ai pas examinées en détail, car je ne lis toujours pas très bien CJam), mais elles présentent toutes des variantes de la même structure de base quine ( {".~"}.~dans GolfScript, {"_~"}_~dans CJam). Ce n'est pas vraiment très surprenant, car cela semble être l'un des moyens les plus efficaces d'écrire un quine avec une charge utile arbitraire dans ces langues.

Il y a plusieurs parties de ce code que je n'aime pas vraiment, et je soupçonne qu'il est possible de jouer au golf plus loin, mais j'ai passé trop de temps là-dessus.

Ilmari Karonen
la source