Brainf * ck Loop Problem

19

Ich habe ein Problem mit einem Cyberclub, der Sie zum Drucken auffordert:

ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!

Verwenden von Brainf ** k in maximal 29 Bytes ohne Verwendung des Zeichens ','.

Ich habe einen Arbeitscode:

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

Meine Schleife ist jedoch zu lang und sendet mir 16 Bytes über das Limit.

Gibt es eine effizientere Möglichkeit, die zweite und dritte Zelle auf 58 und 90 zu setzen, damit ich meine zweite Schleife ausführen kann? Oder gibt es einen besseren Weg, dies alles zusammen zu machen, den ich einfach nicht sehe?

Nick Rod
quelle
1
Während Ihre Frage nur vier Bytes einspart, ist es tatsächlich besser, 59 und 90 zu generieren und das -.zu ändern .-, indem Sie das löschen >.<.
Martin Ender
Ich bekam +[--->++<]>++++[.-]für 19 Bytes, aber es druckt auch die Steuerzeichen ...
Timtech
@MartinEnder Ja, tut mir leid, ich habe deinen Kommentar zu dem anderen Beitrag gesehen und fand diese Gruppe viel passender. Ich werde die auf SO löschen, da sie nicht viele Antworten generiert.
Nick Rod
2
Ich bin ehrlich gesagt neugierig, was dieser "Cyber-Club" ist, denn Junge, sie müssen einige wirklich gute Golfer haben!
Sp3000

Antworten:

23

27 24 Bytes

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

Verbrachte einen ganzen Tag damit, einen Brute Forcer aufzuschreiben und zu beobachten, wie die Ergebnisse eintrafen. Jetzt kann ich mich wieder an die eigentliche Arbeit machen ... Ein weiterer Tag des Brute Forcings später ...

Probieren Sie es online!

Die Komponente ++[<++[++<]>>>+]initialisiert das Band auf

[130, 0, 0, 0, 91, 59, 0]
                       ^

Das ist einfach perfekt für das, was wir brauchen!

Sp3000
quelle
8
Zauberei. (∩`-´) ⊃━ ☆ ゚. * ・ ゚
Primo
@primo Um fair zu sein, ich habe keine Ahnung, was strukturell in der ersten Hälfte vor sich geht, und ich finde die Tatsache, dass Sie in der Lage sind, Ihre eigenen Algorithmen / Techniken zu entwickeln, erstaunlich :)
Sp3000
Band am Ende jeder Schleife: codepad.org/ZoJUlQ8M . Es ist überhaupt nicht intuitiv, dass es bei den Werten endet, die es tut, oder sogar überhaupt;)
Primo
1
Eine Alternative 24:+[[>++<<]>->+>+]<[-<-.>]
Primo
15

30 Bytes

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

Probieren Sie es online!

85 und 171 sind im Brainfuck relativ einfach zu erzeugen (modulare Inverse von 3 und -3 ). 85 liegt ziemlich nahe bei 90 und 171 liegt ziemlich nahe bei 177 ( 59 · 3 ), was hier verwendet wird. Mit ein bisschen Hackery kann ich stattdessen 88 und 176 produzieren .

Aber immer noch ein Byte hinter dem Ziel.

Andere Vorschläge

Im Allgemeinen ist es kürzer, über eine Liste zu iterieren und mit einer Konstanten zu multiplizieren, als auf die andere Weise. Dies gilt insbesondere für 3 oder mehr Werte. Zum Beispiel das:

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

kann geschrieben werden als:

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

Es gab nur zwei innere Werte, daher ist dies in diesem Fall keine große Verbesserung. Tatsächlich ist nur das Refactoring um ein Byte kürzer:

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

Multiplizieren Sie 30 mit 2 und 3 statt 10 mit 6 und 9 . Mit dem Vorschlag von Martin Büttner sind es bereits 38 Bytes, ohne viel am Original zu ändern:

+++++[>++++++[>++>+++<<-]<-]>>-[>.-<-]
primo
quelle
Ich hätte nie darüber nachgedacht, die 58 zu multiplizieren und mit einer größeren Zahl zu iterieren, das ist viel effizienter.
Nick Rod
4

34 Bytes

Sie haben 11 Bytes gespeichert, aber immer noch 5 Bytes zu lang ...

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

Ich habe schon Stunden damit verbracht, hoffentlich kann jemand dies verbessern.

Timtech
quelle