Ubah Fractran menjadi Brainfuck

18

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

  1. 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.
  2. 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.
  3. Anda harus menyatakan opsi mana yang Anda pilih.
  4. Anda dapat memilih batas pada memori dan pita BF, dan apakah itu dibungkus
  5. KODE GOLF. Juga, ukuran program BF yang dikeluarkan tidak masalah, hanya ukuran program yang melakukan konversi.
  6. 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.

PhiNotPi
sumber
Jadi pada dasarnya Anda ingin juru bahasa frran di brainfuck. Segala sesuatu yang lain cukup sepele.
captncraig
@ CMP Saya ingin program yang menampilkan versi BF dari program Fractran. Kode yang melakukan konversi ini tidak harus dalam BF. Program BF itu sendiri adalah satu tujuan.
PhiNotPi
1
Apakah ada batasan pada juru bahasa brainfuck yang kita gunakan? Haruskah kita menggunakan sel berukuran byte, atau bisakah kita menggunakan sel int? Memori terbatas? Memori yang membungkus? Membungkus sel? Adakah yang kita inginkan yang membuatnya bekerja?
captncraig
Apa pun yang Anda ingin membuatnya berhasil, tetapi harap jelaskan dalam jawaban Anda.
PhiNotPi
1
Mungkin mungkin untuk menyelesaikan ini dengan BF ...
mbomb007

Jawaban:

7

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.

import sys
I=map(eval,sys.stdin)
P='+>,'
Q=''
for i in range(1,256):
 while i:j=i;i=([i*x/y for x,y in I if i%y==0]+[0])[0]
 r=j&255;P+='-[';Q=']<[-'+'+'*r+'.'+'-'*r+']>'+Q
print P+Q

Output untuk input contoh ( ___= 246 kondisi bersarang lainnya, saya tidak dapat menempelkan seluruh hasil karena terlalu besar):

+>,-[-[-[-[-[-[-[-[___]<[-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-------------------------------------------------------------------------------------------------------------------------------------------------------------------------]>]<[-+++++++++++++.-------------]>]<[-+++++++++++++.-------------]>]<[-+.-]>]<[-+++++++++++++.-------------]>]<[-+++++++++++++.-------------]>]<[-+++++++++++++.-------------]>]<[-+.-]>
Keith Randall
sumber
1
@PhiNotPi: benar, saya mungkin perlu mendeteksi perulangan dan kasus khusus yang ...
Keith Randall
7
Sebenarnya, saya berpikir bahwa menentukan apakah program Fractran yang diberikan adalah loop tanpa akhir atau tidak sama dengan masalah penghentian. Semoga beruntung dengan itu. :)
PhiNotPi
1
Pendekatan yang menarik. Hanya kekurangan mungkin jika spec fractran mengatakan perlu menangani output lebih besar dari 255, yang saya tahu banyak program bergantung, jadi sepertinya agak aneh untuk hanya mengambil LSB dari hasilnya.
captncraig
1
@ CMP, pertanyaannya secara spesifik menyatakan bahwa input untuk opsi 1 diambil dari ascii.
Stanby
1
@PhiNotPi menentukan apakah suatu program terhenti atau tidak, ini sedikit berbeda dari kemampuan membuat program lain dalam bahasa lain sehingga ia berhenti jika dan hanya jika yang asli berhenti. Yang pertama tidak mungkin, sedangkan yang terakhir dilakukan setiap hari oleh kompiler.
Cruncher
3

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, misalnya 2^5, di kursor. Kemudian, jalankan output skrip python ini. Tunggu 44 detik. Hasilnya, 13^2duduk di mana kursor dimulai. Saya tidak menunggu jawabannya 2^7.

s="[->>>+<<<]+["
for l in raw_input().split(','):
 a,b=map(int,l.split('/'))
 s+="[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>["+"[->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]<"*(b-1)+"[->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]<"+"[->+>+<<]>[-<+>]<"*a+"[-]>>[-<<+>>]<<<<<->>>>]<<]<<"
print s+">+<[->-<]>[-<+>]<]>>>[-<<<+>>>]"

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:

[->>>+<<<]+[[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<>+<[->-<]>[-<+>]<]>>>[-<<<+>>>]
stan
sumber
Itu adalah skrip Brainfuck pertama yang bagus, +1. Anda dapat menghitung 2^7dengan penerjemah Brainfuck saya dalam waktu kurang dari 5 detik. Juga, bukankah seharusnya itu raw_input()bukan raw_input(atau itu beberapa kekhasan yang tidak saya ketahui)?
salin
@ copy, terima kasih! Anda benar, raw_input()itu perlu. Saya tidak terkejut bahwa penerjemah brainfuck yang kompeten melakukan lebih baik daripada implementasi Sage saya yang naif.
boothby
2

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.

L:{$A=<>;
if($/eq$A){last L}
($B,$C)=eval$A;
$D=$E=$F=$G=$H=2;
while($C>1){
if($C%$H==0){
$C/=$H;
$R=">"x$H;
$L="<"x$H;
$D.=$R.'[-'.$L;
$E.=$R.'-'.$L;
if($H>2){$R.="+[->+<]]>[-<+>]<"}
else{$R.="+[-<+>]]<[->+<]>"}
$G=$R.$L.$G;
$H--}$H++}
$H=2;while($B>1){
if($B%$H==0){
$B/=$H;
$F.=">"x$H.'+'.'<'x$H;
$H--}$H++}
$I="+[-$I$D$E+$F$G]";
redo L}print$I

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.

+[-+[-+[-+[-+[-+[-+[-2>>[-<<>>[-<<>>>>>[-<<<<<2>>-<<>>-<<>>>>>-<<<<<+2>>>+<<<>>>>>>>>>>>+<<<<<<<<<<<>>>>>+[->+<]]>[-<+>]<<<<<<>>+[-<+>]]<[->+<]><<>>+[-<+>]]<[->+<]><<2]2>>>>>>>>>>>[-<<<<<<<<<<<2>>>>>>>>>>>-<<<<<<<<<<<+2>>>>>+<<<<<>>>>>>>>>>>+[->+<]]>[-<+>]<<<<<<<<<<<<2]2>>[-<<>>>>>[-<<<<<2>>-<<>>>>>-<<<<<+2>>>>>>>>>>>>>+<<<<<<<<<<<<<>>>>>+[->+<]]>[-<+>]<<<<<<>>+[-<+>]]<[->+<]><<2]2>>>>>[-<<<<<2>>>>>-<<<<<+2>>>>>+[->+<]]>[-<+>]<<<<<<2]2>>>[-<<<2>>>-<<<+2>>+<<>>>+[->+<]]>[-<+>]<<<<2]2>>>>>>>[-<<<<<<<2>>>>>>>-<<<<<<<+2>>+<<>>>>>+<<<<<>>>>>>>+[->+<]]>[-<+>]<<<<<<<<2]2>>[-<<2>>-<<+2>>>>>>>+<<<<<<<>>+[-<+>]]<[->+<]><<2]
PhiNotPi
sumber
1

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.

exec"f=factor;
J=''.join;
Q=L(a,b):Lz:a*z+b*-z;M=Q('<>');
C=Lj,k:(Ll:'[-%s+%s+%s]%s[-%s+%s]%s'%tuple(map(M,[-j,-k,l,-l,l,-l,k])))(j+k);
print '>+[>>>+'+J(map(L(n,m):reduce(Lr,(p,e):'[-%s%s%s[[-]<<+>>]%s<<%s]'%(M(4-p),C(6-p,2),'[-'*(e-1),']'*(e-1),r),f(m),'[-<<<->>>%s]'%J(map(L(p,e):M(4-p)+Q('+-')(e)+M(p-4),f(n/m))))+'<<<'+C(3,2),[map(QQ,x.split('/'))for x in raw_input().split(',')]))+'<<<<+>[-<->]<[->+<]>]'".replace('L','lambda ')

Output sampel:

Diberikan input 33/20,5/11,13/10,1/5,2/3,10/7,7/2

>+[>>>+[->[->+>>+<<<]>>>[-<<<+>>>]<<[[-]<<+>>]<<[-<<[->>>>+>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>>]<<[-[[-]<<+>>]]<<[-<<<->>><<-->><+>>-<>>>>>>>+<<<<<<<]]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[->>>>>>>[-<<<<<+>>+>>>]<<<[->>>+<<<]<<[[-]<<+>>]<<[-<<<->>>>+<>>>>>>>-<<<<<<<]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[->[->+>>+<<<]>>>[-<<<+>>>]<<[[-]<<+>>]<<[-<<[->>>>+>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>>]<<[[-]<<+>>]<<[-<<<->>><<->>>-<>>>>>>>>>+<<<<<<<<<]]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[->[->+>>+<<<]>>>[-<<<+>>>]<<[[-]<<+>>]<<[-<<<->>>>-<]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[-<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[[-]<<+>>]<<[-<<<->>><<+>><->]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[->>>[-<+>>+<]>[-<+>]<<[[-]<<+>>]<<[-<<<->>><<+>>>+<>>>-<<<]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[-<<[->>>>+>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>>]<<[[-]<<+>>]<<[-<<<->>><<->>>>>+<<<]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<<<<<+>[-<->]<[->+<]>]
stan
sumber