Клітина в кінці веселки


31

Ми всі знаємо про, або, принаймні, чули про, марево , одну з найвідоміших і найвпливовіших езотеричних мов. Хоча в наші дні більшість реалізацій використовують нескінченну стрічку, оригінальний компілятор Urban Müller мав стрічку з 30000 комірок. Маловідомий факт * полягає в тому, що насправді в кінці стрічки є особлива цінність - те, що майже ніколи не взаємодіє в типовій програмі, що займається мозком.

Хоча ви могли надрукувати це значення за допомогою 29999 >s та a ., brainfuck відомий своїми короткими та стислими рішеннями, тому ваша мета - надрукувати це значення з мінімальною кількістю символів.

* художня література

Правила:

  • Оновлення інструкцій щодо мозкових курсів:
    • +/ -: Збільшення / зменшення поточної комірки, загортання від 255 до 0, коли 255 збільшується і навпаки
    • </ >: Перемістіть курсор вліво / вправо на стрічці
    • .: Друкує значення поточної комірки.
    • [: Перейти до відповідної, ]якщо значення в комірці дорівнює 0
    • ]: Перейти до відповідної, [якщо значення в комірці не дорівнює 0
  • У цьому випадку ,(Get input) нічого не робить, оскільки оригінальний компілятор залишає комірку незмінною на EOF, і ця програма не повинна отримувати ніяких даних.
  • Стрічка спочатку заповнюється всіма 0, за винятком комірки 30000, яка містить невідоме значення
  • Покажчик починається з комірки 1 і повинен закінчуватися на комірці 30000, надрукувавши її.
  • Клітини зліва від 1 і праворуч від 30000 мають невизначену поведінку, тому рішення не повинні відвідувати ці клітини.
  • Зверніть увагу , що значення на 30000 це може бути 0, так просто зациклення , поки ви не натиснете ненульова клітина не буде працювати.
  • Ви повинні надрукувати лише значення в комірці 30000
  • Виграє найкоротше рішення!
    • Tie-breaker - це більш ефективна програма (виконується за найменші кроки) з наступним найшвидшим часом подання.

Порада: Esolanging Fruit пропонує використовувати https://copy.sh/brainfuck для тестування свого коду. Характеристики описані в цьому виклику, і ви можете вибрати abortваріант, щоб програма зупинилася, якщо вона виходить за межі.


Пісочниця (видалено)
Jo King

3
1 байт: .. Я переміг.
Esolanging Fruit

1
@EsolangingFruit Дозвольте, будь ласка, свої помилки ...
Jo King

1
Я пропоную змінити правило "спочатку всі комірки мають значення 0, за винятком останньої комірки, яка має невідоме значення".
користувач202729

4
Порада для тих, хто робить це: copy.sh/brainfuck - це, мабуть, найкращий сайт для цього, оскільки він реалізує BF, як описано в цьому виклику, і за замовчуванням має стрічку на 30 к. Переміщення праворуч від кінця стрічки змушує перекладача повісити.
Esolanging Fruit

Відповіді:


17

54 байт

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

119 x 252 = 29988. Пряма вкладена петля.

Я використовував цей інструмент, щоб перевірити, що вказівник зупиняється на 29999.


12

50 байт

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

Спробуйте тут!

Перший розділ ( >+[>+[<]>->+]>-<<) встановлює стрічку як

0*12 121' 0 110

Наступний розділ ( [>>-------[[>]+[<]>-]<<-]) повторюється 121 раз, додаючи 249 1с до кінця стрічки кожен раз. Якщо ви швидко з математикою, ви можете зрозуміти, що це 121 * 249 результати за 30129 1с, але перша ітерація має залишитись 110, і лише додає ( 110-7) 103 1с до стрічки, тобто всього 29983 1с. Фінальна стрічка виглядає так:

0*12 0' 0 0 1*29983 0 ???

І остаточне >>>[>]>.для друку значення.

Деякі інші алгоритми примітки:

  • 252 * 119 = 29988 (також 50 байт)
  • 163 * 184 = 29992 (56 байт)
  • 204 * 147 = 29988 (60 байт)
  • 153 * 196 = 29988 (56 байт)
  • 191 * 157 = 29987 (57 байт)
  • 254 * 118 = 29972 (56 байт)
    • Цей я вважаю наступним найближчим до побиття 50, оскільки зайві байти в основному просто проходять додаткову відстань. Якби я міг знайти алгоритм, який генерує 118 і рухається далі, ніж 14 комірок, це могло б перемогти його.

3

81

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

Це переміщується на 150 клітин у 200 разів.

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

Я вже не знаю, чому я працюю.

Це засмічено компенсаціями за відключення до того моменту, коли деякі з них, ймовірно, можуть скасувати. Я так багато додав і видалив різні сегменти, що більше не пам’ятаю, чому я розміщував певні речі там, де вони є (наприклад, чому перша частина ініціалізує клітинки стрічки на 199 та 151 замість 200 і 150?).

Ось моя коментована версія цієї жахливості у будь-якому випадку, сподіваючись, що я (або хтось інший) може вважати їх корисними:

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

0 0 0 199' 155

[
  n' k 0
  >[
    n k' j
    ->+[[->+<]<]>
    0' n k-1 j+1 OR
    n 0 0' j+1
    >>
  ]
  0*k n 0 0 k 0'
  <[-<<+>>]<<<-
  0*k n-1' k
]
>-------[[->+<]>-]>.

Це фактично не друкує значення, і якщо значення додатне, воно переповнює. Але велика спроба
Jo King

Потім додайте ., чи допоможе це?
користувач202729

1
@JoKing Виправлено це.
Esolanging Fruit
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.