Brainf * ck Loop Problem

19

Saya memiliki masalah untuk klub cyber yang meminta Anda untuk mencetak:

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

Menggunakan Brainf ** k dalam 29 byte atau kurang tanpa menggunakan karakter ','.

Saya punya kode yang berfungsi:

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

Namun loop saya terlalu panjang, mengirim saya 16 byte melebihi batas.

Apakah ada cara yang lebih efisien untuk mengatur sel kedua dan ketiga menjadi 58 dan 90 sehingga saya dapat menjalankan loop kedua? Atau adakah cara yang lebih baik untuk melakukan ini bersama-sama yang tidak saya lihat?

Nick Rod
sumber
1
Adapun pertanyaan Anda, meskipun hanya menghemat empat byte, sebenarnya lebih baik untuk menghasilkan 59 dan 90 dan mengubahnya -.ke .-, menjatuhkan >.<.
Martin Ender
Saya mendapat +[--->++<]>++++[.-]19 byte tetapi mencetak karakter kontrol juga ...
Timtech
@ MartinEnder Ya maaf tentang itu, saya melihat komentar Anda di posting lain dan menemukan grup ini yang tampaknya jauh lebih tepat, saya akan menghapus yang di SO karena tidak menghasilkan banyak jawaban.
Nick Rod
2
Sejujurnya aku penasaran apa "klub cyber" ini, karena bocah mereka pasti memiliki pegolf yang sangat bagus!
Sp3000

Jawaban:

23

27 24 byte

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

Menghabiskan satu hari penuh pada dasarnya menulis penjahat kasar dan menonton hasilnya. Sekarang saya bisa kembali melakukan pekerjaan yang sebenarnya ... Satu hari lagi memaksa kasar ...

Cobalah online!

Komponen ++[<++[++<]>>>+]menginisialisasi rekaman ke

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

yang sempurna untuk apa yang kita butuhkan!

Sp3000
sumber
8
Sihir. (∩`-´) ⊃━ ☆ ゚. * ・。 ゚
primo
@primo Agar adil, saya tidak tahu apa yang terjadi pada struktur-bijaksana di babak pertama, dan saya pikir fakta bahwa Anda dapat menemukan algoritma / teknik Anda sendiri luar biasa :)
Sp3000
Kaset di akhir setiap loop: codepad.org/ZoJUlQ8M . Sama sekali tidak intuitif bahwa itu akan berakhir pada nilai-nilai yang dilakukannya, atau bahkan sama sekali;)
primo
1
Alternatif 24:+[[>++<<]>->+>+]<[-<-.>]
primo
15

30 byte

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

Cobalah online!

85 dan 171 cukup mudah untuk menghasilkan di brainfuck (invers modular 3 dan -3 ). 85 cukup dekat dengan 90 , dan 171 cukup dekat dengan 177 ( 59 · 3 ), yang digunakan di sini. Dengan sedikit peretasan, saya dapat menghasilkan 88 dan 176 sebagai gantinya.

Masih satu byte lebih pendek dari target.

Saran lainnya

Secara umum, ini lebih pendek untuk beralih pada daftar, mengalikan dengan konstanta, bukan dengan cara lain. Ini terutama berlaku untuk 3 atau lebih nilai. Sebagai contoh, ini:

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

dapat ditulis sebagai:

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

Hanya ada dua nilai dalam, jadi tidak banyak perbaikan dalam hal ini. Faktanya, hanya refactoring yang satu byte lebih pendek:

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

Mengalikan 30 dengan 2 dan 3 , bukan 10 dengan 6 dan 9 . Dengan saran Martin Büttner, ini sudah turun ke 38 byte, tanpa banyak perubahan ke aslinya:

+++++[>++++++[>++>+++<<-]<-]>>-[>.-<-]
primo
sumber
Saya tidak akan pernah berpikir tentang mengalikan 58 dan mengulangi dengan jumlah yang lebih besar, itu jauh lebih efisien.
Nick Rod
4

34 byte

Menghemat 11 byte, namun masih terlalu panjang 5 byte ...

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

Saya sudah menghabiskan waktu berjam-jam, semoga seseorang dapat memperbaiki ini.

Timtech
sumber