Tantangan
Tulis program atau fungsi yang diberi string, mengembalikan program Brainfuck yang valid yang ketika dikompilasi dan dieksekusi sebagai Brainfuck, mengembalikan string itu ..
Asumsikan semua input dikodekan sebagai ASCII.
Asumsikan program BF yang dikeluarkan akan dieksekusi dalam lingkungan dengan rekaman tak terbatas.
Asumsikan pointer dimulai pada sel 0 dengan setiap sel diinisialisasi ke nilai nol.
Setiap contoh di bawah ini merupakan satu kemungkinan output yang benar untuk input yang diberikan. Secara khusus, contoh-contoh termasuk baris baru dan ruang ekstra untuk membantu keterbacaan manusia. Solusi bebas untuk memformat kode BF yang dihasilkan dengan cara apa pun.
Rekaman itu tak terbatas dua kali lipat.
Semua sel yang disediakan oleh juru persis sel 8-bit. Overflow dan underflow membungkus dalam hal yang dapat diprediksi dan waras.
Contohnya
String ruang
Diberikan input , program / fungsi Anda dapat kembali:
+++++ +++++
+++++ +++++
+++++ +++++
++ .
Tanda seru
Diberikan input !
, program / fungsi Anda dapat kembali:
+++++ +++++
+++++ +++++
+++++ +++++
+++
.
Dua huruf
Diberikan input hi
, program / fungsi Anda dapat kembali:
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
++++
.
+
.
Ini adalah kode-golf , jadi kode dengan jumlah byte terkecil menang. Semoga berhasil.
Jawaban:
Jelly , 8 byte
Cobalah online!
Contoh dijalankan
Sebagai input
hi
, program ini mencetak(tanpa umpan garis) yang, pada gilirannya, mencetak
hi
.Bagaimana itu bekerja
sumber
.>
muncul di output?p
) lebih pendek dari yang ditambahkan ke masing-masing (;€
). Program ouput ini menggandakan sel setelah pencetakan dan sebelum beralih. Karena kami tidak pernah mengunjungi kembali sel, itu tidak mempengaruhi output.Brainfuck,
5551 byteCobalah online!
Contoh output untuk
hi
(tanpa umpan baris):Penjelasan
Ini bergerak melintasi rekaman saat menulis program. Sekitarnya
,[...,]
adalah loop input standar. Untuk setiap karakter, kami menggunakan empat sel:di mana
x
sel kita menulis input.Bagian ini menggunakan sel
a
untuk menulis21
ke dalam selb
melalui perkalian standar3
dan7
.Sekarang kita menggunakannya
21
untuk menulis42
ke dalama
dan63
kec
dengan mengalikan dengan2
dan3
masing - masing. Kemudian<+<
bergerak kembali ke selx
sambil mengubah42
menjadi43
(titik kode+
). Rekap:Sekarang loop output utama:
Yaitu, sambil mengurangi
x
kita mencetak satu+
setiap kali.Setelah selesai kami menggunakan kembali
+
sel, dengan menambahkan3
memberi.
.Akhirnya, kita pindah ke
63
, kurangi ke62
(>
) dan tampilkan juga. Iterasi berikutnya akan menggunakan sel ini sebagaix
.sumber
Brainfuck,
39333231 byteAlgoritma yang menempatkan 45 pada rekaman itu diambil dari konstanta Brainfuck Esolang .
Jawaban ini mengasumsikan bahwa interpreter program keluaran memiliki sel pembungkus dan terikat; dan itu
,
nol sel saat ini (menyiratkan bahwa program output dijalankan tanpa input). Cobalah online!Untuk solusi (lebih lama) yang berfungsi tanpa syarat, lihat jawaban saya yang lain .
Uji coba
Untuk input
Code Golf
, output berikut dihasilkan.Cobalah online!
Bagaimana itu bekerja
Kita mulai dengan meletakkan integer 45 (kode karakter
-
) ke dalam sel rekaman. Kode berikut mencapai ini.Sebelum kita memasuki loop, rekaman itu terlihat seperti ini.
Tiga sel ini - -2 , -1 , dan 0 - adalah satu-satunya yang akan kita gunakan dalam program ini.
Dalam setiap iterasi pertama dari loop, sel paling kanan adalah, kemudian sel dan sel tengah dikurangi dua kali, meninggalkan keadaan berikut.
Dalam 126 iterasi berikutnya, awal
-
mengurangi sel tengah,[>]<
melompat ke sel paling kanan, dan--<--
mengurangi tengah dan sel kanan. Akibatnya, 3 dikurangi dari sel tengah (modulo 256 ) dan 2 dikurangkan dari sel paling kanan.Karena 254 ÷ 3 (mod 256) = (254 + 256) ÷ 3 = 510 ÷ 3 = 170 dan 252 ÷ 3 = 84 , sel yang paling kanan adalah nol sebelum yang tengah, meninggalkan keadaan berikut.
Demikian pula dengan iterasi pertama loop, iterasi berikutnya sekarang mengurangi 3 dari sel tengah dan 2 dari sel paling kiri, menempatkan kepala di sel paling kiri.
Iterasi berikutnya, seperti pada iterasi 126 sebelum mereka, kurangi 3 dari sel paling kiri dan 2 dari sel paling kanan.
Karena 254 ÷ 3 (mod 256) = 170 dan 129 ÷ 2 (mod 256) tidak terdefinisi, ini dilakukan 170 kali, meninggalkan status berikut.
Sel di bawah kepala adalah nol; loop berakhir.
Sekarang kita siap untuk menghasilkan keluaran.
sumber
\0
.Brainfuck,
35 1343 byteJawaban ini tidak membuat asumsi tentang interpreter dari program output.Cobalah online!
Untuk solusi yang lebih pendek (yang hanya berfungsi dengan beberapa penerjemah), lihat jawaban saya yang lain .
Uji coba
Untuk input
Code Golf
, output berikut dihasilkan.Cobalah online!
Bagaimana itu bekerja
Kita mulai dengan meletakkan integer 43 (kode karakter
+
) di sel kedua rekaman itu. Kode berikut mencapai ini.Ini pada dasarnya melakukan pembagian modular 2 ÷ 6 (mod 256) . Karena (2 + 256) ÷ 6 = 258 ÷ 6 = 43 , hasilnya adalah 43 , sebagaimana dimaksud.
Sekarang kita siap untuk menghasilkan keluaran.
sumber
Pyth - 11 byte
Cobalah online di sini .
sumber
05AB1E,
1211 byteDijelaskan
Cobalah online
Disimpan 1 byte berkat @Adnan
sumber
'+×
bukannyaF'+}
menyimpan byte.Java, 98 byte
String
s tidak lebih darichar[]
s tidak berubah dengan banyak metode utilitas, jadi mari kita gunakan array!Tidak Disatukan:
Program mandiri yang setara yaitu 138 byte:
Bonus:
Aplikasi 207-byte ini benar-benar mengkodekan file sebagai program BF, seperti yang disebutkan dalam judul.
sumber
Vitsy,
1917 bytePerhatikan bahwa jawaban ini adalah satu dari beberapa kali yang pernah saya gunakan
I
danu
. : DCobalah online!
sumber
O , 13 byte
Penjelasan:
sumber
K6, 16 byte
Pemakaian
Penjelasan
sumber
Python 3, 43 byte
Python menempatkan sejumlah plus yang setara dengan kode ASCII dari setiap karakter, diikuti oleh
.>
untuk mencetak dan pindah ke sel berikutnya. Brainfuck bertambah hingga nilai yang benar, dicetak, dan pindah ke sel berikutnya.Output untuk
hi
(dengan baris baru untuk kejelasan):Output program itu:
sumber
Perl, 25 byte
Pemakaian
Penjelasan
Menggunakan operasi penggantian ekspresi reguler untuk mengganti setiap karakter di setiap baris yang diberikan pada input standar dengan jumlah yang
+
dihitung dari nilai ordinal karakter tersebut, kemudian menghasilkan.>
untuk dicetak dan maju ke karakter berikutnya.Menggunakan
-p
bendera perl untuk secara otomatis membaca input dan mencetak hasilnya, menambahkan 1 ekstra ke bytecount.sumber
Java, 91 byte
Alat peraga untuk dorukayhan karena telah mengalahkan saya :)
sumber
C,
726460 byteVersi tidak disatukan:
Kompilasi dan uji dengan:
gcc -o bfcat bfcatgolf.c && cat 1.txt | ./bfcat > o.txt && beef o.txt
Hasil
hi
- http://paste.ubuntu.com/17995958/quick brown fox jumps over the lazy dog
- http://paste.ubuntu.com/17996059/sumber
c
bitwise terbalikgetchar
, terutama jika Anda hanya membalikkan inversi itu lagi?c = ~getchar( )
mengevaluasi ke 0 padaEOF
.c = ~getchar( )
dan~c++
lebih pendek dari~( c = getchar( ) )
danc--
CJam, 12 byte
Mengonversi setiap karakter ke nilai ASCII-nya, dan menambah sel saat ini beberapa kali sebelum mencetaknya. Karena kami memiliki rekaman tak terbatas, kami hanya dapat bergerak ke kanan setelah memproses setiap karakter.
Cobalah online!
sumber
Lua,
676661 BytesUlangi setiap karakter dalam argumen, dan cetak garis untuk masing-masing dengan
n
+
s diikuti dengan di.>
manan
nilai karakter ini dalam Tabel ASCII.Gunakan gmatch seperti yang disarankan oleh @LeakyNun dalam komentar untuk menyimpan 1 Bytes di atas solusi gsub
Solusi lama menggunakan gsub
67 tahun
Untuk menjalankannya, cukup simpan sebagai file (
golf.lua
misalnya) dan jalankan denganlua golf.lua "hi"
. Sebabhi
, seharusnya outputsumber
attempt to index a nil value
, danf = ...
memberikan yang sama, danfunction f ... end
memberiunexpected symbol near ':'
lua file.lua "argument"
, saya akan memperbarui posting untuk memberikan instruksi....
pengenal dengan argv?...
berisi nilai-nilai dalam tabelarg
dibongkar. Yang berarti itu akan selalu sesuai denganarg[1]
kecuali Anda menggunakannya dalam pemanggilan fungsi sebagai parameter terakhir, maka itu akan menghabiskan.n=...for n:gmatch"."do print(("+"):rep(c:byte())..".>")end
untuk 48 byteJ, 28 byte
Cukup sederhana.
3&u:
mengubah karakter menjadi kode char. Sisanya hanya mengulangi'+'
jumlah itu kali, kemudian menyatu dengan.>
pada akhir setiap baris, dan;
meratakan hasilnya.Beberapa hasil
sumber
Pyke, 11 byte
Coba di sini!
sumber
Sebenarnya, 13 byte
Cobalah online!
Strategi yang digunakan di sini adalah sama dengan di banyak solusi lain - untuk setiap karakter, output yang cukup
+
untuk meningkatkan sel nol diinisialisasi ke ordinal ASCII yang tepat, output dengan.
, dan pindah ke sel berikutnya dengan>
.Penjelasan:
sumber
Mouse-2002, 27 byte
Ini bekerja secara teori dan menurut dokumentasi bahasa, tetapi implementasi referensi dari juru bahasa Mouse tampaknya memiliki bug di mana input string menambahkan a
'
, jadi untuka
output iniYang pada gilirannya menghasilkan
a'
. Itu mungkin atau mungkin tidak apa-apa, jadi di sini panjangnya 39 byte yang tidak'
pernah keluar dan dengan demikian kemungkinan lebih tidak valid.Yang memberikan output yang tepat di impl referensi. selama tidak ada
'
s :)Dijelaskan:
sumber
Faktor, 58 byte
Bekerja seperti:
Karena Factor dilengkapi dengan penerjemah Brainfuck, mudah untuk menguji.
bfcat.factor
bfcat-tests.factor
keluaran
Yay! mereka semua lulus.
sumber
Rubi,
4038 bytesumber
puts
sebagai gantinyaprint
, karena format outputnya tidak signifikan selama itu adalah brainfuck yang valid dan brainfuck tidak peduli dengan karakter lainSidef , 38 byte
Hei, panjangnya sama dengan Ruby! Hanya saja Sidef itu bukan Ruby: D
Baca beberapa karakter, lalu untuk setiap byte lakukan hal itu.
sumber
GNU Bash,
10085 byteTerima kasih @cat karena telah menyelamatkan saya 15 byte!
Postramble
bash bfcat.sh <path to file containing string>
bash bfcat.sh <(echo -n '<string>')
Tidak disatukan
Referensi dalam versi Ungolfed
Baca file byte demi byte
ord
dari char in bashmemancarkan karakter $ n kali
sumber
read -rn1
singkirkan ruang setelahnya;
, singkirkan ruang dalamdone <"$1"
untuk menghemat total 9 byteES6,
119115 bytef=s=>{a='';for(i in[...s]){b=s[c='charCodeAt'](i)-(s[c](i-1)|0);a+=(b>0?'+'.repeat(b):'-'.repeat(-b))+'.'}return a}
Disimpan 4 byte, terima kasih kepada @Leibrug
sumber
charCodeAt
beberapa var (katakanlahc
) dan gunakan seperti itu:s[c](i)
untuk mempersingkat 1 byte, dan juga menghapus beberapa karakter (saya menemukan 3: spasi sebelumnya[...s]
, ganti logika OR dengan bitwise satu, dan titik koma sebelumnyareturn
).Sesos (tidak bersaing)
Hexdump:
Cobalah online!
Assembler
sumber
Ruby, 26 byte
+1 byte untuk
p
opsi baris perintah. Misalnya, dapatkan kode brainfuck untukABC xyz
Anda jalankandan dapatkan
sumber
Haskell 50 Bytes
sumber