Sel di ujung pelangi


31

Kita semua tahu, atau setidaknya pernah mendengar, brainfuck , salah satu bahasa esoteris yang paling terkenal dan berpengaruh. Sementara saat ini sebagian besar implementasi menggunakan pita tak terbatas, kompiler asli oleh Urban Müller memiliki pita 30000 sel. Fakta yang sedikit diketahui * adalah bahwa sebenarnya ada nilai khusus di akhir rekaman, sesuatu yang hampir tidak pernah berinteraksi dengan program brainfuck khas.

Meskipun Anda dapat mencetak nilai ini dengan 29999 >s dan a ., brainfuck dikenal untuk solusi singkat dan ringkasnya, jadi tujuan Anda adalah mencetak nilai ini dengan jumlah karakter minimum.

*fiksi

Aturan:

  • Penyegaran pada instruksi brainfuck:
    • +/ -: Menambah / mengurangi sel saat ini, membungkus dari 255 ke 0 ketika 255 bertambah dan sebaliknya
    • </ >: Pindahkan pointer ke kiri / kanan pada kaset
    • .: Cetak nilai sel saat ini.
    • [: Langsung ke yang sesuai ]jika nilai pada sel adalah 0
    • ]: Langsung ke yang sesuai [jika nilai pada sel bukan 0
  • Dalam hal ini ,(Dapatkan input) tidak melakukan apa-apa, karena kompiler asli membiarkan sel tidak berubah pada EOF, dan program ini seharusnya tidak menerima input.
  • Rekaman awalnya diisi dengan semua 0s, kecuali untuk sel 30000, yang berisi nilai yang tidak diketahui
  • Pointer dimulai pada sel 1 dan harus berakhir pada sel 30000, setelah mencetaknya.
  • Sel di sebelah kiri 1 dan di kanan 30000 memiliki perilaku yang tidak terdefinisi, jadi solusi tidak boleh mengunjungi sel-sel ini.
  • Perhatikan bahwa nilai pada 30000 adalah mungkin 0, jadi hanya perulangan sampai Anda menekan non-nol sel tidak akan bekerja.
  • Anda hanya harus mencetak nilai di sel 30000
  • Solusi terpendek menang!
    • Tie-breaker adalah program yang lebih efisien (dijalankan dalam langkah paling tidak), diikuti oleh waktu pengiriman tercepat.

Kiat: Esolanging Fruit menyarankan menggunakan https://copy.sh/brainfuck untuk menguji kode Anda. Spesifikasi seperti yang dijelaskan dalam tantangan ini, dan Anda dapat memilih abortopsi sehingga program Anda berhenti jika melampaui batas.


Kotak Pasir (dihapus)
Jo King

3
1 byte: .. Saya menang.
Buah Esolanging

1
@EsolangingFruit Biarkan aku punya khayalanku ...
Jo King

1
Saya menyarankan mengubah aturan menjadi "pada awalnya semua sel memiliki nilai 0, kecuali sel terakhir yang memiliki nilai yang tidak diketahui".
user202729

4
Kiat bagi siapa saja yang melakukan ini: copy.sh/brainfuck mungkin adalah situs terbaik untuk melakukan ini, karena mengimplementasikan BF seperti yang dijelaskan dalam tantangan ini dan memiliki pita 30k secara default. Bergerak melewati ujung kaset menyebabkan penerjemah menggantung.
Buah Esolanging

Jawaban:


17

54 Bytes

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

119 x 252 = 29988. Lingkaran bertingkat langsung.

Saya menggunakan alat ini untuk memverifikasi bahwa pointer berhenti di 29999.


12

50 byte

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

Coba Di Sini!

Bagian pertama ( >+[>+[<]>->+]>-<<) mengatur kaset sebagai

0*12 121' 0 110

Bagian berikutnya ( [>>-------[[>]+[<]>-]<<-]) mengulangi 121 kali, menambahkan 249 1detik hingga akhir kaset setiap kali. Jika Anda cepat dalam matematika, Anda mungkin menyadari bahwa 121 * 249 ini menghasilkan dalam 30129 1detik, tetapi iterasi pertama memiliki sisa 110 untuk ditangani dan hanya ditambahkan ( 110-7) 103 1detik pada kaset, yang berarti hanya ada 29.983 1detik. Rekaman terakhir terlihat seperti:

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

Dan final >>>[>]>.untuk mencetak nilai.

Beberapa algoritma catatan lainnya:

  • 252 * 119 = 29988 (juga 50 byte)
  • 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)
    • Ini adalah yang saya anggap paling dekat berikutnya untuk mengalahkan 50, karena byte tambahan pada dasarnya hanya menempuh jarak ekstra. Jika saya bisa menemukan algoritma yang menghasilkan 118 dan bergerak lebih jauh dari 14 sel, ini bisa mengalahkannya.

3

81

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

Ini bergerak 150 sel sebanyak 200 kali.

Ini jauh lebih lama daripada yang saya inginkan, dan ada hambatan serius untuk bermain golf:

Saya tidak lagi tahu mengapa saya bekerja.

Ini dikompensasi dengan kompensasi untuk yang off-by-point di mana beberapa dari mereka mungkin bisa membatalkan. Saya telah menambahkan dan menghapus berbagai segmen sedemikian rupa sehingga saya tidak lagi ingat mengapa saya meletakkan hal-hal tertentu di tempat mereka berada (misalnya, mengapa bagian pertama menginisialisasi sel kaset menjadi 199 dan 151 alih-alih 200 dan 150?).

Bagaimanapun, ini adalah versi komentar saya tentang keburukan ini, dengan harapan bahwa saya (atau orang lain) mungkin menganggapnya berguna:

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

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
]
>-------[[->+<]>-]>.

Ini tidak benar-benar mencetak nilainya, dan jika nilainya positif melimpah. Tapi upaya yang bagus
Jo King

Kemudian tambahkan ., apakah akan membantu?
user202729

1
@ JoKing Memperbaiki itu.
Buah Esolanging
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.