In 'A' 1000 lần với BrainFuck


11

Mã BrainFuck tốt nhất (về kích thước mã) để in 'A' 1000 lần là gì?

Cách tiếp cận của tôi là:

  • đặt 'A' thành p [0]
  • đặt 255 thành p [1] để hiển thị 255 'A', 3 lần
  • đặt 235 thành p [1] để hiển thị 235 'A'

Điều này không hiệu quả nhưng tôi không thể tìm ra cách sử dụng đồng thời kéo quầy như phép nhân

Có một cách tiếp cận tốt hơn một phép nhân?

Một câu hỏi tổng quát hơn: có quy tắc nào để nhân một số lớn với mã nhỏ nhất có thể không?


4
Đây là một nơi tốt để bắt đầu. Chào mừng bạn đến với Code golf! :)
FryAmTheEggman

3
Tôi nghĩ rằng bạn chỉ muốn sử dụng một vòng lặp lồng nhau, nhưng tôi không biết rõ về BF. Bạn đã thấy mẹo Brainfuck ? Cũng có thể trang esolang trên hằng số Brainfuck sẽ là một tài nguyên hữu ích ở đây.
Jonathan Allan

4
Tôi nghĩ bạn nên làm rõ mã BrainFuck tốt nhất . Bạn đang tìm kiếm những gì dễ đọc nhất, thanh lịch nhất, sử dụng ít +ký tự nhất hoặc đơn giản là cao nhất?
Jonathan Frech

@Jonathan Allan: Vâng, đó là mục đích của câu hỏi này: Cách sử dụng vòng lặp lồng nhau. Đó là một ngôn ngữ hấp dẫn gần ASM nhưng tôi không hiểu một số khía cạnh
Nelson G.

Tôi có thể sử dụng biến thể này trên BF -> github.com/gergoerdi/brainfuck64
Shaun Bebbers

Câu trả lời:


17

Phương thức mà bạn dường như hiện đang sử dụng là 39 byte:

>>+++[<-[-<.>]>-]++++[<----->-]<-[-<.>](không bao gồm nhận A) ( Dùng thử trực tuyến! )

(lặp 3 lần, mỗi lần đặt bộ đếm thành 255 và in nhiều lần, sau đó trừ 20, trừ 1 và in nhiều lần)

Tuy nhiên, việc lặp lại 250 lần ngắn hơn và in 4 lần mỗi lần (cảm ơn jimmy23013 vì đã tối ưu hóa điều này qua giải pháp loop-4 loop-250 print-1 ban đầu của tôi):

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

Nếu các ô của bạn không bị ràng buộc (Tôi giả sử chúng là 8 bit nếu không bạn có thể không thử sử dụng 255 để chơi gôn):

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


điều này dường như giả sử các ô 8 bit, mặc dù ...
John Dvorak

2
@JohnDvorak: Câu hỏi đề cập đến việc đặt các ô thành 255 như là một phần của giải pháp hiệu quả nhất mà OP có thể nghĩ ra. Điều đó có vẻ như là một dấu hiệu khá rõ ràng về (ab) bằng cách sử dụng gói ô 8 bit.
Randomdude999

@JohnDvorak Randomdude999 đã nói gì, nhưng tôi đã thêm một phương thức bằng cách sử dụng 10x10x10 trong trường hợp các ô không bị chặn.
HyperNeutrino

250 lần ....sẽ ngắn hơn.
jimmy23013

@ jimmy23013 ... không chắc là tôi đã không nghĩ đến việc một giải pháp 10x10x10 vẫn được tối ưu hóa để thực hiện LOL đó. cảm ơn!
HyperNeutrino

1

47 byte (không có dòng chảy)

Tôi chỉ làm giải pháp này trong 47 byte. Tôi đã thử làm nó theo một cách khác với bình thường tôi sẽ cố gắng tiết kiệm không gian bằng cách tung hứng giữa các giá trị. Nó giả định rằng A được tải sẵn vào p [4].

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

Giải thích

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
]

1

cách ngắn nhất để có được số 65 cho 'A' là >+[+[<]>>+<+]>, và sau đó bạn chỉ cần thêm HyperNeutrino >------[<....>-]vào cuối số đó. vì vậy mã đầy đủ trở thành >+[+[<]>>+<+]>>------[<....>-](30 byte)


Làm thế nào để bạn biết rằng cách đó là ngắn nhất? Nó chắc chắn là ngắn hơn nhưng bạn có biết chắc chắn rằng không ai sẽ tìm thấy một cái ngắn hơn?
Đăng Rock Garf Hunter


@ SriotchilismO'Z cổ vâng Tôi thực sự không có ý đó là lol ngắn nhất
Nhân Mã
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.