Какие общие советы у вас есть для игры в гольф в Бефунге? Я ищу идеи, которые могут быть применены к кодовым проблемам гольфа в целом, которые, по крайней мере, несколько специфичны для Befunge (например, «удалить комментарии» - это не ответ). Пожалуйста, оставьте один совет за ответ.
12
Ответы:
При использовании многострочного цикла старайтесь использовать как можно больше:
против
источник
Нужно удалить значение после условного (например, потому что другой путь зависит от значения, но этот не делает)? Вместо того, чтобы использовать
>$
или$<
, примите во внимание тот факт, что вы знаете истинное значение переменной и используйте_
вместо этого как для изменения направления, так и для стека pop.пример
превращается в
источник
Не забывайте, что
0
это всегда в стеке. Например, это означает, что с пустым стекомg
эквивалентно00g
иp
эквивалентно000p
.источник
Если вам нужно нажать число больше 15, используйте
'
для получения значения ASCII следующего символа:нажать 42, а не:
источник
67*
тоже работает'
инструкцию.Вместо использования
|
, требующего другой строки (часто с большим количеством лишних пробелов), попробуйте использоватьj
. Например:остановился бы, если число на вершине стека было бы отрицательным и продолжил бы в противном случае. Если вам нужно несколько символов, использование
n*j
которыхn
является количество символов , вам нужно , когда значение , передаваемоеj
является0
. Пример:который отрицал бы отрицательное число.
источник
j
инструкцию.В Befunge-93, если первое, что вы помещаете в стек, это строка, вы часто можете сойти с рук, отбросив начальную цитату. Например это:
можно упростить до этого:
Попробуйте онлайн!
Происходит то, что интерпретатор сначала пытается выполнить символы в строке без кавычек. В
!
выполняет безвредный не , иi
иH
не являются действительными инструкциями, поэтому они игнорируются (хотя в некоторых реализациях вы можете получить предупреждение).Когда
"
встречается, это считается началом строки, но поскольку закрывающей кавычки нет, она оборачивается вокруг игрового поля до тех пор, пока"
не встретится во второй раз. То, что в итоге помещается в стек, таково:Так как мы заботимся только о последних нескольких персонажах, все остальное не имеет значения. Таким образом, после кавычки мы, наконец, получаем выполнение трех
,
команд, выписывающих сообщение и@
команду, которая завершается.Обратите внимание, что это обычно не работает в Befunge-98, так как нераспознанная инструкция заставит интерпретатор отражать, а не игнорировать ее.
источник
",,,@!iH
, Обратите внимание, что Pyfunge добавляет дополнительный пробел, а FBBI - нет.В Befunge-93 часто может быть выгодно сгладить цикл в одну строку, причем часть цикла кода выполняется в обоих направлениях.
Например, рассмотрим приведенный ниже код, который выводит букву
a
восемь раз:Это может быть сведено в одну строку путем разделения последовательности цикла с помощью инструкций моста (
#
):Попробуйте онлайн!
Если вы просто смотрите на символы без пробелов, у вас может сложиться впечатление, что это больше, чем оригинал. Но как только вы примете во внимание перевод строки и дополнительный заполнитель, требуемый в двухстрочной версии, вы фактически сохраните четыре байта.
В этом конкретном случае код сжимается еще больше, отмечая, что эту последовательность
:#:
можно просто заменить на:
.Попробуйте онлайн!
Фактически, когда вы повторяете одну и ту же инструкцию с обеих сторон
#
команды, вы можете упростить ее до одной инструкции, так что это то, на что вы всегда должны обращать внимание при выравнивании цикла.Чтобы понять, как это работает, это может помочь записать последовательность циклов дважды, один раз со всеми символами, следующими за
#
удаленным (то есть, что происходит при выполнении слева направо), и один раз с символами, предшествующими#
удаленному (то есть выполнение справа налево) ).Теперь вы можете ясно видеть, как это соответствует исходной двухстрочной версии кода.
источник
Вывод по коду выхода, где это разрешенная форма вывода. Если задача просит вас напечатать один номер, вы можете сохранить байт, завершив программу с помощью
q
вместо.@
источник
q
инструкция имела другую функцию (режим очереди) или не поддерживалась.В Befunge-93 символьная команда ввода (
~
) часто может использоваться в качестве ярлыка для -1, поскольку это значение, которое она возвращает в EOF.В качестве примера приведенный ниже код выведет -1:
Попробуйте онлайн!
Это не рекомендуется в рабочем коде, поскольку при запуске в интерактивной среде программа приостанавливает работу и ожидает ввода данных пользователем. И, очевидно, если бы пользователь вводил что-то, результат больше не был бы -1.
Тем не менее, правило на PPCG гласит, что программа может предполагать пустой поток ввода , и именно так она обычно запускается на TIO .
Также обратите внимание, что вы не обязательно лишены возможности использовать этот трюк только потому, что вашей программе нужно что-то прочитать из входного потока. Вам просто нужно убедиться, что вы обрабатываете свои данные заранее, после чего все последующие использования
~
должны возвращать -1.источник
Используйте направление IP при работе с
_
или|
вместо использования дополнительного символа для!
.Реальный пример (из этого поста ):
Может быть изменено на
источник
Не забывайте, что
0k
не выполняет следующую инструкцию. Это означает, что вместо того, чтобы делать:Вы можете сохранить персонажа, выполнив
источник
k
инструкцию.Не забывайте об
k
операторе. Вместо того"!dlroW olleH",,,,,,,,,,,,@
, чтобы делать"!dlroW olleH"bk,@
. Обратите внимание , чтоk
делает операцию на ячейку , что он находится на так9k,
бы печатать не 9 раз , но 10; 9 раз сk
, и один раз с,
.источник
k
инструкцию.Выкладывая небольшие числа в стек, вы, вероятно, можете достаточно легко понять, что
45*
получит вас20
и67*
получит вас42
. Когда дело доходит до больших чисел, вам действительно нужна программа, которая может рассчитать наиболее эффективное представление для вас.Самый простой вариант для этого - онлайн-интерфейс Майка Шверера для BefunRep . Вы просто вводите число, и оно выдает эквивалентное представление Befunge. Это не всегда самый оптимальный вариант, но он достаточно близок, и он почти наверняка будет лучше, чем все, что вы можете придумать вручную.
Онлайновая система ограничена числами в диапазоне от 0 до 16777215, поэтому, если вам нужно что-то большее, вам нужно скачать отдельную утилиту BefunRep и выполнить вычисления самостоятельно.
Если вы программируете на Befunge-98, другой вариант - это Fungify . В целом он не так оптимален, как BefunRep, но для некоторых младших чисел, где шестнадцатеричные цифры и символы одинарных кавычек наиболее эффективны, иногда он может давать лучшие результаты.
источник
'
. Например, для42
:'*