Так как в последнее время я вижу больше > <> сообщений, я подумал, что было бы неплохо иметь страницу с советами.
Пожалуйста, придерживайтесь одного совета за пост, если они не связаны между собой.
Онлайн переводчик (присутствуют некоторые ошибки, но в большинстве случаев это хорошо)
o
, а поскольку новая строка\n
ASCII 10, вы можете сделатьao
.CR
вместоLF
и давилd
вместоa
.Ответы:
Проверка по 0
Использование
?!
вместо0=?
обычно сохраняет байт.Тем не менее, просто стандарт
?
может быть лучше, если вы можете позволить себе немного реструктуризациипротив
источник
Проверка на EOF
Когда достигается EOF,> <> помещает -1 в стек, что можно проверить одним из двух способов:
В целях проверки EOF эти два являются отрицаниями, поэтому, какой из них более выгоден, зависит от структуры вашей программы.
источник
Перейти, чтобы обойти, начиная новые линии
Начиная новую строку иногда означает тратить много пробелов на следующей строке. В такой ситуации прыжки могут быть полезны.
Например,
может быть размещен на одной строке следующим образом:
Для практического примера, вот программа Hello World в одну строку:
источник
Использование модуля для упрощения ввода
Это может быть слишком простой подсказкой, поэтому, если это так, я просто заменю или удалю ее.
Допустим, вы хотите взять ввод из двух символов, «a» и «b», и вернуть 1 и 2 для каждого соответственно. Вы, вероятно, использовали бы для этого условные выражения, поскольку это имеет смысл, и я буду использовать более сжатую форму для этого конкретного примера.
Это проверяет, является ли входное значение больше, чем «a», и добавляет 1. Так как «a» вернет 0 и «b» 1, это даст 1 и 2. Это делает работу довольно хорошо, но в случае нашего входы, мы могли бы пойти еще дальше.
В моде 3 97, который является числовым эквивалентом "a", становится 1, а 98, который является "b" s, становится 2. Для двух разных чисел гарантирован мод, который дает уникальные результаты для обоих. Для более чем двух существует мод, который дает уникальные результаты, но у меня нет математического мастерства, чтобы найти самый маленький из них простым способом (например, если у вас есть набор {100,101,102,103}, мод 104 выдаст уникальные результаты для каждое значение в нем, но не очень полезно). Однако в большинстве случаев, когда ввод ограничен парой букв алфавита, вы часто можете найти мод, который работает.
Чтобы найти наименьший модуль, который дает уникальные результаты для двух чисел a и b, вы должны сделать следующее. Возьмите абсолютное значение разности a и b (
|a - b|
) и найдите наименьшее число n, которое не делит его. например, для 97 и 98,|98 - 97| = 1
и поэтому 2 будет самым маленьким модом (но для нашей тестовой программы это дает 1 для 97 и 0 для 98, поэтому мод 3 лучше).источник
Использование прыжков в качестве условного
Иногда вам придется писать программы в> <>, которые требуют от вас делать разные вещи при получении разных входных данных. Обычно вы используете условные выражения (
?
) и программы изменения направления для этого. В некоторых случаях это работает нормально (особенно, когда обрабатывается меньше типов ввода), но иногда получается что-то похожее на это. (Не обращайте внимания на тот факт, что этот код можно уменьшить, используя некоторые другие приемы, это просто для демонстрации)Хотя это хорошо, у него есть пробелы (которые я лично никогда не люблю видеть) и много повторений (
=?v
и.00n
). Вместо этого вы можете использовать прыжок и разные строки в качестве условных выражений. Вот пример:Это сбрасывает 10 байтов. Вот что происходит:
i:
Мы дублируем ввод один раз, чтобы мы могли оценить его дважды"a")$"b")+
Это может быть своего рода совет, но я проверяю, является ли ввод больше, чем символ «а», а затем, больше ли он, чем символ «b», и добавляет результат. Для «a» это даст 0, для «b» 1 и для «c» 2.1+0$.
Здесь происходит волшебство; мы берем результат этого предыдущего упрощения и добавляем 1 (давая 1 для «a», 2 для «b», 3 для «c»), затем нажимаем 0 и меняем значения. Когда мы достигнем прыжка, он переместится на строку, соответствующую значению, которое мы присвоили этим символам (например, строка 1 для «а»). NB Строка 0 является вершиной программы.источник
Написание кода, который может выполняться двумя способами
Батуты (
!
) очень удобны, когда вы хотите, чтобы ваш код запускался вперед и назад (или вверх и вниз). Эти сценарии несколько маловероятны, но для палиндрома или подобных проблем этот совет может быть полезен.Вот пример: я хочу один раз запустить некоторый код, затем перебрать в стеке, отбрасывая значения, пока я не достигну 0, а затем опуститься. Указатель входит в этот цикл из
>
. Вы можете использовать прыжок для достижения этой цели, например,?!v80.>ao
(допустим, я хочу сначала напечатать новую строку)но если код, который мы хотим запустить один раз (код после
>
), делает строку длиннее 16 символов, мы больше не можем использовать переход в трех символах. Тем не менее, это пример, когда бегать вперед и назад тривиально ...?!v!?<>ao>
Продвигаясь вперед, мы печатаем новую строку, а затем нажимаем,
?!v
которая сбрасывает значение, если оно не равно 0, затем из-за батута мы пропускаем следующее?
и возвращаемся назад. То же самое происходит, и цикл продолжается, пока мы не достигнем 0.Это странно специфический пример, но есть несколько (возможно, не так много) приложений.
источник