Diberikan 2 potongan kode brainfuck A
dan B
, output beberapa kode brainfuck C
yang memiliki perilaku yang sama seperti berjalan B
dengan input A
hasil s. Catatan yang C
harus bekerja untuk input apa pun yang cocok dengan asumsi berikut, seolah-olah itu diberikan kepada A
.
Anda dapat mengasumsikan:
- Input terbatas.
- A dan B berhenti.
- EOF konsisten 0 atau konsisten -1.
- Secara konsisten mengizinkan atau melarang sel ke kiri
- Pita tidak terikat (jika tidak, persyaratannya tidak mungkin)
- Pembungkus 8-bit atau bilangan bulat tanpa batas secara konsisten
- Tidak ada aliran (input atau output untuk A atau B) yang mengandung byte yang mewakili EOF
- Kode A dan B dapat berisi karakter yang mungkin muncul di C Anda, dan
+-[]<>,.
Misalnya (EOF = 0)
A = ,[..,]
B = ,[...,]
C = ,[......,]
A = >,[>,]<[.<]
B = ,[...,]
C = >>>>,[[-<+<+<+>>>]>>>,]<<<<[.<]
A = >,[>,]<[.<]
B = ,[...,]
C = >,[>,]<[...<]
A = ,.
B = ,.
C = ,>,[,]<.
A = ,.
B = ,.
C = ,.
adalah tes yang valid
Kode terpendek di setiap bahasa menang. Pemenang di Brainfuck akan diterima.
Shortest code in each language win
danShortest Brainfuck solution will be accepted
dua kriteria kemenangan yang berbeda.4.Consistently allow or disallow cells to left
. Jawaban terkemuka membutuhkan sel di sebelah kiri dalam jawaban untuk bekerja tetapi melarang A, B, dan C untuk tidak bergerak melewati byte pertama. Jawaban saya memungkinkan untuk pindah ke jawaban, A, B, dan C. Jika aturan untuk program saya dan C dapat berbeda dari A, dan B maka saya pasti dapat mempersingkat jawaban saya.>
s pada awal jawaban saya untuk membuatnya memenuhi rasa yang lebih ketat (tetapi untuk golf, kita juga harus mempertimbangkan alternatif). Juga, tampak jelas bagi saya bahwa A, B, dan C harus memiliki rasa yang sama satu sama lain.Jawaban:
brainfuck, 526 byte
Diformat:
Sehubungan dengan A, B, dan C: EOF = 0, sel-sel kiri mulai dilarang, sel pembungkus 8-bit.
Harapkan A diikuti oleh
?
diikuti oleh B.Cobalah online
(Jawaban ini dapat dibuat sesuai dengan interpreter brainfuck yang tidak memungkinkan untuk meninggalkan awal dengan biaya satu byte dengan mentransliterasi
y/<>/></
dan mengawali a>
.)Ide dasarnya adalah menggunakan serangkaian penggantian string untuk mensimulasikan rekaman A dan B menggunakan node 2-sel, dengan perhatian khusus diberikan untuk mengganti
.
dalam A dan,
B sehingga aliran data menengah disimpan dalam blok sel di sebelah kiri rekaman simulasi. Skema penggantian string adalah:Masukkan
>>
sebelum ADi A dan B, ganti
>
dengan>[-]+>
dan<
dengan<<
Di A, ganti
.
dengan>[-]-[>>]+[[>+<-]<[>+<-]<]>+[->>+]<[>>>-<<+[<<]<+>>>[>>]+<<<-]>[+<->]+</
Masukkan
>[>>]+>
setelah A dan sebelum BDi B, ganti
,
dengan,[,]>,<<[<<]<[[>]>>[>>]<+<[<<]<[<]>-]>[>]>>[>>]+<*
sumber
,[>,]<[.<]?,[...,]
input12345
kembali111
, bahkan dengan cukup>
sebelumnya?,[>,]<[.<]
tidak valid tetapi>,[>,]<[.<]
benar.)>
ke D sesuai kebutuhan.brainfuck , 1287 byte
Cobalah online!
Ini dia! Kode brainfuck yang menyusun dua kode brainfuck. Gunakan "!" untuk memisahkan dua potongan kode input. Misalnya potongan A:
>,[>,]<[.<]
, snippet B:,[...,]
. Masukan untuk program saya:>,[>,]<[.<]!,[...,]
. Itu tidak akan berakhir jika tidak ada "!" ditemukan.Ini pada dasarnya sama dengan Versi VBA saya. Kode yang dihasilkan sama dengan di versi VBA (perhatikan bahwa contoh-contoh di posting VBA dibuat sebelum perubahan terbaru dalam cuplikan brainfuck).
Penjelasan
Ini adalah kode sumber saya:
sumber
>[,>]<[.<]!,[...,]
, jadi snippet A tidak menghasilkan apa-apa. Tentu saja itu harus>,[>,]<[.<]!,[...,]
untuk contoh kerja.VBA,
512489479 bytePenjelasan
Kode VBA mengubah kode brainfuck dengan cara, sehingga output snippet A akan disimpan dalam daftar dan input snippet B akan dibaca dari daftar itu.
Pertama menginisialisasi beberapa variabel
Kemudian ia membaca snippet A dan menggantikan setiap
<
oleh<<<[+]-<<
, setiap>
oleh>>>>>>>[+]-<<
dan setiap.
oleh rutinitas penyimpanansetelah itu menghapus memori snippet A dan membuat perubahan pada daftar tersimpan, sehingga dapat dibaca sebagai input untuk snippet B:
Kemudian potongan B akan dibaca, setiap
<
akan digantikan oleh<<<<<
, setiap>
akan digantikan oleh>>>>>
dan setiap,
akan digantikan oleh rutin membaca daftar:Brainfuck kode sumber
Ini adalah sumber saya untuk bagian-bagian dari kode. Saya akan menjelaskannya secara rinci nanti.
Output untuk test case 1:
f ",[..,]",",[...,]"
Cobalah online!
Output untuk test case 2:
f ">,[>,]<[.<]",",[...,]"
Cobalah online!
Output untuk test case 3:
f ",.",",."
Cobalah online!
Kaset uji kompleks: Cuplikan A: Bangun segitiga alfabet
>+++++[<+++++>-]<+[>>[>[.>]]>++++++++++.--[<++++++++>-]<[+.<]<-]>>,>[.>]++++++++++.[<[.<]>,>[.>]<]
Cobalah online!Cuplikan B: Urutkan input dalam urutan naik
>>,[>>,]<<[[-<+<]>[>[>>]<[.[-]<[[>>+<<-]<]>>]>]<<]
Coba online!Hasil:
Cobalah online!
sumber
Brainfuck , 785 byte
Cobalah online!
Untuk memisahkan A dari BI yang dipilih
/
.Penjelasan:
Kode aktual yang menghasilkan ini hanya membaca loop dengan bendera untuk A / B dan sebuah saklar yang mengurangi masukan untuk mencari
>
,<
,/
,,
, dan.
dan sebaliknya hanya output input. Ini sebenarnya hanya sebuah transpiler di mana kode yang ditransmisikan hidup dalam struktur data sedemikian rupa sehingga tidak mengganggu data yang disimpan dari A atau satu sama lain. The/
hanya bergerak sel yang aktif ke sel yang tidak terpakai pertama. Saya awalnya membersihkannya, tetapi itu membuat program dan output lebih besar.Hasil program memiliki model memori berikut:
Itu
c
hancur.cz
selalu0
Ini menunjukkan di mana dalam data BF saya yang ditiru pointer adalah. Nilai aktif adalah -1 sedangkan semua sel yang dikunjungi akan memiliki1
. Dalam operasi sukaaprint
danbread
beberapac
mendapatkan makna khusus.Cetak kode-A melompati semua sel 1 byte untuk meninggalkan ruang untuk satu input byte lagi yang merupakan salinan dengan cadangan dalam byte berikutnya hancur untuk menyalin kembali.
B-code read mengambil input dari input. Di sini menjadi destruktif ok dan ketika Anda "membaca" byte terakhir Anda mendapatkan 0 sebagai EOF terlepas dari implementasinya.
Saya mulai sebagai kode Extended BrainFuck membuat hasil EBF. Sebagian besar debugging dilakukan pada file hasil dan kemudian memperbarui ke sumber yang membuatnya. Kemudian saya hanya menjalankan operasi independen untuk mendapatkan output BF, tapi saya perhatikan jawaban Dorian, yang panjangnya mengalahkan saya jadi saya terus bermain golf sumber EBF untuk output BF lebih kecil. Sumber aslinya cukup mudah dibaca dan sederhana dibandingkan dengan hal-hal lain yang telah saya lakukan dengannya:
sumber
[->+]
dalam program C menyebabkan kegagalan untuk input seperti->->,./,.
, dan ini bisa diperbaiki menggunakan[->>+]
(pastikan pointer dimulai pada sel dengan paritas yang diinginkan). Karena[-<+]
, saya pikir Anda dapat mengubah skema navigasi untuk mengandalkan semua output A menjadi nol?->->,.
dan B adalah,.
, apakah penerjemah pilihan Anda menghasilkan C yang sama dengan TIO, dan apakah C bekerja seperti yang diharapkan pada penerjemah Anda? Karena gagal di TIO . (Saya menulis ini sebagai tanggapan atas komentar yang sekarang dihapus.)-1
meskipun data pengguna, tetapi memang saya lakukan pada baris "pergi ke sel aktif, nol itu". Saya telah memperbarui jawaban saya dan kemudian saya menambahkan byte: -O tapi setidaknya itu berfungsi. BTW. Jika saya tidak menggunakan scan untuk-1
ketika mengambil input dalam B saya harus memindahkan byte aktif dengan salinan>[-<+]<
dan dengan demikian saya menambahkan lebih banyak karakter daripada saya simpan dengan mengganti+[-<+]-
dengan[<]
. Jika Anda tidak menyalin, Anda tidak akan dapat mengetahui apakah byte yang Anda masukkan sudah selesai dan salin semua byte.[-<+]
sebenarnya juga dalam hal menghilangkan bug (sebagai lawan menghemat byte), untuk input seperti-./,>++++++[<++++++>-]<.
, yang harus dicetak#
daripada%
. :) Tapi saya melihat beberapa peluang untuk menghemat byte juga. Semoga berhasil! Saya akan mencoba untuk mengoptimalkan solusi pita ganda tak terbatas saya, meskipun melihat apa yang Anda lakukan membuat saya berpikir mungkin pita tak terbatas benar adalah lebih golf pada akhirnya.sed, 165 byte
Untuk citarasa dengan EOF = 0, sel-sel kiri mulai tidak diizinkan, sel pembungkus 8-bit.
Mengharapkan program A di baris pertama dan B di baris kedua.
Cobalah online
Ini menggunakan node 2-sel untuk mensimulasikan kaset A dan B, dengan output A menempati sel yang berdekatan di sebelah kiri node paling kiri.
Alternatif solusi 173-byte:
Cobalah online
Awalnya desain saya didasarkan pada pita ganda tak terbatas, yang membutuhkan lebih banyak pekerjaan untuk bergerak ke kiri (memindahkan data ketika melewati sel paling kiri yang sebelumnya ditemui) dan untuk transisi dari A ke B (membersihkan data alih-alih hanya berjalan melewati sel paling kanan sebelumnya ditemui).
Terima kasih kepada Sylwester dan Dorian untuk trik dan ide.
sumber
,[..,]
dan Program B,[...,]
.s/x/>>/g
di bagian paling akhir, tetapi saya lebih tertarik pada perbaikan yang akan mempersingkat output untuk saat ini.