Поради щодо гольфу на 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.