Советы по игре в гольф> <> (Рыба)


14

Так как в последнее время я вижу больше > <> сообщений, я подумал, что было бы неплохо иметь страницу с советами.

Пожалуйста, придерживайтесь одного совета за пост, если они не связаны между собой.

Официальный переводчик Python

Онлайн переводчик (присутствуют некоторые ошибки, но в большинстве случаев это хорошо)


9
Я только что понял, глядя на страницу esolang: у создателя> <> есть имя, которое может звучать как «гарпун».
mbomb007

Как я могу напечатать новую строку в рыбе?
Капитан Мэн

@CaptainMan Вы можете выводить кодовые точки с помощью o, а поскольку новая строка \nASCII 10, вы можете сделать ao.
Sp3000

@Sp спасибо, я пытался CRвместо LFи давил dвместо a.
Капитан Мэн

Ответы:


5

Проверка по 0

Использование ?!вместо 0=?обычно сохраняет байт.

Тем не менее, просто стандарт ?может быть лучше, если вы можете позволить себе немного реструктуризации

?!vA
  B

против

?vB
 A

4

Проверка на EOF

Когда достигается EOF,> <> помещает -1 в стек, что можно проверить одним из двух способов:

:0(?
:1+?

В целях проверки EOF эти два являются отрицаниями, поэтому, какой из них более выгоден, зависит от структуры вашей программы.


3

Перейти, чтобы обойти, начиная новые линии

Начиная новую строку иногда означает тратить много пробелов на следующей строке. В такой ситуации прыжки могут быть полезны.

Например,

[lots of code here]>[loop body]v
                   ^ ......... <

может быть размещен на одной строке следующим образом:

[lots of code here][loop body][jump]

Для практического примера, вот программа Hello World в одну строку:

"!dlroW ,olleH"l?!;oe0.

3

Использование модуля для упрощения ввода

Это может быть слишком простой подсказкой, поэтому, если это так, я просто заменю или удалю ее.

Допустим, вы хотите взять ввод из двух символов, «a» и «b», и вернуть 1 и 2 для каждого соответственно. Вы, вероятно, использовали бы для этого условные выражения, поскольку это имеет смысл, и я буду использовать более сжатую форму для этого конкретного примера.

i:"a")+1+n

Это проверяет, является ли входное значение больше, чем «a», и добавляет 1. Так как «a» вернет 0 и «b» 1, это даст 1 и 2. Это делает работу довольно хорошо, но в случае нашего входы, мы могли бы пойти еще дальше.

i:3%n

В моде 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 лучше).


3

Использование прыжков в качестве условного

Иногда вам придется писать программы в> <>, которые требуют от вас делать разные вещи при получении разных входных данных. Обычно вы используете условные выражения ( ?) и программы изменения направления для этого. В некоторых случаях это работает нормально (особенно, когда обрабатывается меньше типов ввода), но иногда получается что-то похожее на это. (Не обращайте внимания на тот факт, что этот код можно уменьшить, используя некоторые другие приемы, это просто для демонстрации)

i:"a"=?v:"b"=?v"c"=?v>
  .00n1< .00n2<.00n3<

Хотя это хорошо, у него есть пробелы (которые я лично никогда не люблю видеть) и много повторений ( =?vи .00n). Вместо этого вы можете использовать прыжок и разные строки в качестве условных выражений. Вот пример:

i:"a")$"b")+1+0$.>
v1
v2
v3
<.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 является вершиной программы.


1

Написание кода, который может выполняться двумя способами

Батуты ( !) очень удобны, когда вы хотите, чтобы ваш код запускался вперед и назад (или вверх и вниз). Эти сценарии несколько маловероятны, но для палиндрома или подобных проблем этот совет может быть полезен.

Вот пример: я хочу один раз запустить некоторый код, затем перебрать в стеке, отбрасывая значения, пока я не достигну 0, а затем опуститься. Указатель входит в этот цикл из >. Вы можете использовать прыжок для достижения этой цели, например,

?!v80.>ao (допустим, я хочу сначала напечатать новую строку)

но если код, который мы хотим запустить один раз (код после >), делает строку длиннее 16 символов, мы больше не можем использовать переход в трех символах. Тем не менее, это пример, когда бегать вперед и назад тривиально ...

?!v!?<>ao>

Продвигаясь вперед, мы печатаем новую строку, а затем нажимаем, ?!vкоторая сбрасывает значение, если оно не равно 0, затем из-за батута мы пропускаем следующее ?и возвращаемся назад. То же самое происходит, и цикл продолжается, пока мы не достигнем 0.

Это странно специфический пример, но есть несколько (возможно, не так много) приложений.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.