Роздрукуйте "A" 1000 разів за допомогою BrainFuck


12

Який найкращий код BrainFuck (за розміром коду), щоб надрукувати "A" 1000 разів?

Мій підхід:

  • встановити "A" на p [0]
  • встановіть 255 на p [1], щоб відобразити 255 "A", 3 рази
  • встановіть 235 на p [1] для відображення 235 "A"

Це не ефективно, але я не можу знайти спосіб одночасного використання лічильників буксирування, як множення

Чи є кращий підхід, ніж множення?

Більш загальне запитання: чи існує правило робити множення на велику кількість з найменшим можливим кодом?


4
Це гарне місце для початку. Ласкаво просимо в Code Golf! :)
FryAmTheEggman

3
Я думаю, ви хочете просто використовувати вкладений цикл, але BF я не дуже добре знаю. Ви бачили поради Brainfuck ? Також, ймовірно, тут буде корисним ресурсом сторінка esolangs на константах Brainfuck .
Джонатан Аллан

4
Я думаю, ви повинні уточнити кращий код BrainFuck . Ви шукаєте найчитабельнішого, найелегантнішого, використовуючи найменшу кількість +символів або просто найвищу стислість?
Джонатан

@Jonathan Allan: Так, це мета цього питання: Як використовувати вкладений цикл. Це захоплююча мова, близька до ASM, але я не розумію деяких аспектів
Нельсон Г.

Чи можу я використовувати цей варіант на BF -> github.com/gergoerdi/brainfuck64
Shaun Bebbers

Відповіді:


17

Метод, який ви, здається, зараз використовуєте, - 39 байт:

>>+++[<-[-<.>]>-]++++[<----->-]<-[-<.>](не включаючи отримання A) ( Спробуйте в Інтернеті! )

(цикл 3 рази, кожен раз встановлюйте лічильник на 255 і друкуйте це багато разів, потім віднімайте 20, віднімайте 1 і друкуйте це багато разів)

Однак, це набагато коротше цикл 250 разів та друк 4 рази кожен раз (завдяки jimmy23013 за оптимізацію цього варіанту для мого оригінального рішення циклу-4 циклу-250 print-1):

>------[<....>-] (16 байт)

Якщо ваші клітини без обмежень (я припускаю, що вони 8-бітні, інакше ви, ймовірно, не намагалися б використовувати 255 для гольфу):

>>++++++++++[<++++++++++[<..........>-]>-] (42 байти).


схоже, це передбачає 8-бітові клітини ...
Джон Дворак

2
@JohnDvorak: У питанні згадувалося про встановлення комірок 255 як частини найефективнішого рішення, про яке могла придумати ОП. Це здається досить чіткою ознакою (ab) використання 8-бітового обгортання комірок.
randomdude999

@JohnDvorak Що сказав randomdude999, але я додав метод, використовуючи 10x10x10, на випадок, якщо клітини не обмежені.
HyperNeutrino

250 разів ....було б коротше.
jimmy23013

@ jimmy23013 ... не впевнений, як я не думав про те, що все-таки оптимізований мій 10x10x10 рішення зробити це LOL. Дякую!
HyperNeutrino

1

47 байт (без підводів)

Я просто зробив це рішення в 47 байт. Я намагався робити це іншим способом, ніж я, як правило, намагався заощадити простір, жонглюючи лічильниками між двома значеннями. Він передбачає, що A попередньо завантажується в p [4].

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

Пояснив

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

найкоротший спосіб отримати число 65 для "A" >+[+[<]>>+<+]>, і тоді ви просто додасте HyperNeutrino >------[<....>-]до кінця цього. тому повний код стає >+[+[<]>>+<+]>>------[<....>-](30 байт)


Як ти знаєш, що цей шлях найкоротший? Це, звичайно, коротше, але ви точно знаєте, що коротший ніхто не знайде?
Ad Hoc Garf Hunter


@ SriotchilismO'Zaic Так, я насправді не мав на увазі, що це найкоротший лол
Стрілець
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.