Machen Sie ein längeres Sprachprogramm


16

Lenguage ist ein Brainfuck-Dialekt, der bekannt dafür ist, dass er die Herausforderungen der Quellenbeschränkung meistert . Das liegt daran, dass sich Lenguage nur um die Länge der Quelle und nicht um den Inhalt kümmert.

Zunächst wird die Länge des Programms berechnet. Diese Länge wird dann in binär umgewandelt und mit Nullen auf ein Vielfaches von 3 aufgefüllt. Die resultierende binäre Zeichenfolge wird in 3-Bit-Blöcke aufgeteilt, von denen jeder in einen Brainfuck-Befehl übersetzt wird:

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

Schließlich wird das Programm als Brainfuck 1 ausgeführt .

Von hier aus ist die Herausforderung ziemlich einfach: Schreiben Sie ein Sprachprogramm, das keine Eingabe benötigt und eine Ausgabe erzeugt, die aus einem Byte besteht, das n mal ganzzahlig wiederholt wird, wobei n streng größer ist als die Länge Ihres Programms.

Antworten werden in Bytes bewertet, wobei weniger Bytes besser sind.

Hier ist ein Hacky-Programm zur Berechnung der Sprache aus Brainfuck


1: Für diese Herausforderung werden wir umhüllende Zellen und ein nicht umhüllendes Band verwenden.


3
+[.]Gewinne ich : P
Quintec

3
Vielleicht ist es interessanter, über die Länge der Ausgabe zu punkten?
Jo King

@JoKing Das ist eine gute Idee. Leider scheint es dafür etwas spät zu sein.
Weizen-Zauberer

2
Warum ist dieses Tag Quine?
Verkörperung der Ignoranz

1
+]23n

Antworten:


15

8437495638205698686671 Bytes

Dies übersetzt in das Brainfuck-Programm:

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

231584178474632390847141970017375815706539969331281128078915168015826259279614

Dies wird von der Funktion berechnet

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

mit einer Eingabe von 255.

Erläuterung:

-[         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

4

9093903938998324939360576240306155985031832511491088836321985855167849863863065731015823 Bytes

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

Welches druckt genau

298333629248008269731638612618517353495058861384016275770860733328251135402804732197446995616017112134460464130233444058136509123809012106419446593183683387659250431692751255099808162970657410517657862174602556590616568690423540284801267472920128909691902547970614008613488242333460665145840144517097342073878746293059960326132795671583153307437896728515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

250255

Gutschrift geht an @hvd in dieser Brainfuck-Antwort , also stelle sicher, dass du ihn positiv bewertest!

Erläuterung:

Ich wollte eine eigene Erklärung schreiben, habe jedoch festgestellt, dass die Erklärung von @hvd bereits zutreffend ist, und zitiere sie stattdessen hier:

>>>>>> wird benötigt, um etwas Arbeitsraum zu lassen.

-erzeugt 255 ( da 0 - 1 = 255, wenn wir Zellen umbrechen ).

[[->>>+<<<]------>>>-] verwandelt dies in 255 Kopien des Werts 250 und ergibt ein Band, das wie folgt aussieht:

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

<<<[<<<]+ Bewegt den Datenzeiger zurück und beendet die ursprünglichen Daten:

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

Dann kommt die Schleife: Setzt [+...-]zunächst die 1 auf eine 2, die am Ende der Schleife wieder auf 1 gesetzt wird. Die Schleife wird beendet, wenn der Schleifenkörper bereits 2 auf 1 gesetzt hat.

Nun stellen die Zahlen 2 250 250 250 ... 250 einen Zähler in der Basis 250 dar, wobei jede Zahl um eins größer ist als die Ziffer, die sie darstellt.

  • [>>>]<<<bewegt sich ganz nach rechts. Da jede Ziffer durch eine Zahl ungleich Null dargestellt wird, ist dies trivial.

  • ->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-verringert den Zähler um 1. Beginnend mit der letzten Ziffer: Die Ziffer wird dekrementiert. Wenn es positiv bleibt, sind wir fertig. Wenn es zu Null wird, setzen Sie es auf 250 und fahren Sie mit der vorherigen Ziffer fort.

  • [<<<].>>>Bewegt den Zeiger vor die am weitesten links stehende Stelle zurück. Dies ist ein guter Moment, um ein NUL-Byte zu drucken. Positionieren Sie dann genau auf die Stelle ganz links, um festzustellen, ob wir fertig sind.

Ändern Sie zur Überprüfung der Richtigkeit die Initiale -in +, um 250 1 NUL-Bytes ++für 250 2 usw. zu drucken .


4

19326644346528796447 Bytes

Brainfuck-Code:

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

Druckt

57896044618658097711785492504343953926634992332820282019728792003956564819967

null Bytes.

Es funktioniert so:

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

Ganz unkomplizierte Rekursion.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.