Cetak 'A' 1000 kali dengan BrainFuck

12

Apa kode BrainFuck terbaik (dalam hal ukuran kode) untuk mencetak 'A' 1000 kali?

Pendekatan saya adalah:

  • set 'A' ke p [0]
  • atur 255 ke p [1] untuk menampilkan 255 'A', 3 kali
  • atur 235 ke p [1] untuk menampilkan 235 'A'

Ini tidak efektif tetapi saya tidak dapat menemukan cara untuk menggunakan penghitung derek secara bersamaan seperti perkalian

Apakah ada pendekatan yang lebih baik daripada multiplikasi?

Pertanyaan yang lebih umum: apakah ada aturan untuk membuat perkalian dengan jumlah besar dengan kode sekecil mungkin?

Nelson G.
sumber
4
Ini adalah tempat yang bagus untuk memulai. Selamat datang di golf Kode! :)
FryAmTheEggman
3
Saya pikir Anda hanya ingin menggunakan loop bersarang, tapi saya tidak tahu BF dengan baik. Pernahkah Anda melihat kiat Brainfuck ? Mungkin juga halaman esolang tentang konstanta Brainfuck akan menjadi sumber yang berguna di sini.
Jonathan Allan
4
Saya pikir Anda harus mengklarifikasi kode BrainFuck terbaik . Apakah Anda mencari karakter yang paling mudah dibaca, paling anggun, menggunakan jumlah +karakter paling sedikit atau singkatnya?
Jonathan Frech
@ Jonathan Allan: Ya, itulah tujuan dari pertanyaan ini: Bagaimana cara menggunakan nested loop. Ini adalah bahasa yang mengagumkan, tutup ASM, tetapi saya tidak mengerti beberapa aspek
Nelson G.
Bisakah saya menggunakan varian ini pada BF -> github.com/gergoerdi/brainfuck64
Shaun Bebbers

Jawaban:

17

Metode yang saat ini Anda gunakan adalah 39 byte:

>>+++[<-[-<.>]>-]++++[<----->-]<-[-<.>](tidak termasuk mendapatkan A) ( Coba Daring! )

(loop 3 kali, setiap kali atur penghitung ke 255 dan cetak berkali-kali, lalu kurangi 20, kurangi 1, dan cetak berkali-kali)

Namun, ini jauh lebih pendek untuk mengulang 250 kali dan mencetak 4 kali setiap kali (terima kasih kepada jimmy23013 untuk mengoptimalkan ini melalui solusi loop-4 loop-250 print-1 asli saya):

>------[<....>-] (16 byte)

Jika sel-sel Anda tidak terikat (saya berasumsi mereka 8-bit jika tidak, Anda mungkin tidak akan mencoba menggunakan 255 untuk bermain golf):

>>++++++++++[<++++++++++[<..........>-]>-] (42 byte).

HyperNeutrino
sumber
ini tampaknya mengasumsikan sel 8-bit, meskipun ...
John Dvorak
2
@ JohnDvorak: Pertanyaan menyebutkan pengaturan sel ke 255 sebagai bagian dari solusi paling efektif yang bisa dipikirkan OP. Itu tampak seperti indikasi yang cukup jelas (ab) menggunakan pembungkus sel 8-bit.
randomdude999
@ JohnDvorak Apa yang dikatakan randomdude999, tapi saya menambahkan metode menggunakan 10x10x10 jika sel-selnya tidak terikat.
HyperNeutrino
250 kali ....akan lebih pendek.
jimmy23013
@ jimmy23013 ... tidak yakin bagaimana saya tidak berpikir bahwa solusi 10x10x10 saya masih dioptimalkan untuk melakukan itu LOL. Terima kasih!
HyperNeutrino
1

47 Bytes (Tanpa Aliran Bawah)

Saya baru saja melakukan solusi ini dalam 47 byte. Saya mencoba melakukannya dengan cara yang berbeda dari biasanya saya mencoba menghemat ruang dengan menyulap penghitung antara dua nilai. Diasumsikan bahwa A dimuat ke dalam p [4].

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

Dijelaskan

Place 5 into p[0]
+++++
Loop 5 times to put p[1]=20, p[2]=25
[>++++>+++++<<-]>
Loop 20 times
[>
Move pointer to p[2] and loop 25 times.
Also move p[2] to p[3]

[
Increment p[3] from 0, effectively moving the value from p[2] to p[3]
>+
Print p[4]
>.
Decrement p[2]
<<-]
Shift over to p[3]
>
[
Decrement p[3]
->
Print p[4]
.<
Increment p[2]
<+>]
Move back to p[1] and decrement
<<-
Repeat until p[1] is 0
]
Josh Bacon
sumber
1

cara terpendek untuk mendapatkan nomor 65 untuk 'A' adalah >+[+[<]>>+<+]>, dan kemudian Anda cukup menambahkan HyperNeutrino di >------[<....>-]akhir itu. jadi kode lengkapnya menjadi >+[+[<]>>+<+]>>------[<....>-](30 byte)

Sagittarius
sumber
Bagaimana Anda tahu bahwa cara itu adalah yang terpendek? Tentu saja lebih pendek tetapi apakah Anda tahu pasti bahwa tidak ada yang akan menemukan yang lebih pendek?
Ad Hoc Garf Hunter
@ SriotchilismO'Zaic ya saya tidak bermaksud bahwa itu adalah lol terpendek
Sagitarius