Wskazówki dotyczące gry w golfa w białych znakach

14

Jakie masz ogólne wskazówki na temat gry w golfa w Whitespace? Szukam pomysłów, które można by zastosować do problemów związanych z golfem i które są przynajmniej w pewnym stopniu specyficzne dla białych znaków (np. „Usuń komentarze” nie jest odpowiedzią).

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

Loovjo
źródło
82
Usuń niepotrzebne białe znaki.
KSFT
1
s / [^ [: space:]] // g
Digital Trauma

Odpowiedzi:

11

Nie jestem do końca pewien, czy to żart, czy nie, więc mam nadzieję, że nie wyśmiewa mnie to, że traktuję to poważnie, ale ...

Wskazówka 1: Nie kończ swojego programu

Specyfikacja mówi, że program powinien kończyć się trzema kanałami, [LF][LF][LF]gdzie pierwszy to IMP kontroli przepływu, a dwa następne to polecenie zakończenia, ale wielu interpreterów po prostu uruchomi twój kod bez właściwego zakończenia. Zapisuje 3 znaki w dowolnym programie.

theonlygusti
źródło
6

Wskazówka 2: Używaj sterty tak mało, jak to możliwe

Kiedyś często korzystałem ze Sterty do liczenia moich pętli i tym podobnych, ale zdałem sobie sprawę, że to naprawdę bardzo nieefektywne; najpierw pchanie adresu, pobieranie aktualnej liczby, pobieranie / dodawanie jednego, ponowne pchanie adresu itp.

Teraz po prostu wciskam wartość na stosie, aby działała jako licznik pętli, a następnie używam [Space][LF][Tab]polecenia zamiany, aby wrócić do niego, gdy jest to potrzebne. Praca w / dookoła zajmuje dużo czasu, ale kiedy ją dostaniesz, może naprawdę zmniejszyć liczbę twoich znaków.

theonlygusti
źródło
5

Użyj dowolnych adresów sterty

Wiele interpreterów umożliwia odczytywanie / zapisywanie na dowolne adresy stert zamiast rozpoczynania od 0 lub 1 i zliczania. Możesz zduplikować istniejącą wartość stosu (3 bajty), aby użyć jej jako adresu zamiast wypychania nowej wartości (minimum 4 bajty)

Ephphatha
źródło
+1. Pamiętaj, że dotyczy to tylko nieujemnych adresów sterty. Jeśli więc górna część stosu jest ujemną liczbą całkowitą, nie można użyć go jako adresu sterty.
Kevin Cruijssen
5

Pusta sekwencja jest prawidłową etykietą

[LF][Space][Space][LF](Kontrola przepływu - Oznacz etykietą „”) tworzy pustą etykietę, która jest prawidłowym celem dla skoków lub wywołań podprogramów. Oszczędza to bajt podczas deklarowania etykiety i bajt za każdym razem, gdy jest wywoływana.

( Zaobserwowano w odpowiedzi na spację dla implementacji maszyny prawdy )

Ephphatha
źródło
5

Obniż wszystkie znaki o ustaloną ilość i dodaj to tuż przed drukowaniem w pętli

Podziękowania dla @LukStorms , który stosuje podobne podejście w swojej odpowiedzi na wyzwanie Hello World .

( STNużywane odpowiednio dla spacji, tabulacji i nowej linii).

Przesunięcie wartości liter zawsze wynosi 11 bajtów (tzn. Przesunięcie wartości 65 znaku „A” to SSSTSSSSSTN; przesunięcie wartości 122 znaku „z” toSSSTTTTSTSN ). Jeśli chcesz wydrukować dużą ilość tekstu, może to być kosztowne. Zamiast tego możesz obniżyć wartości wszystkich znaków, które chcesz wydrukować, o ustaloną liczbę, a następnie w pętli, aby je wydrukować, dodaj tę ustaloną ilość.

Można to zrobić za pomocą następującego kodu (załóżmy, że w tym przypadku ustalona wartość wynosi 100):

  1. Wciśnij wszystkie wartości dla znaków (minus stała kwota 100) w odwrotnej kolejności
  2. NSSN (Utwórz Label_0; w zasadzie uruchamianie pętli)
    1. SSSTTSSTSSN (Wciśnij stałą kwotę 100)
    2. TSSS (Dodaj razem dwie górne wartości stosu)
    3. TNSS (Pop i wydrukuj teraz poprawną wartość jako znak)
    4. NSNN (Przejdź do Label_0; przejdź do następnej iteracji pętli)

Spowoduje to zatrzymanie programu z błędem ( który jest dozwolony zgodnie z meta ), gdy tylko spróbuje on wykonać Add ( TSSS) bez niczego więcej na stosie. Użyłem tego do gry w golfa w tej mojej odpowiedzi (patrz punkty 5 i 6 rzeczy, które zrobiłem, aby obniżyć liczbę bajtów ).

To, czy ustalona kwota 100 jest najkrótszym podejściem, zależy od tego, co drukujesz. @LukStorm na przykład użył 107 w swojej odpowiedzi Hello World.

Zauważ, że skopiowanie najwyższej wartości ( SNS) dla dwóch takich samych sąsiednich znaków (takich jak lin Hello) lub kopiowanie wartości z innej pozycji może być nadal używane dodatkowo do golfa więcej bajtów.

Kevin Cruijssen
źródło
4

Przeskakiwanie do niezdefiniowanych etykiet kończy program (w niektórych tłumaczach)

To zaczyna wchodzić w zachowanie specyficzne dla implementacji, ale wierzę, że jest to dozwolone .

TIO (i być może inni tłumacze nie działają przynajmniej na ideonie) zatrzyma wykonywanie, gdy nastąpi próba przeskoczenia do etykiety, która nie istnieje. Jeśli musisz wykonać porównanie, aby wyjść z pętli, pozwala to zaoszczędzić bajty, nie deklarując etykiety przerwania. (Zobacz mój komentarz na temat drukowania niewidocznego tekstu ).

Ephphatha
źródło
4

Wartość 0 można zadeklarować jako liczbę bez cyfr binarnych

Samouczek dotyczący białych znaków wspomina, że ​​liczby mogą mieć dowolną liczbę bitów / cyfr binarnych. Oznacza to, że liczba bez bitów (poza wymaganym bitem znaku) jest prawidłową reprezentacją wartości 0. [Space][Space][Space][LF]i [Space][Space][Space][Space][LF]oba przekazują wartość 0 do stosu, ale ta pierwsza jest krótsza o jeden bajt.

Ephphatha
źródło
0

Kopiowanie poprzednich liczb całkowitych może być krótsze niż tworzenie nowych

( STNużywane odpowiednio dla spacji, tabulacji i nowej linii).

STSArgument + Number może być użyty do skopiowania n- tego elementu ze stosu (podanego przez argument) na wierzch stosu . W niektórych przypadkach można to wykorzystać do zapisania bajtów.

Na przykład w tej mojej odpowiedzi wyjaśniłem w czwartej rzeczy, co zrobiłem, aby obniżyć liczbę bajtów, w jaki sposób kopiowanie pierwszej (indeksowanej 0) wartości ( STSSTN) jest krótsze niż naciśnięcie 12, aby utworzyć znak „p” ( SSSTTSSN) w części "pop"wyniku. (UWAGA: Używam wartości 12 zamiast 112 dla znaku „p”, ponieważ zastosowałem tę drugą wskazówkę obniżania wszystkich wartości o ustaloną kwotę, którą dodajemy przed wydrukowaniem znaków w pętli .)

Kevin Cruijssen
źródło