Hasilkan program Brainf_ck yang menghasilkan string dengan panjang tertentu

11

Teman Anda mencoba masuk ke lemari besi yang memiliki sistem penguncian khusus: itu membutuhkan sejumlah ketukan lembut di tempat tertentu. Teman Anda menemukan nomornya (yang berada dalam kisaran 1 ... 99999) dan memiliki gadget yang menghasilkan ketukan yang diperlukan. Namun, gadget tersebut adalah penerjemah Brainfuck! Jadi teman Anda perlu memberinya program Brainfuck, yang, tentu saja, harus sesingkat mungkin (I / O gadget lambat).

Tugas Anda adalah membantunya! Tulis sebuah program atau subrutin, dalam bahasa apa pun, yang menerima sebagai input nomor N, dan mengeluarkan program Brainfuck, yang tidak mengambil input dan menghasilkan string karakter ASCII yang dapat dicetak (tidak termasuk karakter spasi - kode dalam kisaran 33 ... 126) panjangnya N.

Contoh: untuk input 10, output mungkin

+++++++++++++++++++++++++++++++++..........

(tapi saya yakin ini bisa dipersingkat!)

Skor Anda akan menjadi jumlah panjang output Anda untuk nilai-nilai berikut N(mereka adalah angka acak):

55
68
15
28
841
838
522
846
4898
9004
9363
3810
13230
67175
37231
44701

Oh, dan Anda akan mengirimkan kode Anda (program generator) kepada teman Anda melalui Twitter. Jadi pastikan 140 karakter atau kurang!


PS Bahasa Brainfuck memiliki banyak varian. Mari kita asumsikan rekaman itu tak terbatas di kedua arah (atau "lingkaran dan cukup besar"), dan sel-sel memiliki kapasitas int 32-bit (terbatas dan mampu menyimpan angka hingga 99999). Juga, tanpa pembungkus: ketika sebuah sel meluap, mesin itu hancur sendiri!

anatolyg
sumber
2
"mengikuti nilai-nilai N (ini adalah angka acak)" mengingatkan saya pada xkcd.com/221
cirpis
Hanya untuk referensi, karakter spasi (kode karakter 32) biasanya termasuk dalam rentang ASCII yang dapat dicetak. Itu tidak benar-benar membuat perbedaan untuk tantangan karena Anda telah menentukan rentang secara eksplisit.
Martin Ender
3
Bisakah kita menganggap sel dalam brainfuck sebagai bilangan bulat lebar yang berubah-ubah? Jika tidak, bagaimana dan kapan mereka membungkus?
orlp
1
Akan menyenangkan untuk mengasumsikan setidaknya mampu mengandung 67175 + beberapa.
orlp
@anatolyg saya menyadarinya nanti. Maaf.
Buah Esolanging

Jawaban:

3

Python 2, skor: 1021

Saya baru menyadari bahwa kontes ini sudah sangat tua tetapi masih, karena saya datang dengan solusi yang lebih baik daripada yang diposting, saya mempostingnya juga.

Berikut ini adalah skrip python 102 byte yang berfungsi:

n=input()
s='>'
while n:
    s+='>'+'+'*(n%5+1);n/=5
print s+'[->[-<+++++>]<<]<+++++++[>+++++<-]>>[-<.>]'

Idenya adalah untuk menggunakan basis 5 pengkodean untuk N (basis terbaik setidaknya untuk input saat ini, yang tampaknya tidak "acak" dengan cara, sepertinya mereka secara sewenang-wenang dipilih oleh OP), dan untuk menulis algoritma Brainfuck generik untuk decode sejumlah panjang arbitrer (nomor dikodekan dengan setiap digit bertambah satu untuk mendeteksi akhir konversi). Saya memilih untuk mencetak karakter 35 #, karakter 36 $adalah setara.

Anda dapat menjalankan skrip bash berikut untuk mendapatkan skor:

i=0
while read p; do
  i=$((i+`echo $p | python convert.py | wc -m`))
done
echo $i

Dengan program yang lebih maju yang menggantikan pengkodean dengan perkalian untuk angka kecil dan memilih basis terbaik untuk pengkodean setiap angka, saya dapat mencapai 958 karakter Brainfuck, tetapi Python terlalu bertele-tele (dan saya pegolf yang sangat buruk) untuk mendapatkan konverter menjadi 144 byte!

rixm
sumber
Ini ide yang bagus! Mungkin saya akan menggunakannya sekali untuk meningkatkan jawaban ini (menulis skrip dengan Python untuk mendapatkan skor kurang dari 950, tapi saya tidak tahu bahasa golf untuk membuatnya cukup pendek).
anatolyg
8

BrainF ***, skor: 193,313

Itu tidak di bawah 140 karakter (ini 147, sangat dekat !!), jadi ini tidak bisa menang, tapi saya pikir itu keren.

Mencetak 43 tanda plus, lalu tanda Ntitik. Tidak terlalu optimal.

>++++++[>+++++++<-]>+[->+>+<<]>[->.<]<<+[[-]>[-],[+[-----------[>[-]++++++[<------>-]<--<<[->>++++++++++<<]>>[-<<+>>]<+>]]]<]>>>+++<<<<[>>>>.<<<<-]

Kalau ada yang bisa membantu mempersingkat ini saya akan menyukainya.

mdc32
sumber
Saya kira dengan Brainfuck, itu akan cukup untuk membuat "subrutin" yang menerima inputnya di kaset - tidak perlu membaca dari "perangkat input standar".
anatolyg
@anatolyg Itu membuatnya lebih mudah - mungkin sekitar 80 atau 90 karakter. Haruskah saya mengubahnya?
mdc32
5

J, Total skor = 1481

(Untuk entri saya sebelumnya dan penjelasan periksa riwayat revisi.)

f10=.('>++++++++++<';'')rplc~;@([:(<@('+++++[>+++++++<-]>>+',;@((<'[>++++++++++')#~#)),[<@(']',~'<-','<.>'#~],[,])"0 #-i.@# )10#.inv])

Fungsi ini menghasilkan loop BF bersarang berdasarkan pada basis10 digit nomor input. Memeriksa semua basis yang masuk akal dan memilih kode BF terkecil akan meningkatkan skor dengan jumlah kecil.

Program BF untuk set tes:

   f10 every 55 68 15 28 841 838 522 846 4898 9004 9363 3810 13230 67175 37231 44701
+++++[>+++++++<-]>>+[>++++++++++[-<<.....>>]<-<.....>]                                                                                     
+++++[>+++++++<-]>>+[>++++++++++[-<<......>>]<-<........>]                                                                                 
+++++[>+++++++<-]>>+[>++++++++++[-<<.>>]<-<.....>]                                                                                         
+++++[>+++++++<-]>>+[>++++++++++[-<<..>>]<-<........>]                                                                                     
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<........>>>]<-<<....>>]<-<.>]                                                             
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<........>>>]<-<<...>>]<-<........>]                                                       
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<.....>>>]<-<<..>>]<-<..>]                                                                 
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[-<<<........>>>]<-<<....>>]<-<......>]                                                        
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<....>>>>]<-<<<........>>>]<-<<.........>>]<-<........>]                      
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<.........>>>>]<-<<<>>>]<-<<>>]<-<....>]                                      
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<.........>>>>]<-<<<...>>>]<-<<......>>]<-<...>]                              
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[-<<<<...>>>>]<-<<<........>>>]<-<<.>>]<-<>]                                       
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<.>>>>>]<-<<<<...>>>>]<-<<<..>>>]<-<<...>>]<-<>]                 
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<......>>>>>]<-<<<<.......>>>>]<-<<<.>>>]<-<<.......>>]<-<.....>]
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<...>>>>>]<-<<<<.......>>>>]<-<<<..>>>]<-<<...>>]<-<.>]          
+++++[>+++++++<-]>>+[>++++++++++[>++++++++++[>++++++++++[>++++++++++[-<<<<<....>>>>>]<-<<<<....>>>>]<-<<<.......>>>]<-<<>>]<-<.>]          

Komputasi skor pada set tes:

   +/#@> f10 each 55 68 15 28 841 838 522 846 4898 9004 9363 3810 13230 67175 37231 44701
1481
randomra
sumber
3

Pyth, 1702

Merekonstruksi angka menggunakan faktor N + x.

+holN+]++">>"*"+"Q"<<"mjk(">>"j">"m*"+"kP+Qd"<[[->[->+>+<<]>>[-<<+>>]<<<]>[-]>[-<<+>>]<<<]>"*"-"d"<<")50"++++++[>++++++<-]>>[<.>-]"
orlp
sumber
Untuk 2output ini ++. sekarang yang tidak mencetak apa pun di BF.
randomra
@randomra Tangkapan bagus, ini terjadi saat memperbarui, saya akan memperbaikinya, beri saya beberapa.
orlp
@randomra Harus diperbaiki, buat skor sedikit lebih tinggi (tentu saja).
orlp
3

CJam, 52 74 108 byte, total = 1304 1244 1210

ri5b_,1>{(_3<{\(@5*+}*\+}*W%)\{T+_2>:T5*-_0>"-+"=\z*}%\T+'+*a+W%{"[->+++++<]>"\}*">x[>x<-]<[->>.<<]"'x/'+6**

Skrip uji (lambat dalam juru bahasa online):

q~]
{
_[0:T;
5b_,1>{(_3<{\(@5*+}*\+}*W%)\{T+_2>:T5*-_0>"-+"=\z*}%\T+'+*a+W%{"[->+++++<]>"\}*">x[>x<-]<[->>.<<]"'x/'+6**
]s
_[L:RL@0\
"-+><.]"['('){+\_{)}0?@\}{@\+\_{)}0?}{R1$c+:R;}]:`"]a"{{_aa+1$4G#%{:~~1}{;0}?}g}`+a+er:~:~
];R,@=!"Error."N+*o
}%s,
jimmy23013
sumber
Saya tidak melihat bagian tentang penghancuran diri. Tapi toh itu tidak akan pernah meluap.
jimmy23013
Bagaimana cara kerjanya?
anatolyg
@anatolyg Versi pertama hanya menghasilkan angka di basis 5. Versi yang lebih baru menambahkan case khusus untuk dua digit pertama dan juga menggunakan decrement.
jimmy23013
@ user23013 Oh, maaf, belum melihat perubahan spesifikasi. (Diperbarui jawaban saya sesuai.)
randomra
2

Befunge-98, N + 41, total = 193281

&>'+\:v
v^-1,\_
' >1-:v
>v^,+'_
,'    :
>ff3++^
>2f*+v
^>/9+:,
>'>,61v
, v*6+<
^/2,:<@
v >+2+,
>'<,']^

Saya tahu itu buruk, tapi saya merasa ingin menulis Befunge hari ini. Bagian terbaik dari Befunge adalah bahwa program-programnya bahkan kurang dimengerti daripada bahasa golf yang sebenarnya, terutama ketika mereka menggunakan kembali kode: D

Menggunakan algoritme yang mirip dengan jawaban CJam Martin Büttner :

(N +'s)>+++++++++++++++++++++++++++++++++<[->.<]
PurkkaKoodari
sumber
1

CJam, 40 + N, Total: 193265

'+33*'>'+l~*"[<.>-]"

Untuk memulai ini, inilah solusi dasarnya. Ini menghasilkan kode berikut:

+++++++++++++++++++++++++++++++++>_[<.>-]

di mana _adalah Nsalinan +.

Jalankan generator di sini.

Martin Ender
sumber
1

Befunge-93 - 24 + N, total = 193009

&>">>]-<]-<++++>[++++>[+++"v
v  ,,,,,,,,,,,,,,,,,,,,,,, <
>:v
,v_@
"1
.-
"
^<

Ini menggunakan awalan +++[>++++[>++++<-]<-]>>untuk mengatur indeks rekaman pertama ke '0' dengan 24 karakter. Program Befunge sangat mendasar dan menghasilkan itu bersama dengan N '.' karakter.

obyek
sumber
Sekarang saya melihat ini, saya tidak tahu mengapa saya berpikir loop saya akan lebih baik ...
Martin Ender