Turunan Brainfuck
Mari kita mendefinisikan bahasa pemrograman sederhana seperti Brainfuck . Ini memiliki pita dua arah sel, dan masing-masing sel memegang satu bit. Semua bit awalnya 0. Ada kepala bergerak di kaset, awalnya di posisi 0. Program adalah string di atas karakter <>01!
, dieksekusi dari kiri ke kanan, dengan semantik berikut:
<
menggerakkan kepala satu langkah ke kiri.>
menggerakkan kepala satu langkah ke kanan.0
menempatkan 0 di sel saat ini.1
menempatkan 1 di sel saat ini.!
membalik sel saat ini.
Tidak ada loop, jadi program n karakter berakhir setelah langkah n persis . Suatu program membosankan jika semua sel berisi 0 pada akhir eksekusi, dan menarik jika ada setidaknya satu 1. Perhatikan bahwa ukuran rekaman itu tidak ditentukan, jadi tergantung pada implementasinya, mungkin dua arah tak terbatas atau bundar.
Contoh program
Pertimbangkan programnya 1>>>!<<<<0>!>>>!
. Pada rekaman tanpa batas, eksekusi berlangsung sebagai berikut:
v
00000000000000 Put 1
v
00000100000000 Move by >>>
v
00000100000000 Flip
v
00000100100000 Move by <<<<
v
00000100100000 Put 0
v
00000100100000 Move by >
v
00000100100000 Flip
v
00000000100000 Move by >>>
v
00000000100000 Flip
v
00000000000000
Pada akhirnya, semua sel adalah 0, jadi program ini membosankan. Sekarang, mari kita jalankan program yang sama pada pita bundar dengan panjang 4.
v
0000 Put 1
v
1000 Move by >>>
v
1000 Flip
v
1001 Move by <<<< (wrapping around at the edge)
v
1001 Put 0
v
1000 Move by > (wrapping back)
v
1000 Flip
v
0000 Move by >>>
v
0000 Flip
v
0001
Kali ini, ada sel dengan nilai 1, jadi programnya menarik! Kami melihat apakah suatu program membosankan atau menarik tergantung pada ukuran rekaman itu.
Tugas
Input Anda adalah string yang tidak kosong <>01!
yang mewakili program dalam bahasa pemrograman di atas. Berbagai karakter juga merupakan format input yang dapat diterima. Program ini dijamin akan membosankan ketika dijalankan pada kaset tanpa batas. Output Anda akan menjadi daftar panjang tape di mana program ini menarik. Perhatikan bahwa Anda hanya perlu menguji program pada kaset yang lebih pendek dari panjang program.
Solusi dengan jumlah byte terendah dalam setiap bahasa adalah pemenangnya. Aturan standar kode-golf berlaku.
Uji kasus
> : []
110 : []
1>0<! : [1]
0>>1>0<<>! : [1]
1>>>!<<<<0>!>>>! : [2, 4]
!<!<><<0>!>!<><1!>>0 : [2]
>>!>><>001>0<1!<<!>< : [1, 2, 3]
1!><<!<<<!!100><>>>! : [1, 3]
!!1>!>11!1>>0<1!0<!<1><!0<!<0> : [3, 4]
<><<>>!<!!<<<!0!!!><<>0>>>>!>> : [1, 2, 4]
0>>><!<1><<<0>!>>!<<!!00>!<>!0 : [3]
0000!!!!><1<><>>0<1><<><<>>!<< : []
!>!>!>!>!>1>!>0<!<!<!<0<!<0<!<!<!<1>!>0<<! : [1, 2, 5, 7]
<!!>!!><<1<>>>!0>>>0!<!>1!<1!!><<>><0<<!>><<!<<!>< : [1, 2, 4, 5]
!>1<<11<1>!>!1!>>>0!!>!><!!00<><<<0<<>0<<!<<<>>!!> : [1, 2, 3, 5, 6]
<>01!
?Jawaban:
Haskell, 119 byte
Cobalah online!
Fungsi
#
adalah penerjemah untuk satu perintahc
. Seluruh programp
dijalankan olehfold
ing#
dengan pita mulai menjadip
.f
dijalankanp
untuk setiap pita dan menyimpannya di tempat jumlah sel setidaknya 1.sumber
n<-[1..length p] ... 0<$[1..n]
sepertinya cukup panjang, pasti ada jalan yang lebih pendek.n
sebagai hasilnya, jadi jika Anda membuat0<$[1..n]
cara yang berbeda (katakanlah denganscanr(:)
), Anda harus mengambilnyalength
. (Saya juga mencoba menggunakan1
(untuk menggantilength
dengansum
) atauFalse
(untuk menggunakanor
untuk tes) alih-alih0
, tetapi tidak keluar lebih pendek.)n<-init$scanr(:)[]$0<$p ... n
yang lebih pendek 2 byte, tetapi mengembalikan daftar kaset awal bukannya panjangnya, mis[[0],[0,0,0]]
. Dengan sedikit aturan yang tertekuk sehingga bisa melihat kaset sebagai angka unary, jadi mungkin tidak apa-apa.init$
dapat diganti dengan menempatkan[0]
daftar awal, tetapi masih belum cukup pendek. Saya pikir unary hanya diperbolehkan untuk bahasa tanpa representasi bilangan yang lebih alami .Stax ,
5654433835 byte CP43742 byte saat dibongkar,
Jalankan dan debug online!
-2 byte per komentar oleh @recursive
Penjelasan
Saya akan menggunakan versi dengan awalan
i
(yaitui%fz(y{{|(}{|)}{B!s+}{0_]e&}4ls"><! "I@!F|a
) untuk menjelaskan dan saya akan menjelaskan mengapai
bisa dihapusKode untuk menjalankan program:
sumber
i
cek Anda .0]*
dapat diganti denganz(
. Juga, jika Anda mengubah string ke "<>!", Maka0
dan1
akan memberikan indeks -1, sehingga cara daftar blokir Anda hanya membutuhkan 4 blok, bukan 5. Ini akan berfungsi karena toh0
dan1
handler identik pula.CJam ,
57564946 byte-7 terima kasih kepada @MartinEnder
Cobalah online!
sumber
Perl 5 ,
83827977 byteTermasuk
+3
untuk-F
Berikan instruksi sebagai satu baris di STDIN
Cobalah online!
sumber
Perl 5 (
-F
), 101 byteCobalah online!
sumber
Merah , 243 byte
Cobalah online!
Prety verbose dan implementasi langsung. Pengindeksan 1 merah tidak memungkinkan saya untuk mengurangi jumlah byte dengan menggunakan aritmatika modular untuk perulangan melalui kaset melingkar.
Tidak disatukan
sumber
Python 2 ,
139135133132131 byte-3 byte terima kasih kepada Tn. Xcoder
Cobalah online!
sumber
Retina , 121 byte
Cobalah online! Penjelasan:
Buat larik kaset dengan panjang masing-masing hingga panjang program input.
Ulangi sampai program dikonsumsi.
Jika karakter berikutnya dalam program adalah 0 atau 1, ubah karakter pertama pada setiap baris ke karakter itu.
Jika a
!
maka beralih karakter pertama di setiap baris.Jika itu adalah
>
atau<
kemudian putar garis. (Lebih mudah daripada menggerakkan kepala.)Hapus instruksi dan akhiri loop.
Pertahankan hanya garis yang menarik.
Hitung panjang setiap baris.
sumber
JavaScript (ES6),
126118 byteDisimpan 3 byte berkat @ user71546
Mengambil input sebagai array string 1 karakter.
Cobalah online!
sumber
t.some(x=>x)?
dengan+t.join``?
memeriksa array sebagai digit (dan 0 menunjukkan semua-nol tape), tetapi 3 byte lebih sedikit.APL (Dyalog Unicode) ,
796454 byte ( Adám's SBCS )Cobalah online!
-15 Berkat Adám (lupa tentang monadik
⍸
).-10 Terima kasih kepada ngn .
sumber
↓
). Saya akan memeriksanya dan memperbarui. :)↓
Anda akan membutuhkan;
, bukan?MATL ,
4639 byteCobalah online! Atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
APL (Dyalog Unicode) ,
19278 byteCobalah online! (hasil tidak rata)
Cobalah online! (diratakan)
Setelah beberapa waktu menghabiskan membenturkan kepala ke dinding, saya memutuskan untuk membuat Tradfn, bukan Dfn. Ini hasilnya. Orang yang lebih pintar daripada saya mungkin bisa bermain golf dari ini.Kejutan, kejutan, seseorang yang lebih pintar dariku melakukan golf dari ini. Terima kasih untuk 114 byte.
Dia berkata:
Fungsi ini mengasumsikan
⎕IO←0
.Bagaimana?
(Penjelasan ini menggunakan versi "ungolfed" untuk memfasilitasi membaca)
sumber
t←l⍴0
menjadit←l⍴i←0
, dan hapus baris di atasnya. Anda juga dapat menyimpan yang lain dengan mengubaht[i|⍨≢t]←1-t[i|⍨≢t]
ket[i|⍨≢t]←~t[i|⍨≢t]
.∇
s?∇
? Ini adalah fungsi diam-diam.Jelly , 41 byte
Cobalah online!
sumber
C (dentang) , 171 byte
Cobalah online!
Harus menggunakan dentang, karena menggunakan
char*p,t[l=strlen(S)]
sebagai ekspresi inisialisasi untuk beberapa alasan membuat GCC berpikir saya ingin mendeklarasikanstrlen
alih-alih menyebutnya.Cukup lurus ke depan: Menjalankan program pada kaset melingkar dengan panjang yang semakin berkurang, menghasilkan panjang yang menghasilkan 1 di suatu tempat di pita.
Mencoba memperpendek kusut operator ternary, tetapi akhirnya membutuhkan lebih banyak tanda kurung daripada yang sehat.
sumber
i=0,bzero(t,l)
alih-alihmemset(t,i=0,l)
dan*p-62?t[i]=*p^33?*p-48:t[i]^1:(i=~i+l?i+1:0)
bukannya*p==62?i=i^l-1?i+1:0:*p^33?t[i]=*p-48:(t[i]^=1)