Die Zelle am Ende des Regenbogens


31

Wir alle kennen oder haben zumindest von Brainfuck gehört , einer der bekanntesten und einflussreichsten esoterischen Sprachen. Während heutzutage die meisten Implementierungen ein unendliches Band verwenden, hatte der ursprüngliche Compiler von Urban Müller ein Band mit 30000 Zellen. Eine wenig bekannte Tatsache * ist, dass es am Ende des Bandes einen speziellen Wert gibt, mit dem in einem typischen Brainfuck-Programm so gut wie nie interagiert wird.

Während Sie diesen Wert mit 29999 >s und a ausgeben können ., ist brainfuck für seine kurzen und präzisen Lösungen bekannt. Daher ist es Ihr Ziel, diesen Wert mit der Mindestanzahl von Zeichen auszudrucken.

*Fiktion

Regeln:

  • Eine Auffrischung der Brainfuck-Anleitung:
    • +/ -: Inkrementiert / dekrementiert die aktuelle Zelle und hüllt sie von 255 auf 0 auf, wenn 255 inkrementiert wird, und umgekehrt
    • </ >: Bewegen Sie den Zeiger auf dem Band nach links / rechts
    • .: Gibt den Wert der aktuellen Zelle aus.
    • [: Springe zum entsprechenden ]Wert, wenn der Wert in der Zelle 0 ist
    • ]: Zum entsprechenden springen, [wenn der Wert in der Zelle nicht 0 ist
  • In diesem Fall hat ,(Get input) keine Auswirkung, da der ursprüngliche Compiler die Zelle in EOF unverändert lässt und dieses Programm keine Eingaben erhalten sollte.
  • Das Band ist anfänglich mit allen Nullen gefüllt, mit Ausnahme der Zelle 30000, die einen unbekannten Wert enthält
  • Der Zeiger beginnt in Zelle 1 und sollte in Zelle 30000 enden, nachdem er gedruckt wurde.
  • Die Zellen links von 1 und rechts von 30000 weisen ein undefiniertes Verhalten auf. Daher sollten Lösungen diese Zellen nicht besuchen.
  • Beachten Sie, dass der Wert bei 30000 ist kann eine 0 sein , so einfach Looping , bis Sie eine Nicht-Null - Zelle getroffen wird nicht funktionieren.
  • Sie sollten nur den Wert in Zelle 30000 drucken
  • Die kürzeste Lösung gewinnt!
    • Tie-Breaker ist das effizientere Programm (wird in den wenigsten Schritten ausgeführt), gefolgt von der schnellsten Einreichungszeit.

Tipp: Esolanging Fruit empfiehlt die Verwendung von https://copy.sh/brainfuck zum Testen Ihres Codes. Die technischen Daten entsprechen den Angaben in dieser Herausforderung. Sie können die abortOption so auswählen, dass Ihr Programm angehalten wird, wenn die Grenzen überschritten werden.


Sandbox (gelöscht)
Jo King

3
1 Byte: .. Ich gewinne.
Esolanging Fruit

1
@ EsolangingFruit Lassen Sie mich bitte meine Wahnvorstellungen haben ...
Jo King

1
Ich schlage vor, die Regel in "anfangs haben alle Zellen den Wert 0, mit Ausnahme der letzten Zelle, deren Wert unbekannt ist" zu ändern.
user202729

4
Tipp für alle, die dies tun: copy.sh/brainfuck ist wahrscheinlich die beste Website, um dies zu tun, da es BF wie in dieser Herausforderung beschrieben implementiert und standardmäßig über ein 30-KB-Band verfügt. Wenn Sie sich rechts über das Bandende hinausbewegen, bleibt der Interpreter hängen.
Esolanging Fruit

Antworten:


17

54 Bytes

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

119 x 252 = 29988. Einfache verschachtelte Schleife.

Ich habe dieses Tool verwendet , um zu überprüfen, ob der Zeiger bei 29999 stoppt.


12

50 Bytes

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

Probieren Sie es hier aus!

Der erste Abschnitt ( >+[>+[<]>->+]>-<<) richtet das Band als ein

0*12 121' 0 110

Der nächste Abschnitt ( [>>-------[[>]+[<]>-]<<-]) iteriert 121 Mal und fügt 1jedes Mal 249 Sekunden an das Bandende an. Wenn Sie schnell rechnen können, werden Sie vielleicht feststellen, dass 121 * 249 30129 1s ergibt , aber die erste Iteration hat den verbleibenden Wert 110 und hängt nur ( 110-7) 103 1s an das Band an, was bedeutet, dass es nur 29983 1s gibt. Das letzte Band sieht so aus:

0*12 0' 0 0 1*29983 0 ???

Und ein Finale >>>[>]>., um den Wert auszudrucken.

Einige andere bemerkenswerte Algorithmen:

  • 252 * 119 = 29988 (auch 50 Bytes)
  • 163 * 184 = 29992 (56 Byte)
  • 204 * 147 = 29988 (60 Byte)
  • 153 * 196 = 29988 (56 Byte)
  • 191 * 157 = 29987 (57 Byte)
  • 254 * 118 = 29972 (56 Byte)
    • Dieses ist das, das meiner Meinung nach dem 50. Sieg am nächsten kommt, da die zusätzlichen Bytes im Grunde genommen nur die zusätzliche Distanz zurücklegen. Wenn ich einen Algorithmus finden könnte, der 118 erzeugt und weiter als 14 Zellen reist, könnte dies ihn schlagen.

3

81

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

Dieser bewegt sich 200-mal um 150 Zellen weiter.

Dies ist viel länger als ich es gerne hätte und es gibt ein ernstes Hindernis für das Golfen:

Ich weiß nicht mehr warum ich arbeite.

Dies ist übersät mit Kompensationen für Ausfälle bis zu dem Punkt, an dem einige von ihnen wahrscheinlich aufhören könnten. Ich habe so viele Segmente hinzugefügt und gelöscht, dass ich mich nicht mehr daran erinnere, warum ich bestimmte Dinge dort abgelegt habe, wo sie sich befinden (zum Beispiel, warum initialisiert der erste Teil die Bandzellen auf 199 und 151 anstatt auf 200 und 150?).

Hier ist sowieso meine kommentierte Version dieser Monstrosität, in der Hoffnung, dass ich (oder jemand anderes) sie nützlich finden könnte:

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

0 0 0 199' 155

[
  n' k 0
  >[
    n k' j
    ->+[[->+<]<]>
    0' n k-1 j+1 OR
    n 0 0' j+1
    >>
  ]
  0*k n 0 0 k 0'
  <[-<<+>>]<<<-
  0*k n-1' k
]
>-------[[->+<]>-]>.

Dies gibt den Wert nicht wirklich aus, und wenn der Wert positiv ist, läuft er über. Aber ein großartiger Versuch
Jo King

Dann fügen Sie ein ., würde es helfen?
user202729

1
@JoKing Das wurde behoben.
Esolanging Fruit
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.