Diberikan input dari sebuah program yang ditulis dalam OOo CODE , output kode BF yang diwakilinya.
Berikut ini adalah deskripsi singkat tentang cara kerja oOo CODE:
Pertama, semua karakter non-alfabet dihapus (semuanya tidak ada dalam jangkauan
A-Za-z
).Misalnya, ambil program
PROgRam reVERsES giVeN iNPut sEqUENcE
(contoh yang diberikan pada halaman wiki esolangs yang melakukan persis seperti yang Anda harapkan). Setelah langkah pertama ini, sekarang kita milikiPROgRamreVERsESgiVeNiNPutsEqUENcE
.Selanjutnya, bagi semua karakter yang tersisa ke dalam kelompok 3. Kita sekarang miliki
PRO,gRa,mre,VER,sES,giV,eNi,NPu,tsE,qUE,NcE
. Jika ada grup tambahan 1 atau 2 karakter, buanglah.Ubah setiap grup yang terdiri dari 3 huruf menjadi perintah BF berdasarkan tabel berikut:
ooo > ooO < oOo [ oOO ] Ooo - OoO + OOo . OOO ,
Yaitu, jika huruf pertama grup adalah huruf kecil, yang kedua adalah huruf besar, dan yang ketiga adalah huruf kecil, itu akan menerjemahkan ke perintah
[
.Dengan contoh kita, ini akhirnya menjadi program BF
,[>,]<[.<]+
, yang memang membalikkan inputnya.
Karena ini adalah kode-golf , kode terpendek dalam byte akan menang.
Kasus uji:
<empty string> -> <empty string>
A -> <empty string>
Ab -> <empty string>
Abc -> -
AbcD -> -
AbcDe -> -
AbcDef -> --
1A_b%c*D[]e\\\f! -> --
PROgRamreVERsESgiVeNiNPutsEqUENcE -> ,[>,]<[.<]+
sumber
Jawaban:
oOo,
15691515 byteHarus dilakukan. Coba di sini .
Golf:
Diterjemahkan ke Brainfuck (dengan linebreak untuk kejelasan):
Tidak digabungkan dengan penjelasan:
Terima kasih atas tantangan yang menarik!
sumber
CJam,
3635 byteUji di sini.
Penjelasan
sumber
JavaScript (ES6),
949391858483 byteDisimpan 1 byte berkat @ dev-null
Saya sudah mencoba banyak varian ini, tetapi ini tampaknya yang terpendek. Juga berfungsi pada input kosong!
Bagaimana itu bekerja
Pertama, dengan
x.replace(/[a-z]/gi,c=>
, kita temukan ambil setiap hurufc
dalam input. Kami mengatura
danb
ke""
di ujung lain dari panggilan fungsi, karena fungsi mengabaikan parameter melewati yang kedua.a
akan menyimpan string biner untuk menentukan karakter yang sedang kita buat, danb
akan menyimpan hasilnya.Sekarang untuk bagian membingungkan: pertama, dengan
(a+=+(c<'a'))
, kita tambahkan sebuah0
kea
jikac
adalah huruf besar;1
jika tidak. Ungkapan ini mengembalikan nilai barua
, sehingga kemudian kita dapat memeriksa jika telah mencapai tiga karakter panjang dengan dengan memeriksa jika karakter pada indeks 2 ada:[2]?
. Jika tidak, kita cukup mengakhiri fungsinya dengan:0
.Jika
a
sekarang panjangnya tiga karakter, itu adalah angka biner antara000
dan111
. Kita dapat mengonversinya menjadi angka desimal dengan menambahkan"0b"
ke awal, lalu memaksa mesin untuk menguraikannya sebagai angka'0b'+a-0
.Namun, kita masih perlu mengatur ulang
a
ke string kosong. Kita tidak bisa begitu saja melakukannya'0b'+(a="")-0
karena itu berarti string yang diurai itu adil0b
. Untungnya, ketika diuraikan sebagai angka, string kosong menjadi 0, jadi kita bisa mengganti0
dengan(a="")
.Sekarang kita memiliki nomor kita, dan kita dapat menambahkan karakter pada indeks itu
"><[]-+.,"
keb
. Setelah penggantian selesai, kami gunakan&&b
untuk mengembalikannya dari fungsi. (Ya, kecuali jika hasilnya.replace
kosong, yang hanya terjadi pada input kosong dan mengembalikan string kosong.)sumber
'0b'+a-0
vs+`0b${a}`
dan+("0b"+a)
replace
menanglah!match
...05AB1E ,
3532 byteKode:
Menggunakan trik yang sangat pintar dari Martin Büttner, dari jawaban ini . Penjelasan:
Cobalah online!
Menggunakan pengodean CP-1252 .
sumber
Retina ,
79757170 byteBerkat randomra untuk menghemat 1 byte.
Cobalah online!
Penjelasan
Kami mulai dengan menghapus semua yang bukan surat.
Ini membagi string menjadi potongan-potongan dari tiga karakter dengan mengembalikan semua 3-karakter yang cocok (tidak tumpang tindih). Ini secara otomatis membuang potongan trailing yang tidak lengkap.
Sertakan a
;
ke setiap baris. Kami akan menggunakan ini sebagai penanda untuk konversi basis-2. Omong-omong, kami hanya akan memperlakukan huruf besar sebagai1
huruf kecil0
.Ini melakukan konversi base-2 ke unary yang lucu. Pada setiap langkah kami cukup menggandakan karakter kiri
;
dan memindahkan;
satu ke kanan. Mengapa ini bekerja? Ingat kami akan menafsirkan huruf kecil sebagai0
dan huruf besar sebagai1
. Setiap kali kami memproses surat, kami cukup menggandakan total running (di sebelah kiri) sejauh ini - huruf kecil lebih rendah2*0=0
, jadi mereka dapat sepenuhnya diabaikan dan huruf besar mewakili angka biner sejauh ini, jadi menggandakannya adalah apa yang kita mau. Kemudian kami menambahkan huruf saat ini ke total yang berjalan yang mewakili0
atau1
sesuai.Hapus semua huruf kecil / nol.
Cocokkan setiap baris dan ganti dengan jumlah karakter (desimal) di baris itu. Karena
;
ini mengubah angka unary menjadi setara desimal + 1.Transliterasi yang menggantikan 1-8 dengan perintah yang sesuai.
Hapus umpan baris.
sumber
;
. Saya akan mengeditnya nanti.MATL ,
3832 byteCobalah online!
sumber
Japt,
3736 byteUji secara online!
Bagaimana itu bekerja
sumber
JavaScript (ES6),
11195 byteCukup menghapus non-huruf, mengubah huruf besar menjadi 1s dan huruf kecil menjadi 0s, membaginya menjadi kelompok tiga, mengabaikan kelompok tertinggal 1 atau 2, dan menerjemahkan kelompok.
Sunting: Disimpan 16 byte berkat @ dev-null, meskipun kode tidak lagi berfungsi saat melewati string kosong.
sumber
match(/.../g).map().join
pendekatan tetapi salah menghitung jumlah byte dan meskipun itu tidak menyelamatkan saya apa pun. Terima kasih atas tip pada pertandingan pertama.Python 3, 91 byte
Hmm ... terlihat agak panjang, terutama baris kedua.
b=[b,2*b+(c<'a')][c.isalpha()]
sedikit lebih buruk.sumber
Pyth, 40 byte
Coba di sini!
Bisa menghemat 2 byte jika saya bisa menampilkan hasilnya sebagai daftar karakter, bukan string.
Penjelasan
Memfilter semua non-huruf, mengubah huruf besar menjadi 1 dan huruf kecil menjadi 0, terbagi menjadi bilangan 3, menafsirkan setiap potongan sebagai angka biner dan menggunakan ini sebagai indeks ke dalam string yang berisi semua perintah BF.
sumber
Jolf,
3134 byteCoba di sini! Ganti
►
dengan\x10
dan♣
dengan\x05
. Karena saya mengimplementasikan fungsi chop yang salah, saya memperoleh 3 byte. :(sumber
Hoon , 212 byte
Tidak Disatukan:
Hoon tidak memiliki ekspresi reguler yang benar, hanya parser combinator library, jadi sayangnya cukup bertele-tele. Pemindaian ++ juga macet jika seluruh aliran input tidak diuraikan, jadi saya harus menggunakan ++ rose, memaksanya menjadi sebuah unit, dan membuka bungkusnya untuk nilai "parse terjauh". Itu juga membuat penggunaan berat untuk currying dan pemetaan daftar (++ turn), jadi saya alias nama fungsi ke satu variabel huruf.
Hoon adalah bahasa pemrograman untuk Urbit, proyek implementasi ulang yang bersih. Ini murni fungsional, diketik secara statis, samar-samar mirip lisp, dan dikompilasi ke Nock. Nock adalah VM berbasis kombinator yang berjalan di atas model memori bignum pohon biner.
Ketika Anda mem-boot Urbit Anda masuk ke: dojo, shell dan Hoon repl. Untuk menjalankan cuplikan cukup ketik:
dan kemudian tempel fungsi mandiri di baris berikutnya.
sumber
Jelly , 27 byte
Cobalah online! Perhatikan bahwa garis miring terbalik perlu keluar dalam string input untuk kasus uji terakhir kedua.
sumber
Matlab, 98 byte
sumber
Perl,
767372 + 1 = 73 byteMembutuhkan
-n
bendera:Menggunakan trik dengan konversi basis-2 .
Bagaimana itu bekerja:
sumber
Julia, 107 byte
Ini adalah fungsi anonim yang menerima string dan mengembalikan string. Untuk menyebutnya, tetapkan ke variabel.
Tidak Disatukan:
sumber
Lua, 120 Bytes
Penggunaan besar di
string.gsub()
sini, sekali lagi bisa memungkinkan saya untuk membuat pointer satu karakter pada fungsi ini untuk mendapatkan beberapa byte. Juga, ini adalah program lua pertamaku tanpa spasi! : DProgram ini mengambil inputnya melalui argumen baris perintah dan mengeluarkan program BrainFuck, satu perintah per baris.
Sunting: Disimpan 1 Byte berkat @Oleg V. Volkov
Ungolf dan penjelasan
sumber
b
dan satu lagi pada tabunganstring.gsub
ke var pendek dan secara manual melipat argumen pertama untuk itu:g=("").gsub g(g(g(g(arg[1],"[%A]",""),"%l",0),"%u",1),"...",function(c)x=1+tonumber(c,2)print(("><[]-+.,"):sub(x,x))end)
Python 2, 112 byte
Akan mencoba golf lebih banyak.
sumber
Mathematica, 192 byte
Fungsi anonim yang mengambil string yang diinginkan sebagai argumen. Langkah-langkah dalam algoritma (sangat mudah):
sumber
Ruby
1171141131118679 Bytestr(?^+m='a-zA-Z','')
set m ke'a-zA-Z'
dan menghapus non-huruf.tr(m,?0*26+?1)
mengkonversi huruf kecil ke 0, huruf besar ke 1.scan(/.../)
potong string menjadi grup 3 dan buang grup terakhir jika memiliki kurang dari 3{$><<"><[]-+.,"[$&.to_i 2]}
konversi setiap nomor biner menjadi karaktersumber
tr("a-zA-Z","01")
? atau bahkantr("A-Za-z",10)
"AAz".tr("a-zA-Z","01")
memberikan111
gets.delete('^a-zA-Z').tr("a-z",?0).tr("^0",?1).scan(/.../){$><<"><[]-+.,"[$&.to_i 2]}
(86 byte). Mengubah input dari opsi baris perintah ke stdin; memperbaiki tanda kutip di output (tapi sekarang tidak memiliki baris baru)tr(^a-zA-Z','').tr('a-zA-Z',?0*26+?1)
lebih pendekPerl 6, 81 byte
Ini mungkin bisa dilakukan dengan lebih baik, tetapi ini adalah tugas saya
Pemakaian
Tidak disatukan
sumber
C ++,
173167 byteProgram lengkap, golf (dibaca dari input standar):
Agak tidak terserang:
Perhatikan bahwa
@A
...Z[
dalam ASCII, dan juga untuk`a
...z}
.sumber
Japt v2.0a0
-P
, 27 byteDisimpan 3 byte berkat @Shaggy
Cobalah
sumber
Pyke, 31 byte, tidak kompetitif
Pyke lebih tua dari tantangan, tetapi saya menambahkan beberapa fitur untuk membuatnya lebih kompetitif - fungsi chunk. Saya menggunakan trik yang sama seperti @Martin Büttner digunakan.
Coba di sini!
sumber
JavaScript, 148 byte
sumber
TI-BASIC,
311288 byteApa, tidak ada jawaban TI-BASIC? Saatnya bagi saya untuk memperbaikinya!
Input adalah kode oOo di
Ans
.Output adalah kode BF yang diterjemahkan .
Contoh:
Batalkan
golf : (Baris baru dan komentar ditambahkan)
Catatan:
sumber