Zrób dłuższy program lenguage

16

Lenguage to idiotyczny dialekt, który słynie z łamania ograniczeń związanych ze źródłami. Jest tak, ponieważ Lenguage dba tylko o długość swojego źródła, a nie o jego zawartość.

Najpierw obliczana jest długość programu. Następnie wspomniana długość jest konwertowana na dwójkową i dopełniana lewymi zerami do wielokrotności 3. Powstały ciąg dwójkowy jest dzielony na 3-częściowe fragmenty, z których każdy jest tłumaczony na komendę uderzenia mózgu jako taką:

000 -> +
001 -> -
010 -> >
011 -> <
100 -> .
101 -> ,
110 -> [
111 -> ]

Wreszcie program jest uruchamiany jako pieprzony mózg 1 .

Odtąd wyzwanie jest dość proste, napisz program lenguage, który nie pobiera danych wejściowych i generuje dane wyjściowe składające się z jednej bajtowej liczby całkowitej n razy, przy czym n jest ściśle większe niż długość twojego programu.

Odpowiedzi będą oceniane w bajtach, przy czym im mniej bajtów, tym lepiej.

Oto zhackowany program do obliczania lenguage'a z brainfuck


1: Do tego wyzwania użyjemy komórek owijających i taśmy nie zawijającej.

Post Rock Garf Hunter
źródło
3
+[.]Czy wygrywam : P
Quintec,
3
Być może bardziej interesujące byłoby uzyskanie wyniku na podstawie długości wydruku?
Jo King
@JoKing To dobry pomysł. Niestety wydaje się na to trochę za późno.
Post Rock Garf Hunter
2
Ponadto, dlaczego ten otagowany quine?
Embodiment of Ignorance
1
@ msh210 To załatwi sprawę przez większość czasu, ale jest kilka różnic, na przykład różne postacie Brainfuck kosztują różne kwoty ( +jest najtańsza i ]najdroższa) i oczywiście ma to znaczenie, gdzie są w programie. Chociaż jest dobrym oszacowaniem, nie jest dokładnie równoważne. 2)3)n
Post Rock Garf Hunter

Odpowiedzi:

15

8437495638205698686671 bajtów

To przekłada się na program pieprzenia mózgów:

-[>>[>]+[->[>]+.[<]+<]<-]

Który drukuje dokładnie 231584178474632390847141970017375815706539969331281128078915168015826259279614 bajtów SOH.

Jest to obliczane przez funkcję

f(n)=2*f(n-1)+n
f(0)=0

z wejściem 255.

Wyjaśnienie:

-[         Loop 255 times
  >>[>]    Move to the end of a series of positive cells (initially empty)
  +        Add one cell to the end
  [-       Loop over each cell 
    >[>]+  Add one cell to the end
    .      Print a SOH byte
    [<]+   Restore current cell
  <]       Move to next cell
<-]        Decrement counter
Jo King
źródło
4

9093903938998324939360576240306155985031832511491088836321985855167849863863065731015823 bajtów

>>>>>>-[[->>>+<<<]------>>>-]<<<[<<<]+[+[>>>]<<<->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-[<<<].>>>-]

Które drukuje dokładnie

298333629248008269731638612618517353495058861384016275770860733328251135402804732197446995616017112134460464130233444058136509123809012106419446593183683387659250431692751255099808162970657410517657862174602556590616568690423540284801267472920128909691902547970614008613488242333460665145840144517097342073878746293059960326132795671583153307437896728515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

250255

Podziękowania należą się @hvd w tej odpowiedzi Brainfuck , więc upewnij się, że go głosujesz!

Wyjaśnienie:

Chciałem napisać własne wyjaśnienie, ale zdałem sobie sprawę , że wyjaśnienie @hvd jest już na miejscu, więc zacytuję to tutaj:

>>>>>> jest potrzebne, aby zostawić trochę miejsca do pracy.

-produkuje 255 ( od 0 - 1 = 255, gdy mamy zawijanie komórek ).

[[->>>+<<<]------>>>-] zamienia to w 255 kopii o wartości 250, dając taśmę, która wygląda następująco:

0 0 0 0 0 0 250 0 0 250 0 0 ... 250 0 0 [0]

<<<[<<<]+ przesuwa wskaźnik danych z powrotem i kończy początkowe dane:

0 0 0 [1] 0 0 250 0 0 250 0 0 ...

Potem pojawia się pętla: [+...-]początkowo ustawia 1 na 2, która zostaje ustawiona z powrotem na 1 na końcu pętli. Pętla kończy się, gdy korpus pętli jest już ustawiony na 2 na 1.

Teraz liczby 2 250 250 250 ... 250 reprezentują licznik w bazie 250, przy czym każda liczba jest większa niż cyfra, którą reprezentuje.

  • [>>>]<<<przesuwa się całkowicie w prawo. Ponieważ każda cyfra jest reprezentowana przez liczbę niezerową, jest to trywialne.

  • ->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-zmniejsza licznik o 1. Począwszy od ostatniej cyfry: cyfra ulega zmniejszeniu. Jeśli pozostanie pozytywny, skończymy. Jeśli zmieni się na zero, ustaw go na 250 i kontynuuj od poprzedniej cyfry.

  • [<<<].>>>przesuwa wskaźnik z powrotem przed najbardziej lewą cyfrą i jest to dobry moment na wydrukowanie bajtu NUL. Następnie zmień położenie dokładnie na lewą cyfrę, aby zobaczyć, czy skończyliśmy.

W celu zweryfikowania poprawności, należy zmienić początkowe -do +do wydrukowania 250 1 NUL bajtach ++dla 250 2 , itd.

Kevin Cruijssen
źródło
4

19326644346528796447 bajtów

Kod Brainfuck:

>+[+[[+>->-<<]->>+].<]

Wydruki

57896044618658097711785492504343953926634992332820282019728792003956564819967

puste bajty.

Działa to tak:

mem[i]=255;
do
    while(--mem[i]){
        mem[i+1]=mem[i+2]=mem[i];
        mem[i]=1;
        i+=2;
    }
while(mem[--i]);

Dość prosta rekurencja.

jimmy23013
źródło