Bilangan bulat membosankan untuk diwakili dalam Brain-Flak . Ada 8 operator:
() Evaluates to 1, but does not push anything on any stack
[] Evaluates to an indeterminate value for the purposes of this question
{} Removes the top of the stack and evaluates to it
<> Switches to or back from the alternate stack and evaluates to zero
(foo) Pushes the value of the expression foo to the stack and evaluates to it
[foo] Evaluates to the negation of foo
{foo} Evaluates the expression foo until the top of the stack is zero
<foo> Evaluates to zero but executes foo anyway
foo
dapat terdiri dari beberapa operator, dalam hal ini mereka dievaluasi dan dijumlahkan. Misalnya (()())
mendorong 2
ke tumpukan (dan mengevaluasi 2
juga).
Jelas, (()...())
mekanisme ini tidak berguna dalam Code Golf karena jumlah besar akan membutuhkan n*2+2
byte untuk diwakili. Oleh karena itu, tantangan Anda adalah menulis program atau fungsi yang akan menghasilkan sesedikit mungkin byte program Brain-Flak yang akan mendorong bilangan bulat positif yang diberikan n
ke tumpukan aktif. Program ini tidak boleh membuat asumsi tentang isi tumpukan yang ada, sehingga tidak boleh meninggalkan tumpukan dipertukarkan atau menambah atau menghapus nilai tambahan dari tumpukan.
Meskipun program atau fungsi Anda harus mampu mengembalikan program Brain-Flak yang bekerja untuk semua input dari 1 hingga 1.000.000, pemenangnya adalah program atau fungsi yang menghasilkan set terkecil dari program Brain-Flak yang sesuai untuk semua 1.061 bilangan prima antara 1.000 dan 1.000 10.000 . Anda harus mencatat ukuran total output Anda untuk 1061 input tersebut sebagai bagian dari kiriman Anda. Program atau fungsi Anda dapat menerima integer dan mengembalikan program (string) Brain-Flak dalam format I / O yang dapat diterima. Ikatan akan rusak menggunakan ukuran program atau fungsi Anda.
sumber
2n
adalah4^n catalan(n)
.(()()()...())
. Plus, jika Anda hanya menggunakan bilangan prima, itu mungkin kehilangan beberapa optimasi yang mungkin untuk komposit.[]
terdefinisi untuk tantangan ini? Saya merasa aneh menerapkan 7 dari 8 operator. Either way, tantangan keren, saya merasa terhormat seseorang akan menulis tantangan yang terinspirasi oleh bahasa saya sendiri![]
dalam jawaban mereka.Jawaban:
Python 2,
593945924458534584165839458250Ok di sini adalah solusi saya.
Fungsi yang relevan adalah
push(n)
. Untuk menyebutnya cukup panggil push pada integer yang ingin Anda wakili.Penjelasan
Optimalisasi utama yang dilakukan oleh program ini adalah multiplikasi hard-coding. Gagasan multiplikasi hardcoding cukup sederhana. Anda menekan angka lalu pop dan mendorongnya untuk membuat nilai baru. Misalnya untuk mengalikan dua, Anda dapat menggunakan kode berikut di
((n){})
mana n kode menghasilkan angka tertentu. Ini berfungsi karena keduanya(n)
dan{}
memiliki nilai n.Ide sederhana ini dapat dibuat lebih kompleks untuk jumlah yang lebih besar. Ambil contoh 5 ditemukan beberapa waktu lalu bahwa cara terbaik untuk mengalikan lima adalah
(((n)){}){}{}
. Kode ini membuat dua salinan dari n mengalikan satu dengan 4 dan menambahkan dua. Menggunakan strategi yang sama saya membuat setiap perkalian berdasarkan representasi biner angka. Saya tidak akan masuk ke rincian tentang bagaimana ini bekerja sekarang, tetapi saya melakukan ini dengan memotong yang pertama dari representasi biner dan mengganti 0 dengan){}
dan 1 dengan){}{}
. Itu kemudian memastikan bahwa n didorong jumlah waktu yang tepat dan menyeimbangkan semua tanda kurung. (Jika Anda ingin tahu bagaimana ini dilakukan, Anda dapat melihat kode saya). Jika Anda ingin tahu mengapa ini berhasil tanyakan pada saya di komentar. Saya tidak berpikir ada orang yang benar-benar membaca semua pembaruan untuk posting saya jadi saya tinggalkan penjelasannya.Ketika algoritma berusaha menemukan hardcode perkalian, ia mencoba semua faktor prima bilangan. Ia mengabaikan faktor-faktor komposit karena pada satu titik faktor-faktor komposit selalu dapat dinyatakan lebih ringkas sebagai faktor pribadinya sendiri, tidak diketahui apakah ini masih benar.
Mekanisme penghematan byte lainnya adalah pencari solusi polinomial. Ada beberapa bentuk polinomial yang mudah direpresentasikan dengan loop pengurang. Polinomial ini termasuk, tetapi tidak terbatas pada, angka poligon. Pengoptimalan ini menemukan polinomial yang sesuai dengan formulir dan membuat kode yang membuatnya.
Keluaran
tempat sampah
sumber
n
lebih besar atau lebih kecil darin+1
if n % 3 == 2:
ke ujung fungsi itu dengan satu tingkat.Brain-Flak, 64664
Cobalah secara Online!
Ini kode beranotasi saya
Penjelasan
Ini hanya mengimplementasikan dua aturan seperti sekarang:
Jika n habis dibagi dua
(n/2){}
Jika n tidak habis dibagi dua, kembali
n-1()
Itu juga hardcodes semua angka lebih kecil dari 6.
sumber
Perl,
592225915658460 karaktern()
(11322660 karakter)(n){}()
(64664 karakter)((n)){}{}
(63610 karakter)((n)()){}{}
(63484 karakter) - ini adalah perhitungan baru(n){({}[()])}{}
(60748 karakter)n[m]
(62800 karakter)(n){m({}[l])}{}
(58460 karakter) - ini adalah perhitungan baruRumus untuk perhitungan terakhir adalah
n(n/l+1)/2+mn/l
. Saya sudah mencoba beberapa perhitungan lain tetapi tidak lagi membantu untuk hasil yang diberikan. Program ini benar-benar menghasilkan semua nilai hingga 9999 tetapi kemudian mendaftar bilangan prima yang diberikan dan total panjangnya.sumber
&try($i * $i, "$numbers[$i]{({})({}[()])}{}");
, yang turun ke 58032 ketika saya juga menambahkan&try((3 * $i * $i - $i) / 2, "$numbers[$i]{({})({}[()])({})}{}");
(angka persegi / pentagonal) - itu dari siniPython,
5913658676 karakterFungsi golf nomor Brainflak:
Iterasi bilangan prima:
Keluaran:
Pastebin
Penjelasan:
Kami mempopulasikan daftar R representasi Brain-flak yang mengevaluasi bilangan bulat individual pada rentang yang lebih besar dari yang diperlukan [1, m -1] untuk mendefinisikan fungsi kami f . Representasi dibentuk dengan mengambil representasi terendah yang tidak digunakan (diindeks oleh l ) dan membentuk banyak representasi baru darinya, hanya menyimpan yang terpendek. Representasi terendah yang tidak digunakan mengasumsikan bahwa semua angka 1 hingga l telah ditetapkan sebagai representasi, dan bahwa representasi ini telah digunakan untuk menghasilkan angka baru. Jika nilai kurang dari l mendapat representasi yang lebih pendek, kita harus kembali dan mereproduksi angka mulai dari titik itu. Fungsi f menghasilkan program menyimpan nomor ke tumpukan dengan menambahkan tanda kurung.
Saya tidak tahu Brainflak ketika saya memulai ini, dan sangat menghargai jawaban Eamon Olive karena menunjukkan rumus untuk angka segitiga. Sebagian besar saya sudah menggeneralisasi penjumlahan dan tanpa henti memeriksa jumlah dan perbedaan. Menambahkan banyak kelipatan jumlah memiliki pengaruh besar.
Bagi mereka yang peduli, ini adalah kode awal yang saya gunakan untuk melihat formula mana yang layak.
Rumus Representasi:
(X){}
((X)){}{}
((((X)))){}{}{}{}
((((((X)))))){}{}{}{}{}{}
XY
X[Y]
(X){({}[Y])}{}
(X)({({}[Y])}{}){}
(X)(({({}[Y])}{})){}{}
(X)(({({}[Y])}{}){}){}
dll ...
sumber
Lua 5.3, 57522
Saya sebenarnya mulai mengerjakan ini kembali ketika pertanyaan diposting, tetapi lupa tentang hal itu sampai ulang tahun Brain-Flak.
Gagasan serupa dengan jawaban lain di mana fungsi bermanfaat yang diketahui digunakan untuk membangun angka yang lebih besar dari representasi angka sederhana yang bagus.
Satu perbedaan adalah bahwa alih-alih menyelesaikan masalah dalam jumlah yang lebih kecil, saya menyelesaikan masalah dalam jumlah dengan representasi yang lebih pendek. Saya pikir ini membuatnya lebih elegan untuk mengambil keuntungan dari angka negatif serta menangani kasus di mana angka yang lebih kecil diwakili dalam hal angka yang lebih besar.
Juga, mencoba untuk menemukan semua angka yang dapat direpresentasikan dalam ukuran tertentu daripada mencoba untuk mewakili angka tertentu sesegera mungkin sebenarnya menyederhanakan perhitungan tertentu. Alih-alih bekerja rumus secara terbalik untuk melihat apakah itu dapat diterapkan ke angka, rumus dapat bekerja ke depan dan diterapkan ke setiap angka.
Perbedaan lainnya adalah bahwa solusi yang diketahui disimpan dalam dua bagian - sebuah "awalan" (opsional) dan "akhiran" (lebih seperti infiks). Penilaian awalan diharapkan diabaikan ketika menghitung angka yang diberikan - awalan hanya berisi kode yang mengatur akhiran untuk dijalankan (umumnya dengan mendorong satu atau lebih hal ke stack). Jadi, diberi awalan dan akhiran, angka yang sesuai dapat didorong ke stack
prefix(suffix)
.Pemecahan ini pada dasarnya memecahkan masalah yang sama dengan
unpack
fungsi dalam jawaban Wheat Wizard. Alih-alih membungkus kode dengan<...>
hanya untuk membatalkan ini nanti, kode tersebut hanya ditambahkan ke awalan.Dalam beberapa kasus, awalan sebenarnya dievaluasi (terutama untuk operasi pseudo-eksponensial), sehingga penilaiannya juga disimpan. Namun, ini tidak benar-benar menyebabkan masalah besar, karena generator tidak mencoba membuat angka-angka tertentu. Tampaknya secara teoritis menyiratkan bahwa mungkin ada dua potong kode dengan panjang yang sama dan menghasilkan nomor yang sama yang tidak akan berlebihan dalam cache karena memiliki penilaian awalan yang berbeda. Saya tidak repot menghitung untuk ini, karena tampaknya tidak terlalu berarti (setidaknya dalam domain ini).
Saya membayangkan akan mudah mengurangi jumlah byte hanya dengan menambahkan lebih banyak case, tapi saya sudah cukup untuk saat ini.
Saya sudah lari ke 1000000, tetapi hanya melakukan kewarasan memeriksa hingga 100.000.
Pastebin output pada bilangan prima yang diberikan.
sumber
k_limit
dank_max_len
lakukan? Saya tidak yakin saya mengerti judulnya.k_max_len
. Itu bisa dengan mudah memeriksa bahwa ia telah menemukan semua angka yang Anda minta setelah memproses setiap panjang, tetapi itu berguna bagi saya untuk dapat mengikat panjang maks selama pengujian sehingga program akan berjalan lebih cepat. (Memproses panjang yang lebih besar bisa sangat lambat.)k_limit
Pada dasarnya adalah parameter input - itu akan menampilkan program untuk angka hingga ini - dengan asumsik_max_len
cukup besar untuk menemukannya.ruby, 60246 byte
Saya menggunakan hash. Saya menemukan golf terbaik untuk jumlah tertentu dan menggunakan yang lebih kecil untuk menemukan yang lebih besar.
Hash rekursif sangat menyenangkan!
sumber
Python, 64014 karakter
Saya tidak tahu apa-apa tentang brainflak sebelum tantangan ini dan hanya mengotak-atiknya sedikit di tryitonline, jadi mungkin ada jalan pintas yang jelas saya lewatkan. Ini adalah solusi yang cukup membosankan, hanya membagi input menjadi
x=x/2+x%2
ataux=x/3+x%3
, mana yang lebih pendek.Sebut seperti ini:
b(42)
output pada pastebin
sumber
Lua, 64664 bytes
Program mencetak total panjang program dan program untuk prime ke-203 (ada garis yang dapat Anda ubah untuk mengubah mana yang dicetak, atau batalkan komentar pada garis untuk mencetak semua program)
Saat ini satu-satunya optimasi adalah x = 2 * n + 1
Mudah-mudahan saya akan punya waktu untuk menambahkan beberapa optimasi untuk menurunkan skor.
sumber