Клетка в конце радуги

31

Мы все знаем или, по крайней мере, слышали о брейкфаке , одном из самых известных и влиятельных эзотерических языков. Хотя в настоящее время большинство реализаций используют бесконечную ленту, оригинальный компилятор Урбана Мюллера имел ленту из 30000 ячеек. Малоизвестный факт * заключается в том, что на самом деле в конце ленты есть специальное значение, с которым почти никогда не взаимодействуют в типичной программе «мозговая ебля».

Хотя вы можете напечатать это значение с 29999 >с и 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опцию, чтобы ваша программа остановилась, если она выходит за пределы.

Джо Кинг
источник
Песочница (удалено)
Джо Кинг
3
1 байт: .. Я выигрываю.
Esolanging Fruit
1
@EsolangingFruit Дайте мне заблуждения, пожалуйста ...
Джо Кинг,
1
Я предлагаю изменить правило так: «изначально все ячейки имеют значение 0, кроме последней ячейки с неизвестным значением».
user202729
4
Совет для тех, кто делает это: copy.sh/brainfuck , вероятно, является лучшим сайтом для этого, так как он реализует BF, как описано в этой задаче, и по умолчанию имеет ленту 30 КБ. Перемещение прямо за конец ленты приводит к зависанию переводчика.
Esolanging Fruit

Ответы:

17

54 байта

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

119 х 252 = 29988. Прямая вложенная петля.

Я использовал этот инструмент, чтобы убедиться, что указатель останавливается на 29999.

фонтанчик для питья
источник
12

50 байтов

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

Попробуй здесь!

Первый раздел ( >+[>+[<]>->+]>-<<) устанавливает ленту как

0*12 121' 0 110

Следующий раздел ( [>>-------[[>]+[<]>-]<<-]) повторяется 121 раз, 1каждый раз добавляя 249 с к концу ленты. Если вы быстро разберетесь с математикой, вы, возможно, поймете, что результаты 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
]
>-------[[->+<]>-]>.
Esolanging Fruit
источник
Это на самом деле не печатает значение, и если оно положительное, оно переполняется. Но большая попытка
Джо Кинг
Затем добавьте ., это поможет?
user202729
1
@JoKing Исправлено.
Esolanging Fruit