Terkadang saat menulis kode brainfuck, Anda merasa perlu membuatnya lebih lama dari yang dibutuhkan untuk mendorong debugging. Anda bisa melakukannya dengan hanya memasukkannya ><
ke sana, tetapi apa yang menyenangkan itu? Anda akan memerlukan sesuatu yang lebih lama dan lebih sedikit TIDAK untuk membingungkan siapa pun yang membaca kode Anda.
Pengantar cepat untuk Brainfuck
Brainfuck adalah bahasa pemrograman esoterik yang dibuat pada tahun 1993 oleh Urban Müller, dan terkenal karena minimalisnya yang ekstrem. (Wikipedia)
Brainfuck adalah bahasa berdasarkan delapan perintah: +-><,.[]
. Kode dijalankan pada sesuatu seperti mesin Turing: rekaman tak terbatas yang nilainya dapat diubah. Dalam tantangan ini, kita akan fokus pada empat yang pertama:
+ increment the value at the pointer
- decrement the value at the pointer
> move the pointer right
< move the pointer left
Brainfuck NOPs
NOP brainfuck adalah urutan karakter brainfuck yang, ketika dieksekusi dari negara bagian manapun, menyebabkan tidak ada perubahan di negara bagian. Mereka terdiri dari empat karakter yang disebutkan di atas.
Tantangan
Tantangannya adalah untuk menulis program atau fungsi yang, ketika dieksekusi, menghasilkan NOP brainfuck acak dari panjang yang diberikan.
Memasukkan
Anda akan menerima sebagai bilangan bulat genap nonnegatif n
. (NOP tidak mungkin untuk aneh n
.)
Keluaran
Anda akan menghasilkan NOP brainfuck acak panjangnya n
.
Aturan
- Definisi NOP: ketika output dari program dimasukkan pada titik mana pun dalam program brainfuck, perilaku program tersebut tidak boleh berubah dengan cara apa pun. Dengan kata lain, itu tidak boleh mengubah keadaan penerjemah.
- Perhatikan bahwa misalnya
+>-<
tidak benar, karena mengubah nilai dari dua sel tanpa mengubahnya kembali. Silakan uji solusi Anda untuk ini sebelum memposting. - Perhatikan juga bahwa itu
+>-<->+<
adalah NOP yang tidak dapat direduksi menjadi tidak ada hanya dengan menghapus><
<>
+-
-+
. Dengan demikian, Anda tidak dapat menggunakan algoritma yang hanya menyisipkan ini di dalam satu sama lain.
- Perhatikan bahwa misalnya
- Setiap NOP yang valid dengan panjang
n
harus memiliki peluang nol muncul di output. Namun, distribusinya tidak harus seragam. - Penerjemah brainfuck yang dimaksud memiliki rekaman sel presisi arbitrer tak terbatas dua kali lipat. Artinya, Anda dapat pergi tanpa batas ke kedua arah, dan menambah / mengurangi setiap sel tanpa batas.
- Program harus selesai dalam 1 menit untuk
n
= 100 pada mesin saya, jadi tidak menghasilkan semua NOP yang mungkin dan mengambilnya. - Jika diberi input yang tidak valid (non-integer, negatif, ganjil, dll.) Anda dapat melakukan apa saja yang Anda suka, termasuk crash.
Mencetak gol
Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Contohnya
Berikut ini semua output yang valid untuk n
= 4:
++-- +-+- +--+ --++ -+-+ -++-
>><< ><>< ><<> <<>> <><> <>><
><+- ><-+ <>+- <>-+
>+-< >-+< <+-> <-+>
+><- -><+ +<>- -<>+
+->< -+>< +-<> -+<>
Berikut adalah beberapa kemungkinan keluaran untuk n
= 20:
+>>->+<->-<<<->>++<<
>+>-<+<->+-<>->+<-<+
+--+-++--++-+--+-++-
>>>>>>>>>+-<<<<<<<<<
sumber
+-<>
seperti yang Anda minta:a
.
memiliki efek samping,,
menimpa nilai yang tidak dapat dipulihkan tanpa penggunaan[]
. Tetapi[]
akhirnya akan menetapkan nilai ke nol. Ini juga menimpa nilai (jadi kita perlu yang lain[]
untuk memulihkannya) kecuali kita bisa yakin bahwa sel yang terpengaruh nol untuk memulai. Namun, kami harus mencari sel seperti[>]
itu dengan sesuatu seperti , dan mustahil untuk kembali ke posisi asal kami.Jawaban:
CJam,
6259 byteTerima kasih kepada nhahtdh karena telah menghemat 3 byte.
Karena tidak ada persyaratan untuk distribusi tertentu selama masing-masing no-op muncul dengan probabilitas terbatas, kita dapat menyederhanakan ini banyak dengan hanya menghasilkan string yang mengandung jumlah seimbang
-+
dan<>
, masing-masing, menguji apakah itu NOP dan mengurutkannya jika bukan.Tentu saja, untuk input yang lebih panjang, ini hampir selalu akan menghasilkan output yang diurutkan, tetapi Anda dapat menguji kode dengan beberapa input ingin
8
melihat bahwa pada prinsipnya dapat menghasilkan NOP dari panjang yang diberikan.Cobalah online.
sumber
CJam,
118116 byteIni sedikit keluar dari tangan ... terutama paruh kedua sepertinya harus sangat golf.
Uji di sini.
Ini menangani
N = 100
hampir seketika. Saya tidak punya waktu untuk menulis uraian lengkap kode sekarang, jadi di sini adalah algoritma:<
dan>
dengan panjang acak (datar) antara0
danN
inklusif."<>><"
menjadi[0 '< -1 '> 0 '> 1 '< 0]
.N
.+-
ke string posisi acak.Selesai Ini berdasarkan pengamatan bahwa:
<
dan>
untuk mengembalikan kepala kaset ke posisi semula.Dengan mendistribusikan jumlah
+
s dan-
s yang acak namun seimbang antara semua tempat di mana kepala pita berada pada sel tertentu, kami memastikan bahwa kami menemukan setiap NOP yang memungkinkan.sumber
Mathematica, 350 byte
Terlalu lama? Iya nih. Apakah saya peduli? Tidak sampai orang lain memposting jawaban yang valid.
sumber
+
.+
--
dan<
->
pasangan yang sama sampai satu menjadi NOP. Setengahnya diambil oleh juru bahasa BF sederhana.Python 3 , 177 byte
Cobalah online!
Saya menggunakan kode dari jawaban Bubbler untuk simulasi BF.
sumber
Python 3 , 163 byte
Cobalah online!
Program lengkap yang mencetak hasil ke STDOUT. Baris yang menjalankan kode BF mungkin golf.
Mengadopsi pendekatan Tyilo; jika kode BF yang dihasilkan bukan NOP, buang semuanya dan kembalikan ke
'+-'
berulang.sumber
JavaScript (Node.js) , 160 byte
Cobalah online!
sumber
Bahasa Wolfram (Mathematica) , 224 byte
Cobalah online!
Berikut ini versi un-golfed (atau lebih tepatnya, pre-golfed):
Kami pertama-tama memilih jumlah acak dari
<
dan>
untuk digunakan, dan menghasilkan daftar acak dengan masing-masing jumlah yang sama.Untuk mengisi sisa karakter, kami memilih posisi untuk menambahkan
+
, kemudian menemukan posisi di mana penunjuk menunjuk ke lokasi yang sama dan menambahkan di-
sana.Ulangi sampai daftar memiliki panjang
n
, dan tegangkan hasilnya.sumber