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ź.
code-golf
tips
whitespace-language
Loovjo
źródło
źródło
Odpowiedzi:
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.źródło
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.źródło
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)
źródło
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 )
źródło
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 .
(
STN
uż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):
NSSN
(Utwórz Label_0; w zasadzie uruchamianie pętli)SSSTTSSTSSN
(Wciśnij stałą kwotę 100)TSSS
(Dodaj razem dwie górne wartości stosu)TNSS
(Pop i wydrukuj teraz poprawną wartość jako znak)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 jakl
inHello
) lub kopiowanie wartości z innej pozycji może być nadal używane dodatkowo do golfa więcej bajtów.źródło
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 ).
źródło
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.źródło
Kopiowanie poprzednich liczb całkowitych może być krótsze niż tworzenie nowych
(
STN
używane odpowiednio dla spacji, tabulacji i nowej linii).STS
Argument + 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 .)źródło