Salah satu kode termudah yang ditulis oleh bahasa pemrograman adalah urutan pencetakan karakter program (mis. "Halo, dunia!"). Namun, s o m e e s o t e r i c bahasa pemrograman seperti Brainfuck , bahkan kode sederhana ini cukup menjengkelkan untuk menulis.
Tugas Anda adalah menulis sebuah program (tidak harus ditulis dalam brainfuck), yang mencetak program Brainfuck (panjang minimum) yang mencetak teks yang diberikan.
Memasukkan
Urutan karakter (antara 1
dan 255
) diberikan oleh format apa pun (variabel, argumen, stdin, file, ...).
Keluaran
Output adalah valid (tidak ada yang tidak cocok [
dan]
kode brainfuck yang ) (asumsikan sel pembungkus 8-bit yang tidak ditandatangani dan jumlah sel yang tidak terbatas ke kiri dan kanan) mencetak string yang diberikan sebagai input.
Sebagai contoh, satu kemungkinan output untuk input A
adalah ++++++++[<++++++++>-]<+.
.
Program Anda seharusnya tidak membutuhkan waktu lama ( >2m
) untuk dijalankan.
Program BF seharusnya tidak memakan waktu lama ( >10s
) untuk dijalankan.
Mencetak gol
(Perhatikan: metode penilaian saat ini dapat berubah, karena tidak mudah untuk menghitung ...)
Panjang program (menghasilkan kode BF) itu sendiri tidak masalah. Namun, kode BF hard-coding dalam kode program tidak OK. Hanya rentang yang dapat diterima (mis. Kode BF yang mencetak satu karakter 0x01
:+.
) Kode BF mungkin sulit-kode.
Skornya adalah jumlah panjang kode BF yang mencetak string ini.
- Sebuah string
Hello, world!
ditambahkan dengan satu0x0A
(\n
) (yaitu program "Halo, dunia!") - Karakter tunggal dari
0x01
~0xFF
- Jumlah panjang dari 255 kode BF ini dikalikan dengan
1/16
, dibulatkan, dan ditambahkan ke skor.
- Jumlah panjang dari 255 kode BF ini dikalikan dengan
- Daftar 16 string pertama, yang dihasilkan dengan memisahkan urutan acak byte yang dihasilkan pada 11-11-11
0x00
, dengan menghapus semua string panjang nol. - Lenna.png , hapus semua
0x00
s. - Lirik lagu 99 botol bir , dimulai dengan
99 bottles~
, baris baru0x0A
, paragraf dipisahkan oleh dua0x0A
s, dan tidak ada karakter baris baru di akhir. - String lain yang mungkin Anda berikan.
Program Anda mungkin termasuk menghitung skornya sendiri.
Tentu saja, kode skor terendah akan menjadi pemenang.
Lenna.png
akan mendominasi skor, karena sejauh ini merupakan input terbesar. Mungkin menormalkan sedikit berdasarkan ukuran?Jawaban:
Di Jawa, menghitung cuplikan BF pendek yang dapat mengonversi angka apa pun menjadi angka lain. Setiap byte keluaran dihasilkan dengan mengubah byte keluaran terakhir atau 0 baru pada pita.
Cuplikan dihasilkan dalam tiga cara. Pertama dengan pengulangan sederhana dari
+
dan-
(mis.++++
Mengkonversi 7 ke 11), dengan menggabungkan cuplikan yang diketahui (mis. Jika A mengkonversi 5 ke 50 dan B mengkonversi 50 ke 37, lalu AB mengkonversi 5 ke 37) dan perkalian sederhana (mis.[--->+++++<]
Mengalikan angka saat ini dengan 5/3). Perkalian sederhana mengambil keuntungan dari sampul untuk menghasilkan hasil yang tidak biasa (mis--[------->++<]>
menghasilkan 36 dari 0, di mana loop dieksekusi 146 kali, dengan total 4 turun dan 1 sampul naik).Saya terlalu malas untuk menghitung skor saya, tetapi menggunakan sekitar 12,3 operasi BF per byte
Lenna.png
.sumber
Nah ini tentang solusi terburuk yang mungkin, meskipun yang terlihat bagus di Brainfuck sendiri:
Skor mungkin adalah yang terburuk yang akan kita lihat tanpa sengaja membuatnya buruk.
Bekerja menghitung skor aktual.
sumber
+
dan a.
[-]
untuk membersihkan sel antara masing-masing karakter.Python 3.x
Yah, saya tidak akan memenangkan hadiah untuk kode output terpendek tapi mungkin bagi program untuk menghasilkan kode ...
'Halo, Dunia! \ N':
sumber
print("".join(["+"*ord(i)+".[-]"for i in input()]))
.[-]
dengan.>
Saya tidak yakin seberapa bagus itu, tapi saya senang menulis ini. (Dalam Clojure ...)
Mungkin ada solusi yang lebih efisien, dan lebih elegan, tetapi ini mengikuti pola pikir saya agak linier, jadi itu yang paling mudah.
sumber
Skor:
478748641439404086426 (tanpa data yang dihasilkan secara acak)(4085.639 di antaranya dari Lenna.png. Itu 99,98%)
Saya tidak mendapatkan bagian dengan data acak. Apakah saya tidak memerlukan akun yang harus saya bayar untuk mendapatkan data?
Sangat naif. Berikut kode yang dihasilkan untuk "1Aa" (49, 65, 97) dengan sedikit dokumentasi:
Kode Java agak jelek tapi berfungsi. Instruksi yang dihasilkan per rasio byte input mungkin lebih baik semakin tinggi nilai byte rata-rata.
Jika Anda ingin menjalankannya, Anda harus meletakkan Lenna.png di direktori yang sama dengan file .class. Ini mencetak skor untuk menghibur dan menulis kode BF yang dihasilkan ke dalam file yang disebut "output.txt".
Saya akan membuat beberapa perbaikan kecil tapi mungkin tidak banyak.Selesaisumber
BrainF ** k
Saya seorang programmer BF yang sangat buruk, jadi jawaban ini mungkin sangat tidak efisien. Saya tidak yakin dengan skornya, tetapi seharusnya berkinerja lebih baik daripada jawaban yang ada pada teks rata-rata Anda. Daripada memusatkan sel setelah setiap karakter, yang satu ini akan "menyesuaikan" ke karakter baru dengan pengurangan jika karakter sebelumnya yang diberikan lebih besar.
(Catatan, ini adalah kode yang saya tulis sejak lama, dan telah digunakan kembali untuk kompetisi ini. Saya sungguh berharap saya telah melakukan konversi dengan benar, tetapi jika gagal untuk masukan apa pun, beri tahu saya.)
Versi yang menunjukkan status rekaman di seluruh kode:
Kode yang dihasilkan untuk
Hello, World!
:Ini adalah jawaban pertama saya di CG.SE! Jika saya mengacaukan sesuatu, beri tahu saya!
sumber
> <>
Saya menulis ini sebagai jawaban atas pertanyaan yang ditandai untuk duplikat, dan meskipun ini bukan golf terbesar (untuk pertanyaan spesifik ini, setidaknya) saya pikir itu akan menjadi sia-sia jika saya tidak membagikannya semua kemuliaan omong kosong-y menjijikkan. Sungguh, aku setengah terkejut bahkan berhasil. Saya akan mengambil saran untuk menurunkannya karena itu adalah tujuan utama saya dalam penciptaannya.
Sebagai catatan, pada baris kedua, tiga karakter awal
.21
dapat diganti denganv
diikuti oleh dua spasi jika itu membuatnya lebih mudah dibaca. Saya tidak suka melihat spasi di>> program saya karena itu berarti ada ruang yang terbuang (secara harfiah). Ini juga merupakan sisa dari salah satu dari banyak prototipe.Cara kerjanya sangat sederhana, dan terus terang saya akan kesulitan memikirkan cara untuk mengimplementasikan algoritma lain. Namun mencetak banyak "+" yang perlu dicetak untuk karakter pertama, dan kemudian mencetak lebih banyak "+" atau "-" seperti yang diperlukan untuk setiap karakter tambahan, memisahkan setiap bagian dengan periode. Apa yang saya temukan keren tentang program ini adalah ia memodifikasi kode sumbernya sendiri sehingga ia mencetak "+" atau "-" (itu menggantikan "+" pada baris 3 dengan karakter yang sesuai setelah menentukan apakah karakter saat ini lebih besar dari atau kurang dari yang sebelumnya).
Output untuk
Hello, World!
:Saya mungkin skor ini seperti yang dimaksudkan untuk dinilai, tapi saya hampir yakin saya akan kalah dan saya tidak sepenuhnya tahu cara membaca sesuatu seperti lenna.png di> <>.
Jika jawaban ini menarik bagi Anda dan Anda ingin penjelasan, tentu saja tanyakan, tetapi untuk sekarang saya akan membiarkannya tanpa satu hanya karena betapa berbelit-belit dan berbelit-belitnya.
EDIT 1: Sudah lama tapi saya bisa bermain golf 2 byte dengan perombakan yang hampir lengkap dari cara program memutuskan apakah akan mencetak plus atau minus. Ini adalah pengembalian yang agak mengecewakan untuk perbaikan besar tapi setidaknya berhasil.
sumber
solusi JavaScript saya cepat dan kotor :)
output untuk
Hello World\n
Sumber:
sumber
Saya membangun sesuatu di Jawa. Tidak menghitung skor. Teks dengan 3 karakter atau kurang dikodekan dengan perkalian per huruf mis. "A" =
++++++++[>++++++++<-]>+.
. Teks dengan lebih dari 3 karakter dikodekan dengan daftar terhitung yang dibagi menjadi 3 area. Area pertama adalah x kali 49, lalu tambah x kali 7 dan akhirnya ditambah x. Misalnya "A" adalah 1 * 49 + 2 * 7 + 2String yang disediakan "### INSERT TEXT HERE ###" menjadi
--->-->-->-->-->->->->->->->-->->->->->-->->->->->-->-->-->-->+[-[>+++++++<-]<+++]>---->++>++>++>+>>+>+>->+>++>+>++>->++>++>+>>->+>->+>++>++>++>+[-[>+++++++<-]<++++]>---->--->--->--->+>>-->+++>+++>++>--->+>--->+++>+>--->+>->+++>++>+++>+>--->--->--->+[-<++++]>[.>]
"Halo Dunia!" menjadi
--->->>>>>-->-->->>>>>-->+[-[>+++++++<-]<+++]>---->>--->-->-->-->+++>+>++>-->->-->--->+>+[-[>+++++++<-]<++++]>---->->>>>+++>->+>>+++>->>->++>+[-<++++]>[.>]
sumber
Python 3
Ini pada dasarnya hanya versi yang sedikit lebih baik dari jawaban icedvariables. (-1 Byte dari Wheat Wizard, -5 dari FatalError, -2 dari jez)
sumber
:
. Ini mungkin juga bisa dilakukan sebagai daftar pemahaman untuk menyimpan byte.print("".join(["+"*ord(i)+".[-]"for i in input()]))
join()
ekspresi generator daripada pemahaman daftar:print("".join("+"*ord(i)+".[-]"for i in input()))
print("".join("+"*ord(i)+".>"for i in input()))
(ini juga mengurangi skor karena Anda kehilangan 2 byte dalam output)