Советы по игре в гольф на 2D языках


18

Какие общие советы вы имеете для игры в гольф на двухмерных языках программирования? Я ищу советы, которые могут быть применены к задачам кода-гольфа и относятся к языкам 2D-программирования, но не относятся к какому-либо одному языку (ответы типа «удалить комментарии» и «использовать Mоперацию» не являются ответами).

Пожалуйста, оставьте один совет за ответ.


Разве этот вопрос не должен быть на Мете?
Мистер Листер

2
Там есть связанный с этим вопрос мета здесь: что является размер программы 2D? Крытая площадь? Площадь выпуклой оболочки? Площадь выровненной оси, содержащая прямоугольник? Все может быть лучшими показателями, чем размер ASCII.
MSalters

@MrLister Советы вопросы по теме для основного сайта. Если вы посмотрите, то увидите, что под тегом tips у нас уже есть много вопросов.
Пшеничный волшебник

@MSalters Как и любая другая длина языка программирования, измеряется в байтах. Некоторые языковые дизайнеры позволяют размещать двумерные языки по-разному, например, в Hexagony или Cubix, и все.
Пшеничный волшебник

Ответы:


19

Избегайте горизонтальных зазоров

Зачастую код оставляет большие пробелы в левой части программы, вот так.

abc
  d
  e

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

cde
b
a

Если вам нужно использовать большие пробелы, попробуйте сделать их вертикальными, а не горизонтальными.

########
#      #
#      #
#      #

против

####
#
#
#
#
#
#
####

11

Используйте одно измерение, когда это возможно

Как правило, более простые программы могут быть написаны в одну строку. Например, классическая программа для кошек может быть:

>iv
^o<

Но можно злоупотребить упаковочным поведением и сделать это:

io

Или в языках без такого поведения упаковки:

> ?oi<

(Предполагается, ?что не появляется.) В случае с языком без переноса, явный цикл часто лучше.

С помощью команд прыжка

На двухмерных языках с командами перехода и условного перехода программа может выглядеть так:

abc >de?v;
    ^hgf<

Это также может быть:

abc de?!;hgf04&

(если !это батут, и &это прыжок в положение)


Твой третий пример не делает ioiioiioiи т.д.?
Только для ASCII

@ ASCII-only Действительно, это так. К сожалению.
Конор О'Брайен

1
Вы, вероятно, должны указать, что делают некоторые из менее регулярных команд. Например, я не знаю, что io;делать, и все, что я знаю, это то, что ?не появляется. Кажется, что это команды рыбы, но я не думаю, что они очень стандартные.
Пшеничный волшебник

2
В некоторых 2D-языках без команд условного пропуска (например, Лабиринт) вы также можете часто писать циклические однострочные программы, условно завершая программу с делением на ноль.
Мартин Эндер

10

Возвраты каретки тоже байты

Чем меньше 2D вы сможете сделать, тем лучше. Возврат каретки - еще один запрет. Не игнорируя подсказки из @ATaco и @ ASCII-only, постарайтесь сохранить размер Y как можно меньше.

Эта

###
####
########

Это лучше чем

###
###
###
##
#
#
#
#

Возвраты каретки не всегда байты. \n(перевод строки) - это конец строки, регулярно используемый в тексте с выравниванием по левому краю в системах POSIX, хотя в Windows и Mac OS (pre-macOS) используются комбинации \n(перевод строки) и \r(возврат каретки).
wizzwizz4

9

СУХОЙ (не повторяй себя)

Хотя абстракция с функциями обычно длиннее в Code Golf, это действительно может помочь для двумерных языков. Попробуйте переработать ваш код, чтобы он мог повторно использовать один и тот же фрагмент, входя / выходя из него с двумя разными ветвями выполнения.


8

Чередовать пути

Обычно в двумерном языке есть IP, который перемещается в соответствии с командами направления. Поскольку пробелы являются потерянными байтами, почти всегда более эффективно переставить программу, чтобы она как можно чаще перемещалась влево, избавляя от необходимости ненужных пробелов.


2

Используйте зеркала

Зеркала иногда могут использоваться в двух путях одновременно (каждый путь отражается от одной стороны зеркала). Может показаться, что это не поможет, но может позволить вам переставить программу или, если у вас много, при изменении направления их можно заменить меньшим количеством зеркал.


2

Запомнить идиомы

Вот несколько «идиом», которые делают определенные вещи, в зависимости от характера языка.

Псевдолинейный код

Если динамическая генерация кода когда-либо требуется, может быть полезно использовать модель псевдолинейного кода:

v
\"line 1"
\"line 2"
.
.
\"line N"

Предполагая \и vподразумевая, что они обычно делают.

Бесконечная петля

Почти на всех 2D языках ><это бесконечный, неразрывный цикл. Если по какой-то причине вам нужно это сделать, это лучший способ, несмотря на то, как это может выглядеть красиво:

>v
^<

Фактически, если вы сделаете свой код однострочным , вы можете просто использовать ^или v, как таковой:

i?vo;

Это vотправит IP на себя, оборачиваясь вокруг. Вы все еще можете использовать этот подход в любом случае, когда направленная команда указывает на серию (относительных) неактивных операций.

Quine Framework

Обычно языки со структурой строка / кавычка могут иметь квинтую вот так:

<quote><generate "><output stack><terminate>

Для> <> это будет выглядеть так:

":1-r>o<#

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


Это не похоже ни на один совет.
Пшеничный волшебник

@WheatWizard Я держал их вместе, потому что разделение их не имело для меня никакого смысла, так как все они были идиомы макета программы.
Конор О'Брайен

Почему у вас есть <в> <> Quine?
Джо Кинг,

@ JoKing Я не особенно уверен, лол
Конор О'Брайен

Кроме того, "заканчивается в ту сторону. В противном случае совет хороший, я использовал эту общую структуру во многих своих ответах
Джо Кинг,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.