Latar Belakang
Fractran adalah bahasa pemrograman lengkap Turing esoterik yang ditemukan oleh John Conway. Program Fractran terdiri dari daftar fraksi yang dipesan. Program dimulai dengan mengambil satu bilangan bulat sebagai input. Setiap iterasi program, ia mencari daftar untuk fraksi pertama sedemikian sehingga mengalikan angka dengan fraksi itu menghasilkan bilangan bulat lain. Kemudian mengulangi proses ini dengan nomor baru, mulai kembali di awal daftar. Ketika tidak ada pecahan pada daftar yang dapat dikalikan dengan nomor, program berakhir dan memberikan nomor sebagai output.
Alasan bahwa Fractran adalah Turing-complete adalah karena mensimulasikan mesin register. Faktorisasi utama bilangan menyimpan isi register, sedangkan pembagian dan penggandaan adalah cara untuk menambah dan mengurangi kondisional dari register. Saya akan merekomendasikan membaca artikel Wikipedia (ditautkan di atas).
Tantangan
Tugas Anda adalah untuk menulis program sesingkat mungkin yang dapat mengambil program Fractran yang valid dari STDIN sebagai satu-satunya masukan dan menghasilkan program BF yang valid ke STDOUT yang mensimulasikan program Fractran. Ada dua cara untuk mensimulasikan program Fractran dengan BF.
CATATAN: Jawaban Anda bukan program BF. Jawaban Anda adalah kode yang menghasilkan program BF dari setiap program Fractran yang diberikan. Tujuannya adalah untuk mendapatkan program BF menjadi setara dengan program Fractran. (secara teknis Anda bisa melakukan kompetisi di BF, tetapi itu akan sulit)
Pilihan 1
Program Anda harus menghasilkan program BF yang melakukan hal berikut:
- Mengambil tepat 1 angka dari STDIN dalam bentuk karakter ASCII yang sesuai (karena cara input BF bekerja), yang merupakan input ke program Fractran.
- Mencetak tepat 1 angka ke STDOUT dalam bentuk karakter ASCII yang sesuai, yang merupakan keluaran dari program Fractran.
Opsi ini dimaksudkan untuk mewakili input dan output yang tepat dari mesin virtual Fractran.
pilihan 2
Kode BF yang dihasilkan oleh program Anda harus melakukan hal berikut:
- Ambil input dengan memiliki faktorisasi utama dari nomor yang sudah dikodekan dalam memori (sebelum menjalankan program). Jika inputnya 28 (2 * 2 * 7), maka akan ada nilai 2 di sel kedua dan nilai 1 di sel ketujuh (penunjuk dimulai pada sel 0). Semua sel lain akan menjadi nol.
- Berikan output dengan memiliki faktorisasi utama dari output yang dikodekan dalam memori ketika program berakhir. Jika outputnya 10, maka harus ada nilai 1 di masing-masing sel 2 dan 5. Semua sel bilangan prima lainnya harus memiliki nilai nol. Konten sel lain tidak masalah.
Opsi ini mewakili model komputasi di belakang bahasa Fractran.
Aturan dan Persyaratan
- Input (atas program Anda) akan menjadi daftar fraksi di STDIN. Akan ada satu fraksi per baris dengan koma antara pembilang dan penyebut. Baris kosong mewakili akhir input. Fraksi akan selalu direduksi menjadi istilah terendah.
- Output program Anda harus berupa program BF satu jalur yang valid untuk STDOUT. Program ini harus dapat mensimulasikan program Fractran tertentu sesuai dengan salah satu dari dua opsi. Untuk setiap input, program BF yang dihasilkan harus dapat menghasilkan output yang sama dengan program Fractran.
- Anda harus menyatakan opsi mana yang Anda pilih.
- Anda dapat memilih batas pada memori dan pita BF, dan apakah itu dibungkus
- KODE GOLF. Juga, ukuran program BF yang dikeluarkan tidak masalah, hanya ukuran program yang melakukan konversi.
- Program hanya terdiri dari ASCII yang dapat dicetak
Jika saya ambigu di mana saja, jangan ragu untuk bertanya. Ini adalah tantangan yang sangat rumit untuk digambarkan.
Selain itu, silakan posting kode BF yang dihasilkan program Anda untuk input berikut, untuk memberikan cara mudah untuk memeriksa apakah program Anda berfungsi:
33,20
5,11
13,10
1,5
2,3
10,7
7,2
Program ini menghitung jumlah 1s dalam ekspansi biner suatu angka. Namun, input dan output diformat aneh (seperti semua program Fractran). Input adalah dari bentuk 2 ^ A, sedangkan output dari bentuk 13 ^ B.
sumber
Jawaban:
Python, 182 karakter
Opsi 1, sel byte standar. Hanya ada 255 kemungkinan input (0 sebagai input tidak benar-benar masuk akal), jadi saya hanya menjalankan interpreter Fractran 255 kali dalam Python dan menghasilkan tabel sederhana program Brainfuck lookup hasil pengkodean hasil.
Output untuk input contoh (
___
= 246 kondisi bersarang lainnya, saya tidak dapat menempelkan seluruh hasil karena terlalu besar):sumber
Python, 420 karakter
Ini menggunakan semacam campuran opsi 1 dan 2: Ini mengasumsikan bahwa brainfuck diimplementasikan dengan bilangan bulat besar (saya menggunakan implementasi Sage). Masukkan program fractran, misalnya
33/20,5/11,13/10,1/5,2/3,10/7,7/2
,. Kemudian, pra-muat angka, misalnya2^5
, di kursor. Kemudian, jalankan output skrip python ini. Tunggu 44 detik. Hasilnya,13^2
duduk di mana kursor dimulai. Saya tidak menunggu jawabannya2^7
.Ini skrip brainfuck pertama saya. Tentu saja bisa bermain golf lebih lanjut, tapi saya punya hal lain yang harus dilakukan sampai nanti malam.
sunting: daripada bermain golf ini lebih jauh, saya sedang mengerjakan solusi untuk opsi 2. juga, inilah output untuk program yang diminta:
sumber
2^7
dengan penerjemah Brainfuck saya dalam waktu kurang dari 5 detik. Juga, bukankah seharusnya ituraw_input()
bukanraw_input
(atau itu beberapa kekhasan yang tidak saya ketahui)?raw_input()
itu perlu. Saya tidak terkejut bahwa penerjemah brainfuck yang kompeten melakukan lebih baik daripada implementasi Sage saya yang naif.Perl, 326 karakter
Saya akan menjawab pertanyaan saya sendiri semoga untuk merangsang lebih banyak jawaban. Saya tentu saja tidak memenuhi syarat untuk menang. Ini adalah opsi 2 dengan memori dan sel yang tidak terbatas, meskipun bekerja pada sel pembungkus. Setiap fraksi dikonversi menjadi satu blok kode. Baris baru adalah untuk keterbacaan.
Berikut adalah contoh outputnya. Ini memanfaatkan fakta bahwa karakter lain diabaikan sebagai komentar. Ini juga tampaknya merupakan keluaran yang sangat singkat dibandingkan dengan entri lain, meskipun ukuran output secara teknis tidak masalah.
sumber
Sage, 431 karakter
Ini adalah solusi yang sama sekali baru. Saya menemukan beberapa cara yang lebih baik untuk melakukan sesuatu di brainfuck, dan ini dengan benar mengimplementasikan Opsi 2. Baris baru ditambahkan untuk kejelasan. Ini mungkin bisa di-golf lebih jauh, tetapi melibatkan penulisan ulang BF untuk memiliki kedalaman loop yang lebih rendah.
Output sampel:
Diberikan input
33/20,5/11,13/10,1/5,2/3,10/7,7/2
sumber