Поради щодо гольфу на 2D мовах


18

Які загальні поради щодо гольфу в двомірних мовах програмування? Я шукаю поради, які можна застосувати до проблем із гольф-кодом і стосуються 2D мов програмування, але не стосуються жодної мови (відповіді на зразок "видалити коментарі" та "використовувати Mоперацію" - це не відповіді).

Будь ласка, опублікуйте одну пораду за кожну відповідь.


Чи не повинно це питання бути на Meta?
Містер Лістер

2
Там є пов'язаний з цим питання мета тут: що є розмір програми 2D? Покрита площа? Площа опуклого корпусу? Площа осі, що містить прямокутник? Все може бути кращими заходами, ніж деякі форми розміру ASCII.
MSalters

@MrLister Підказки на тему для головного сайту. Якщо ви подивитесь, ви можете бачити, що у нас є дуже багато питань під тегом порад.
Опублікувати Rock Garf Hunter

@MSalters Як і у всіх інших мов програмування, довжина вимірюється в байтах. Деякі дизайнери мови дозволяють розміщувати 2D мови різними способами, як, наприклад, шестикутник або кубікс, і це до них.
Опублікувати Rock Garf Hunter

Відповіді:


19

Уникайте горизонтальних зазорів

Часто код залишає великі прогалини пробілів у лівій частині програми, як це було.

abc
  d
  e

Це додає 4 байти, коли цього можна уникнути вирівнюванням ліворуч.

cde
b
a

Якщо вам потрібно використовувати великі прогалини пробілів, спробуйте зробити їх вертикальними, а не горизонтальними.

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

проти

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

11

Використовуйте один вимір, коли це можливо

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

>iv
^o<

Але можна зловживати тару поведінкою і зробити так:

io

Або мовами, які не мають такої поворотної поведінки:

> ?oi<

(Якщо припустити, ?що не з'являється.) У випадку мови, що не перекриває, явний цикл часто краще.

З командами стрибка

На 2D мовах із командами стрибка та умовними стрибками програма може виглядати так:

abc >de?v;
    ^hgf<

Це також може бути:

abc de?!;hgf04&

(якщо !це батут, і &стрибає на позицію)


Ваш третій приклад не робить ioiioiioiі т.д.?
ASCII лише

@ ASCII-Тільки це дійсно так. На жаль
Conor O'Brien

1
Напевно, ви повинні вказати, що роблять деякі з менш регулярних команд. Наприклад, я не знаю, що io;робити, і все, що я знаю, це те, що ?не з'являється. Здається, це рибні команди, але я не думаю, що вони дуже стандартні.
Опублікувати Rock Garf Hunter

2
У деяких двовимірних мовах без умовних команд пропускання (наприклад, Labyrinth) ви також можете часто писати циклічні однорядкові програми, умовно припиняючи програму поділом на нуль.
Мартін Ендер

10

Повернення каретки занадто байтові

Чим менше 2D ви можете зробити, тим краще. Повернення вагона - це ще одна неопераційна можливість. Не ігноруючи підказки лише від @ATaco та @ ASCII, спробуйте зберегти розмір Y якомога менше.

Це

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

краще, ніж

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

Повернення перевезення не завжди є байтами. \n(feed-feed) - це регулярний рядок, який регулярно використовується в тексті з вирівнюванням ліворуч у системах POSIX, хоча Windows та Mac OS (до macOS) використовують комбінації \n(line-feed) та \r(carriage-return).
wizzwizz4

9

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

Хоча абстрагування функцій зазвичай довше в Code Golf, воно дійсно може допомогти для 2D мов. Спробуйте переробити свій код, щоб він міг повторно використовувати той самий фрагмент, ввівши його та вийшов із двох різних гілок виконання.


8

Перемежовуйте стежки

Зазвичай у 2D мові є IP, який рухається відповідно до команд напряму. Оскільки пробіли є марними байтами, майже завжди ефективніше переставляти програму, щоб вона якомога частіше рухалася ближче до лівої сторони, економивши потребу в непотрібних пробілах.


2

Використовуйте дзеркала

Дзеркала іноді можна використовувати двома шляхами одночасно (кожна стежка відштовхується від однієї сторони дзеркала). Це може не допомогти, але це може дозволити вам переставити програму, або якщо у вас багато, якщо зміни напряму вони можуть бути замінені меншою кількістю дзеркал.


2

Запам’ятайте ідіоми

Ось кілька «ідіом», які роблять певні речі, залежно від характеру мови.

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

Якщо коли-небудь потрібне створення динамічного коду, можливо, буде корисно використовувати псевдолінійну модель коду:

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

Якщо припустити \і vозначати те, що вони зазвичай роблять.

Нескінченна петля

Майже у всіх двовимірних мовах ><- це нескінченний, нерозривний цикл. Якщо вам чомусь потрібно це зробити, це найкращий спосіб, незважаючи на те, як це добре може виглядати:

>v
^<

Насправді, якщо ви зробите свій код 1-лайнером , ви можете просто використовувати ^або v, як такий:

i?vo;

Це vвідправить IP до себе, загорнувшись. Ви все ще зможете використовувати цей підхід у будь-якому випадку, коли команда спрямованого вказує на серію (відносних) відсутніх операцій.

Quine Framework

Зазвичай мови з рамкою рядків / цитат можуть мати такі квіта:

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

Для> <> це виглядатиме так:

":1-r>o<#

За винятком цього, виходить із помилкою як припинення. Це, мабуть, найкоротший > <> квінт , або, принаймні, найкоротший, який я знайшов.


Це насправді не здається однією порадою.
Опублікувати Rock Garf Hunter

@WheatWizard Я тримав їх разом, тому що їх розбиття мало менший сенс, будучи всіма загальними ідіомами макетів програми.
Conor O'Brien

Чому у вас є <<> quine?
Jo King

@JoKing Я не особливо впевнений, хаха
Conor O'Brien

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