RLE Brainfuck
(terkait dengan BF-RLE )
Dialek RLE ( Run-Length Encoding ) hipotetis dari Brainfuck menerima simbol untuk 8 perintah dan juga menerima angka. Digit digunakan untuk mewakili jumlah pengulangan berturut-turut dari suatu perintah, sehingga memungkinkan pengodean run-length dari kode sumber.
8>
sama dengan >>>>>>>>
.
Panjang selalu di sisi kiri perintah.
Tugas Anda adalah menulis program / fungsi terpendek yang menerjemahkan string input (fragmen RLE Brainfuck) ke dalam program Brainfuck biasa.
Sebagai contoh:
Memasukkan:
10+[>+>3+>7+>10+4<-]3>2+.>+.7+2.3+.2<2+.>15+.>.3+.6-.8-.2<+.<.
Ouptut:
++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>++.>+.+++++++..+++.<<++.>+++++++++++++++.>.+++.------.--------.<<+.<.
Kode terpendek dalam hitungan byte dalam setiap bahasa akan menang.
Jawaban:
Python 2 ,
6261 byteCobalah online!
Substitusi regex diperluas
3<2+-
ke string:yang kemudian
eval
diedit. (Perhatikan bagaimana ketika\1
kosong, kita dapatkan1**1 = 1
.) Yang pertama+
adalah operator unary yang mengikat ke nomor pertama, dan yang lainnya+
adalah penggabungan string. Ini berdetak lebih jelasdengan 14 byte. Biasanya
"\2"
tidak selalu berhasil, tetapi untungnya\
dan"
bukan perintah brainfuck.xnatau menyimpan byte, memasok
1*\1*1
trik. Sebelumnya saya punya\1L
di regex, dan didefinisikanL=1
sebagai argumen lambda, yang juga cukup keren:3L
adalah int literal panjang danL
merupakan variabel.sumber
L
untuk menangani string kosong. Ada cara yang lebih pendekr'+1*\1*1*"\2"'
,.import re
bawah lambda?f=\
Header - sekarang lambda memiliki nama!)Pyth , 2 byte
Coba di sini!
Bagaimana itu bekerja
sumber
Lua,
656463 BytesBagus ! Untuk sekali ini, Lua mengalahkan Python!Sunting: Disimpan satu byte berkat @Jarhmander, terima kasih padanya untuk trik yang berguna untuk memaksakan hasil tunggal
Cobalah online!
Penjelasan
sumber
,""
dan melampirkan di parens seluruh argumen cetak. Ekspresi terlampir dalam parens disesuaikan dengan satu nilai dalam Lua (lihat lua.org/manual/5.3/manual.html#3.4 ).Scala ,
7369 byteCobalah online!
sumber
Perl 5 , 18 byte
17 byte kode +1 untuk
-p
.Cobalah online!
sumber
vim,
2925232216 byte<C-V>
adalah 0x16,<ESC>
adalah 0x1b.Ini bekerja dengan mengganti setiap non-digit dengan perintah yang menambahkan karakter itu ke buffer. Hitungan dibiarkan sendiri dan memodifikasi perintah-perintah itu. Pada titik ini, buffer adalah program vimscript yang menghasilkan program Brainfuck yang diinginkan, jadi kami menariknya ke dalam register dan menjalankannya.
Cobalah online!
Sunting: Pengurangan ukuran berkat saran: H.PWiz: 5, TheFamilyFroot: 5, DJMcMayhem: 1
sumber
&
atau\0
) sebagai gantinya tanpa tanda kurung. Juga, tip dari saya, bukan TheFamilyFroot adalah bahwa Anda bisa menggunakanD
alih-alihdd
untuk-1
byte.RLE Brainfuck, 204 byte
Seperti yang saya pahami, spesifikasi untuk lingkungan brainfuck tidak super jelas. Program ini mengasumsikan bahwa sel-sel dalam rekaman memungkinkan bilangan bulat positif dan negatif sewenang-wenang besar, tanpa meluap. Kode ini juga akan mentranskripsi komentar non-perintah, tetapi akan memperluas pengkodean komentar run-length (mis. "Lihat 3b" → "see bbb"). Program yang dihasilkan harus menjalankan hal yang sama, jadi saya tidak terlalu khawatir.
Saya cukup yakin saya masih bisa bermain golf beberapa byte dari ini, tetapi saya lelah bekerja dengannya.
Inilah tes + juru bahasa khusus yang telah saya gunakan untuk mengujinya. Jika Anda memasukkannya input dalam kotak Input Standar itu harus berjalan terhadap input itu daripada menjalankan tes.
Workpad saya yang ungolfed berantakan:
sumber
10+
? OP mengklarifikasi dalam komentar yang menghitung akan selalu lebih besar dari 0, sehingga Anda mungkin dapat mencukur beberapa byte jika itu yang pertama.while max
loop selalu berjalan setidaknya sekali, dan saya tanpa syarat menaikkan buffer di mana saya menyimpan nilai digit dalam loop itu, saya harus memulai buffer itu pada -1. Saya ingin tahu apakah saya dapat menyimpan beberapa byte dengan meninggalkan buffer itu secara logis padavalue+1
🤔Ditumpuk , 24 byte
Cobalah online!
Penjelasan
sumber
TeX, 124 byte
(menulis dalam dua baris agar terlihat, tetapi kode dapat ditulis dalam satu baris)
Ini mendefinisikan makro
\b
yang mengambil input dalam bentuk\b<input>;
, dan mencetak output yang diinginkan ke dokumen.sumber
Retina ,
2823 byteterima kasih kepada @ Leo untuk -5 byte
Cobalah online!
sumber
\b
di regex kedua hanya cocok dengan satu1
per menjalankan1
s?Pyon , 66 byte
Cobalah online!
Pyon cukup banyak hanya Python, tetapi ini lebih pendek karena
re
secara otomatis diimpor ketika Anda menggunakannya, dana
secara otomatis diatur ke argumen atau input-4 byte terima kasih kepada Tn. Xcoder
sumber
g[0]
menjadig[:-1]
(gagal untuk kasus uji yang diberikan atau angka apa pun yang lebih tinggi dari 9).lambda
yang benar-benar membuang byte? Golf dan dikoreksi untuk 66 bytePython 2 ,
1009389 byte-7 dengan terima kasih kepada Mr.Xcoder
Cobalah online!
sumber
Haskell , 60 byte
Cobalah online!
sumber
R ,
12110690 byteCobalah online!
Disimpan 15 byte dengan menyadari bahwa
rep()
akan memaksa untuk numerik. Disimpan 16 berkat Giuseppe, terutama dari penggunaanpmax
untuk mengganti string kosong dengan1
sumber
ifelse(x>"",x,1)
byte lebih pendek, dan\\D
setara dengan[^\\d]
dan yang terbaik, Anda tidak perluperl=T
, jadi ini adalah 99 byte yang manis . Saya benar-benar tidak berpikir ini bisa kurang dari 100 byte!pmax
pmax
memberikan peningkatan besar yang bagus - terima kasih!"1"
dengan1
seperti yangpmax
akan memaksacharacter
untuk perbandingan.PowerShell ,
6662 byteCobalah online!
Kerusakan
Berantakan sekali!
Mulai dari
$args
, yang merupakan array elemen tunggal yang berisi string RLE, saya memaksa menjadi string yang sebenarnya dengan membungkusnya dengan tanda kutip.Kemudian pisahkan dengan batas kata (
\b
dalam regex). Itu akan memberi saya array string, di mana setiap elemen adalah angka atau token BF yang datang setelah angka. Jadi dalam contoh, pertama 4 elemen array perpecahan ini10
,+]>+>
,3
,+>
(semua string).Selanjutnya, saya pipa itu ke
ForEach-Object
(%
) untuk menangani setiap elemen .Bagian tengahnya adalah golfism PowerShell yang terkenal, dengan twist; itu pada dasarnya operator DIY ternary, di mana Anda membuat array 2 elemen kemudian indeks ke dalamnya menggunakan ekspresi boolean yang ingin Anda uji, di mana hasil yang salah memberi Anda elemen 0 dan hasil yang benar memberi Anda elemen 1.
Dalam hal ini, saya benar-benar membuat array elemen tunggal dengan
,
operator koma unary , karena saya tidak ingin output dalam kasus yang sebenarnya.Pertama mari kita lihat pengindeks, meskipun dieksekusi nanti.
Gagasannya adalah
$_
(elemen saat ini) dapat berupa angka yang valid, atau string lain. Jika itu angka, saya ingin$n
menjadi nilai angka itu minus 1 (sebagai angka, bukan string). Jika tidak, saya mau$n
salah-y.PowerShell biasanya mencoba untuk memaksa nilai kanan ke jenis sisi kiri, tetapi itu bisa bergantung pada operasi. Sebagai tambahan,
"10"+5
akan memberi Anda string baru"105"
,, sedangkan10+"5"
akan memberi Anda integer (15
).Tetapi string tidak dapat dikurangi sehingga PowerShell dapat menyimpulkan nilai numerik secara otomatis dengan string di sisi kiri pengurangan, oleh karena itu
"10"-5
memberi5
.SO, saya mulai dengan
$_-1
, yang akan memberi saya nomor yang saya inginkan ketika$_
sebenarnya angka, tetapi ketika tidak, saya tidak mendapatkan apa-apa. Di permukaan, "tidak ada" adalah falsey, tetapi masalahnya adalah berhenti menjalankan tugas itu, jadi$n
akan mempertahankan nilai sebelumnya; bukan yang saya inginkan!Jika saya membungkusnya dalam subekspresi, maka ketika gagal, saya mendapatkan nilai falsey saya:
$($_-1)
.Bahwa semua ditugaskan
$n
dan karena tugas itu sendiri dibungkus dengan tanda kurung, nilai yang ditugaskan$n
juga akan diteruskan ke pipa.Karena saya menggunakannya di pengindeks, dan saya ingin
1
jika konversi berhasil, saya menggunakan duanot
ekspresi boolean!!
untuk mengubah nilai ini menjadi boolean. Konversi angka yang sukses berakhir sebagai benar, sedangkan ketiadaan falsey memberi kita manis, manis0
yang memungkinkan untuk mengembalikan satu-satunya elemen dalam array ternary palsu itu.Kembali ke array itu, elemennya adalah ini:
$("$($_[0])"*$n*$_)
$(,$_[0]*$n+$_)
"$($_[0])"
- Ini adalah cara yang sangat panjang untuk mendapatkan karakter pertama dari elemen saat ini (katakanlah, dapatkan+
dari+[>+
), tetapi sebagai string dan bukan sebagai[char]
objek. Saya membutuhkannya untuk menjadi string karena saya dapat mengalikan string dengan angka untuk menduplikasi, tetapi saya tidak bisa melakukannya dengan karakter.Sebenarnya saya berhasil menyimpan 4 karakter dengan menggunakan
[char]
array alih-alih string (dengan menggunakan koma unary lain,
), jadi saya dapat menghapus tanda kutip dan sub-ekspresi tambahan. Saya bisa mengalikan array untuk menduplikasi elemen-elemennya. Dan karena seluruh hasil iterasi ini akhirnya menjadi sebuah array dan perlu-join
diedit, menggunakan array di sini tidak menimbulkan biaya tambahan.Lalu, saya kalikan array
string itudengan$n
, untuk menduplikasinya$n
kali. Ingat itu$n
bisa terjadi$null
atau bisa nilai digit sebelumnya minus satu.Kemudian
+$_
tambahkan elemen saat ini ke akhir karakter pertama yang digandakan dari elemen itu. Itu sebabnya$n
minus satu.Dengan cara ini,
10+[>+
berakhir dengan$n
sama dengan 9, maka kita menghasilkan 9+
's dan menambahkannya kembali ke+[>+
string untuk mendapatkan 10 yang diperlukan, ditambah elemen tunggal lainnya sepanjang untuk perjalanan.Unsur ini dibungkus subexpression sebuah
$()
karena ketika$n
adalah$null
, seluruh ekspresi gagal, sehingga menciptakan array gagal, sehingga pengindeks tidak pernah berjalan, sehingga$n
tidak pernah akan ditugaskan.Alasan saya menggunakan trik ternary ini adalah karena salah satu kekhasannya: tidak seperti operator ternary nyata, ekspresi yang menentukan elemen lakukan bisa dievaluasi apakah atau tidak mereka "dipilih", dan pertama dalam hal ini.
Karena saya perlu menetapkan dan kemudian menggunakannya
$n
pada iterasi yang terpisah, ini sangat membantu. Nilai elemen array ternary akan dievaluasi dengan nilai iterasi sebelumnya$n
, kemudian pengindeks ditugaskan kembali$n
untuk iterasi saat ini.Sehingga
ForEach-Object
loop akhirnya menghasilkan semua yang seharusnya (banyak kesalahan yang kita abaikan), tetapi sebagai array dari string baru.Sehingga semuanya dibungkus dalam tanda kurung dan kemudian didahului oleh unary
-join
untuk memberikan string keluaran.sumber
QuadR , 17 byte
Cobalah online!
Terima kasih kepada Adám karena menyediakan versi kode yang benar.
Bagaimana itu bekerja:
sumber
'\d+.'⎕R{¯1((⍎↓)⍴↑)⍵.Match}
Proton , 50 byte
Cobalah online!
sumber
Java 8, 148 byte
Gdamn regexJava kadang-kadang sangat tidak berguna .. Terakhir kali itukurang menggunakan kelompok tangkap"$1"
untuk apa pun, sekarang ini .. Saya ingin mengganti3c
denganccc
atau000c
denganccc
sebagai satu-liner, tapi sayangnya Jawa tidak memiliki cara untuk melakukan ini tanpa lingkaran. BaiklahPenjelasan:
Coba di sini.
sumber
Haskell , 84 byte
Cobalah online!
Penjelasan:
span(`elem`['0'..'9'])s
membagi string yang diberikans
menjadi awalan digit dan sisanya. Pencocokan pada hasil pada pola(n:m,x:r)
memastikan bahwa awalan digit tidak kosong dan mengikat karakter setelah digit kex
dan sisanya ker
.x<$[1..read$n:m]
membaca deretan angkan:m
sebagai angka dan mengulangix
itu berkali-kali. Hasilnya digabungkan dengan perawatan rekursif dari string yang tersisar
.sumber
R , 151 byte
Dikalahkan oleh pengguna2390246 ! Ini sekarang pada dasarnya pendekatan sampah dibandingkan dengan yang itu, tapi saya akan terus memperbaikinya.
Cobalah online!
Juga menghasilkan banyak peringatan.
Selanjutnya, melihat apakah menggunakan
grep
lebih efisien daripadasubstr
sumber
JavaScript (ES6), 46 byte
Penjelasan yang cukup mudah:
sumber
Ruby , 35 byte
Cobalah online!
sumber
Kalkulus Lambda yang tidak diketik , 452 byte
Input dan output terdiri dari daftar lipatan kanan dari kode karakter yang dikodekan gereja , misalnya kode karakter dari baris baru adalah 10 sehingga pengkodean gereja akan menjadi
λf.λx.f(f(f(f(f(f(f(f(f(f x)))))))))
. Mengonversi "ABCD" ke daftar terlihat sepertiλf.λx.f 65 (f 66 (f 67 (f 68 x)))
tetapi dengan angka yang dikodekan oleh gereja.Menerapkan string yang disandikan ke program dan menguranginya sepanjang jalan akan memberikan Anda string keluaran yang disandikan dengan RLE yang diterapkan.
sumber
qλq
notasi itu? Saya belum pernah melihat itu sebelumnya.Funky , 42 byte
Cobalah online!
sumber
C ++,
239235 byte-4 byte berkat Zacharý
sumber
g=(g?g:1)
keg+=!g
? Jika itu tidak berhasil, tidak bisakah Anda menghilangkan tanda kurung di sekitarg?g:1
Dart, 78 byte (dengan regex), 102 byte (tanpa regex)
Dengan Regex:
Tanpa Regex:
Keduanya harus dipanggil seperti
(<code here>)("input string")
.Regex satu cukup standar, tetapi regex-kurang cukup istimewa.
Regex-less penyalahgunaan parameter opsional untuk mengalokasikan variabel lokal dalam fungsi "pengembalian tunggal", jika tidak, Anda perlu membuat blok dan memiliki kata kunci kembali. Untuk setiap unit kode, jika unit kode antara 0 dan 9 itu diakumulasikan ke
n
dan string kosong dikembalikan. Jika tidak, karakter dikalikan dengan nilain
(khusus cased jika n == 0, dalam hal itu akan selalu memancarkan 1 karakter) dann
diatur ke 0.(n=0*(c=n))+c
mengatur argumen kode char ke nilain
, mengalikann
/c
dengan 0 , simpan 0 hinggan
, lalu tambahkanc
. Ini mengatur ulang kitan
tanpa dalam konteks pernyataan.sumber
Python3, 96 bytes
I tried another implementation in Python, but i don't beat /codegolf//a/146923/56846 :(
sumber