Napisz licznik binarny w quine

10

Napisz dwa fragmenty kodu, które nazwiemy s_zero i s_one.

Program (l, n) składa się z l kopii s_zero i s_one odpowiadających cyfrom b w formacie binarnym, wypełnionych s_zero po lewej stronie.

Na przykład, jeśli s_zero = fooi s_one = barto
Program (4, 0) = foofoofoofoo
Program (4, 1) = foofoofoobar
Program (4, 2) = foofoobarfoo
itd.

Program (l, n) musi wydrukować źródło programu (l, (n + 1) mod (2 ^ l)) na standardowe wyjście. W powyższym przykładzie foobarfoofoonależy wydrukować foobarfoobarpo uruchomieniu .

Twój wynik to suma długości fragmentów s_zero i s_one

QuadmasterXLII
źródło
Niemal duplikat do codegolf.stackexchange.com/questions/35974/… - obliczenia wykonane przez quiting programu z 2 różnymi blokami kodu.
feersum
Czy program może odczytać własny kod źródłowy?
Klamka
2
@feersum Nie zgadzam się. Jest to o wiele łatwiejsze, w szczególności nie musisz być w stanie określić podziałów linii. Co więcej, myślę, że zadanie to robi różnicę, w przeciwnym razie każde uogólnione wyzwanie quine byłoby duplikatem podstawowego wyzwania quine.
Martin Ender
Zaletą prostszego zadania jest to, że zachęca ono konkurencję do tworzenia szokująco krótkich odpowiedzi, które do tej pory widziały - mam nadzieję, że uzasadnia to wyzwanie jako inne!
QuadmasterXLII,
1
Prawdopodobnie warto zauważyć, że s_zero i s_one muszą być różne. W przeciwnym razie mam wiele rozwiązań z wynikami 2 * n.
randomra

Odpowiedzi:

6

CJam, 29 + 29 = 58 bajtów

Kod 0:

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

Kod 1:

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

Wyjaśnienie

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
źródło
2
za każdym razem ...
Optymalizator
3

CJam, 47 + 47 = 94 bajty

Kod 0:

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

Kod 1:

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

Przepraszam za przekleństwa.

Jestem pewien, że wciąż mogę zgolić kilka bajtów. Dodam wyjaśnienie, gdy zdecyduję, że nie będę się już przejmować golfem.

Sprawdź to tutaj.

Martin Ender
źródło
1

CJam, 45 + 45 = 90 bajtów

0 Kod:

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

1 Kod:

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

Wyjaśnienie wkrótce.

Wypróbuj online tutaj

Optymalizator
źródło
1

GolfScript, 37 + 37 = 74 bajty

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

Nie tak krótkie jak rozwiązanie CJam użytkownika user23013 , ale pomyślałem, że i tak to opublikuję, jeśli tylko (nieznacznie) zwiększę różnorodność używanych języków.

Moje rozwiązanie nie opiera się bezpośrednio na żadnym z istniejących rozwiązań (i rzeczywiście ich nie zbadałem szczegółowo, ponieważ nadal nie czytam zbyt dobrze CJam), ale wszystkie mają warianty tej samej podstawowej struktury quine ( {".~"}.~w GolfScript, {"_~"}_~w CJam). Nie jest to bardzo zaskakujące, ponieważ wydaje się, że jest to jeden z najbardziej skutecznych sposobów napisania quinu z dowolną ładownością w tych językach.

Jest kilka części tego kodu, które tak naprawdę mi się nie podobają i podejrzewam, że może być możliwe dalsze granie w golfa, ale spędziłem na tym zbyt wiele czasu.

Ilmari Karonen
źródło