Какие общие советы вы имеете для игры в гольф на двухмерных языках программирования? Я ищу советы, которые могут быть применены к задачам кода-гольфа и относятся к языкам 2D-программирования, но не относятся к какому-либо одному языку (ответы типа «удалить комментарии» и «использовать M
операцию» не являются ответами).
Пожалуйста, оставьте один совет за ответ.
Ответы:
Избегайте горизонтальных зазоров
Зачастую код оставляет большие пробелы в левой части программы, вот так.
Это добавляет 4 байта, когда этого можно избежать путем выравнивания по левому краю.
Если вам нужно использовать большие пробелы, попробуйте сделать их вертикальными, а не горизонтальными.
против
источник
Используйте одно измерение, когда это возможно
Как правило, более простые программы могут быть написаны в одну строку. Например, классическая программа для кошек может быть:
Но можно злоупотребить упаковочным поведением и сделать это:
Или в языках без такого поведения упаковки:
(Предполагается,
?
что не появляется.) В случае с языком без переноса, явный цикл часто лучше.С помощью команд прыжка
На двухмерных языках с командами перехода и условного перехода программа может выглядеть так:
Это также может быть:
(если
!
это батут, и&
это прыжок в положение)источник
ioiioiioi
и т.д.?io;
делать, и все, что я знаю, это то, что?
не появляется. Кажется, что это команды рыбы, но я не думаю, что они очень стандартные.Возвраты каретки тоже байты
Чем меньше 2D вы сможете сделать, тем лучше. Возврат каретки - еще один запрет. Не игнорируя подсказки из @ATaco и @ ASCII-only, постарайтесь сохранить размер Y как можно меньше.
Эта
Это лучше чем
источник
\n
(перевод строки) - это конец строки, регулярно используемый в тексте с выравниванием по левому краю в системах POSIX, хотя в Windows и Mac OS (pre-macOS) используются комбинации\n
(перевод строки) и\r
(возврат каретки).СУХОЙ (не повторяй себя)
Хотя абстракция с функциями обычно длиннее в Code Golf, это действительно может помочь для двумерных языков. Попробуйте переработать ваш код, чтобы он мог повторно использовать один и тот же фрагмент, входя / выходя из него с двумя разными ветвями выполнения.
источник
Чередовать пути
Обычно в двумерном языке есть IP, который перемещается в соответствии с командами направления. Поскольку пробелы являются потерянными байтами, почти всегда более эффективно переставить программу, чтобы она как можно чаще перемещалась влево, избавляя от необходимости ненужных пробелов.
источник
Используйте зеркала
Зеркала иногда могут использоваться в двух путях одновременно (каждый путь отражается от одной стороны зеркала). Может показаться, что это не поможет, но может позволить вам переставить программу или, если у вас много, при изменении направления их можно заменить меньшим количеством зеркал.
источник
Запомнить идиомы
Вот несколько «идиом», которые делают определенные вещи, в зависимости от характера языка.
Псевдолинейный код
Если динамическая генерация кода когда-либо требуется, может быть полезно использовать модель псевдолинейного кода:
Предполагая
\
иv
подразумевая, что они обычно делают.Бесконечная петля
Почти на всех 2D языках
><
это бесконечный, неразрывный цикл. Если по какой-то причине вам нужно это сделать, это лучший способ, несмотря на то, как это может выглядеть красиво:Фактически, если вы сделаете свой код однострочным , вы можете просто использовать
^
илиv
, как таковой:Это
v
отправит IP на себя, оборачиваясь вокруг. Вы все еще можете использовать этот подход в любом случае, когда направленная команда указывает на серию (относительных) неактивных операций.Quine Framework
Обычно языки со структурой строка / кавычка могут иметь квинтую вот так:
Для> <> это будет выглядеть так:
Кроме этого выходит с ошибкой в качестве завершения. Вероятно, это самая короткая > <> кваина , или, по крайней мере, самая короткая, которую я нашел.
источник
<
в> <> Quine?"
заканчивается в ту сторону. В противном случае совет хороший, я использовал эту общую структуру во многих своих ответах