Wskazówki do gry w golfa w językach 2D

18

Jakie masz ogólne wskazówki na temat gry w golfa w dwuwymiarowych językach programowania? Szukam wskazówek, które można zastosować do problemów z golfem i są specyficzne dla języków programowania 2D, ale nie są specyficzne dla jednego języka (odpowiedzi typu „usuń komentarze” i „użyj Moperacji” nie są odpowiedziami).

Proszę zamieścić jedną wskazówkę na odpowiedź.

Post Rock Garf Hunter
źródło
Czy to pytanie nie powinno dotyczyć Meta?
Pan Lister
2
Pojawia się powiązane meta pytanie: jaki jest rozmiar programu 2D? Objęty obszar? Obszar wypukłego kadłuba? Obszar wyrównanego do osi prostokąta? Wszystko może być lepszym miernikiem niż jakaś forma rozmiaru ASCII.
MSalters
@MrLister Wskazówki Pytania dotyczą tematu na głównej stronie. Jeśli spojrzysz, zobaczysz, że pod tagiem tips mamy już sporo pytań.
Post Rock Garf Hunter
@MSalters Podobnie jak w każdym innym języku programowania długość jest mierzona w bajtach. Niektórzy projektanci języków pozwalają na rozmieszczanie języków 2D na różne sposoby, na przykład Hexagony lub Cubix, i to zależy od nich.
Post Rock Garf Hunter

Odpowiedzi:

19

Unikaj poziomych luk

Często kod pozostawia duże odstępy po lewej stronie programu, w ten sposób.

abc
  d
  e

Dodaje to 4 bajty, kiedy można tego uniknąć, wyrównując do lewej.

cde
b
a

Jeśli chcesz użyć dużych odstępów między spacjami, spróbuj ustawić je pionowo, a nie poziomo.

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

vs

####
#
#
#
#
#
#
####
ATaco
źródło
11

Jeśli to możliwe, użyj jednego wymiaru

Zwykle prostsze programy można pisać w jednym wierszu. Na przykład klasyczny program dla kotów może być:

>iv
^o<

Ale można nadużyć zachowania owijania i zrobić to:

io

Lub w językach bez takiego zachowania opakowywania:

> ?oi<

(Zakładając, ?że nie wyskakuje.) W przypadku języka bez opakowania, wyraźna pętla jest często lepsza.

Z poleceniami skoku

W językach 2D z poleceniami skoku i skoku warunkowego program może wyglądać następująco:

abc >de?v;
    ^hgf<

Może to być również:

abc de?!;hgf04&

(jeśli !jest trampoliną i &skacze na pozycję)

Conor O'Brien
źródło
Czy twój trzeci przykład nie działa ioiioiioiitp.?
Tylko ASCII,
@ Tylko ASCII Rzeczywiście tak. Ups
Conor O'Brien
1
Prawdopodobnie powinieneś powiedzieć, co robią niektóre z mniej regularnych poleceń. Na przykład nie wiem, co io;robić, i wszystko, co wiem, to to, że ?nie wyskakuje. Wygląda na to, że są to polecenia ryb, ale nie sądzę, aby były bardzo standardowe.
Post Rock Garf Hunter
2
W niektórych językach 2D bez warunkowych poleceń pomijania (takich jak Labirynt) często można także pisać programy z jedną pętlą, warunkowo kończąc program z dzieleniem przez zero.
Martin Ender
10

Zwroty karetki są zbyt duże

Im mniej 2D, tym lepiej. Zwrot karetki to kolejny brak możliwości. Nie ignorując wskazówek tylko od @ATaco i @ ASCII, staraj się, aby wymiar Y był jak najmniejszy.

To

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

jest lepszy niż

###
###
###
##
#
#
#
#
MickyT
źródło
Zwroty karetki nie zawsze są bajtami. \n(line-feed) jest końcem linii regularnie używanym w tekście wyrównanym do lewej strony w systemach POSIX, chociaż Windows i Mac OS (pre-macOS) używają kombinacji \n(line-feed) i \r(return-return).
wizzwizz4
9

SUCHO (nie powtarzaj się)

Podczas gdy abstrakcja za pomocą funkcji jest zwykle dłuższa w Code Golf, może naprawdę pomóc w językach 2D. Spróbuj przerobić kod, aby mógł ponownie użyć tego samego fragmentu kodu, wprowadzając go / wychodząc z dwoma różnymi gałęziami wykonania.

Cyoce
źródło
8

Ścieżki przeplotu

Zwykle w języku 2D istnieje adres IP, który porusza się zgodnie z poleceniami kierunku. Ponieważ spacje są marnowane na bajty, prawie zawsze bardziej wydajne jest przestawianie programu, aby jak najczęściej przesuwa się w lewo, oszczędzając zbędnych spacji.

Tylko ASCII
źródło
2

Użyj luster

Lustra mogą czasem być używane jednocześnie na dwóch ścieżkach (każda ścieżka odbija się od jednej strony lustra). To może nie wydawać się pomocne, ale może pozwolić ci zmienić układ programu lub jeśli masz dużo, jeśli zmiany kierunku mogą być zastąpione mniejszą liczbą kopii lustrzanych.

Tylko ASCII
źródło
2

Zapamiętaj idiomy

Oto kilka „idiomów”, które robią pewne rzeczy, w zależności od charakteru języka.

Kod pseudoliniowy

Jeśli kiedykolwiek wymagane jest dynamiczne generowanie kodu, może być przydatne użycie pseudoliniowego modelu kodu:

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

Zakładając \i mając na vmyśli to, co zwykle robią.

Nieskończona pętla

W prawie wszystkich językach 2D ><jest nieskończoną, niezniszczalną pętlą. Jeśli z jakiegoś powodu musisz to zrobić, jest to najlepszy sposób, pomimo tego, jak fajnie może to wyglądać:

>v
^<

W rzeczywistości, jeśli uczynisz swój kod 1-liniowym , możesz po prostu użyć ^lub vjako takiego:

i?vo;

Spowoduje vto wysłanie adresu IP do siebie, owijając się wokół. Nadal możesz być w stanie zastosować to podejście w każdym przypadku, gdy polecenie kierunkowe wskazuje na serię (względnych) przerw.

Ramy Quine

Zazwyczaj języki ze strukturą łańcuchów znaków / cytatów mogą mieć następującą quine:

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

Dla> <> wyglądałoby to tak:

":1-r>o<#

Z wyjątkiem tego, że wychodzi z błędem jako zakończenie. Jest to prawdopodobnie najkrótszy > <> quine , a przynajmniej najkrótszy, jaki znalazłem.

Conor O'Brien
źródło
To tak naprawdę nie wygląda jak jedna wskazówka.
Post Rock Garf Hunter
@WheatWizard Trzymałem je razem, ponieważ dzielenie ich miało dla mnie mniej sensu, ponieważ są to wszystkie popularne idiomy układu programu.
Conor O'Brien
Dlaczego masz <w quine> <>?
Jo King
@JoKing Nie jestem szczególnie pewien lol
Conor O'Brien
Ponadto "kończy się na niewłaściwej stronie. Wskazówka jest dobra, w przeciwnym razie użyłem tego ogólnego szkieletu w wielu moich odpowiedziach
Jo King