Jakie masz ogólne wskazówki na temat gry w golfa w INTERCAL ? Szukam pomysłów, które można by zastosować do golfowych wyzwań kodowych i które są przynajmniej w pewnym stopniu specyficzne dla INTERCAL (tzn. „Usuń komentarze” nie jest użyteczną odpowiedzią).
Wiem, że języki egzotyczne mogą być bardzo przydatne do wygrywania zawodów golfowych, ale nie widzę tu zbyt wiele kodów INTERCAL. Czy masz jakieś porady, które mogą pomóc ludziom uzyskać konkurencyjne rozmiary kodu dzięki INTERCAL? Czy ten język może być kiedykolwiek konkurencyjny?
INTERCAL jest tak niewykorzystany, że nawet nie ma tagu. Taki smutny...
Despite the language's intentionally obtuse and wordy syntax,
Odpowiedzi:
Usuwanie białych znaków / „szumów” może pójść dalej, niż można się spodziewać
INTERCAL jest językiem niewrażliwym na białe znaki. W przeciwieństwie do większości języków niewrażliwych na spacje niewrażliwość wykracza jednak znacznie dalej, niż można się spodziewać.
Na przykład,
DO NOT
są dwa tokeny, ale można je napisaćDONOT
bez nazywania analizatora składni (w praktycznie dowolnej powszechnie stosowanej implementacji). (Oczywiście, można również pisaćDON'T
, ale nie jest to bardziej zwięzłe. Może być łatwiejsze do odczytania, chociaż.PLEASEN'T
Prawdopodobnie jest trudniejsze do odczytania niżPLEASE NOT
.) W rzeczywistości istnieje pewna debata na temat tego, czy białe znaki w ogóle coś robią; co najmniej jeden parser INTERCAL pozwala nawet na stałe liczbowe (nie jest to bardzo przydatne podczas gry w golfa). Należy pamiętać, że usuwanie białych znaków zDO READ OUT
darów, które mogą mylić niektóre starsze parsery INTERCAL ze względu na osadzoneDOREADOUT
DO
(chociaż ich autorzy ogólnie uważają to za błąd, a zatem obecnie zazwyczaj działa on w prawidłowym programie, nie zaleca się umieszczania takiego kodu w pobliżu błędu składniowego, ponieważ wówczas trudniej jest jednoznacznie ustalić).Pamiętaj też, że możesz prześcigać postacie, aby zaoszczędzić miejsce. W ASCII można to naprawdę zrobić tylko za pomocą
'.
→!
, ale jest to bardzo przydatna sztuczka sama w sobie. (Gdy nie używasz tablic, nie ma możliwości iskrzenia dwuznaczności, nawet jeśli wszystkie twoje postacie grupujące są takie same, więc w przypadku wpisów w golfa zaleca się, aby trzymać się tego,'
chyba że indeks tablicy naprawdę wymaga a"
.) Mól książkowy może być reprezentowane w jednym bajcie za pomocą?
skrótu (C-INTERCAL) lub Latin-1 dla¥
(CLC-INTERCAL) zamiast trzech, których potrzebuje INTERCAL-72.źródło
Skoncentruj się na wykonaniu jak największej ilości pracy w jednym oświadczeniu
Identyfikatory instrukcji INTERCAL są dość szczegółowe;
DO
to dwa znaki szumu na każdym wyciągu, sama nazwa wyciągu również wydaje się być dość długa, a od czasu do czasu trzeba dodawać znak,PLEASE
aby parser był szczęśliwy. (Najlepsze, co możesz zrobić, to stosunek czterechDO
do jednegoPLEASE
, co oznacza, że używasz 14 znaków w identyfikatorach na każde 5 poleceń.) Z drugiej strony, składnia wyrażeń jest dość zwięzła (niedorzeczna, ale zwięzła). Oznacza to, że często warto dopasować część programu do pojedynczego wyrażenia, nawet jeśli użycie wielu instrukcji byłoby bardziej „naturalnym” sposobem wykonywania zadań.Na przykład, jeśli chcesz przypisać
#1
do.1
i#2
do.2
, zamiast robić to w oczywisty sposób INTERCAL-72:zdecydowanie warto rozważyć przeciążenie zmiennej losowej, aby umożliwić przypisanie obu jednocześnie:
(
:1/!1$.2'
wrzucony gdzieś wcześniej w programie; zwróć uwagę, że notacja ta znacznie wyprzedza INTERCAL-72, więc aby to zadziałało, musisz użyć nowoczesnego INTERCAL). Jest to tylko nieco dłużej, nawet jeśli weźmiesz pod uwagę konfigurację, i staje się krótsze, jeśli kiedykolwiek będziesz musiał lub możesz to zorganizować, jednocześnie przypisać do.1
i.2
więcej niż raz.To nie tylko obliczanie poleceń, w których działa ta sztuczka. Jeśli chcesz ukryć zmienną dwa razy, nie rób tego w ten sposób:
ale tak:
(
+
Notacja działa w przypadku większości poleceń, w których może mieć sens koncepcyjny).źródło
Użyj jednego WZNÓW dla wszystkich stylów INTERCAL-72, jeśli konstruktów
Jeśli musisz napisać odpowiednik instrukcji „if”, normalną metodą przy użyciu kodu INTERCAL-72 jest
NEXT
dwukrotne wykonanie obliczeniaRESUME
. (We współczesnym kodzie często obliczeniaCOME FROM
będą lepsze, ale ta wskazówka zakłada, że twój kod woliNEXT
). Niemal na pewno musisz zapłacić bajty za pierwszeNEXT
, ponieważ przeskakuje z jednej gałęzi „jeśli” do drugiej. Dzielenie się drugimNEXT
jest również nietrywialne, chyba że masz wiele stwierdzeń „jeśli”, które idą w to samo miejsce po zobaczeniu#1
. Jednakże,RESUME
może być w dowolnym miejscu w programie (bo kontrola zamierza go opuścić natychmiast w dowolnym miejscu).Istnieją dwa sposoby, aby sobie z tym poradzić. Jeśli masz wiele instrukcji „jeśli”, to
RESUME
prawdopodobnie gwarantuje jednocyfrowy numer wiersza, dzięki czemu twoje drugieNEXT
zdanie może być jak najkrótsze. Jeśli to możliwe, spróbuj zrobić z niego obliczeniaRESUME
, które naturalnie pojawią się w twoim kodzie (to prawda, jest to trudne, ponieważ rzadko pojawiają się w „normalnym przepływie” kodu, a nie sąNEXT
edytowane); wtedy jedynym kosztem jest numer linii. Będziesz musiał użyć jednej zmiennej boolean dla wszystkich tychNEXT
s; tutaj jest powszechny konsensus.5
, głównie dlatego, że jest to zmienna używana przez bibliotekę standardową dla zwracanych wartości boolowskich.Alternatywnie możliwe jest skorzystanie z nieudokumentowanej (technicznie niedokumentowanej, ponieważ włączyłem wskazówkę do dokumentacji INTERCAL, gdy zauważyłem) funkcji standardowej biblioteki. Ponieważ centralna lokalizacja
RESUME
jest bardzo przydatna, standardowa biblioteka korzysta z niej wewnętrznie. Numery linii w INTERCAL są globalne (z przestrzeni nazw konwencje, ale który może być uszkodzony, jeśli wiesz co robisz), dzięki czemu możnaNEXT
w prawo w standardowych wewnętrznych bibliotecznych, jeśli chcesz, a w szczególności, możeNEXT
na swoim miejscu centralnym RESUME . Jest to wystarczająco popularne w istniejącym kodzie INTERCAL, że standardowe zamienniki bibliotek zwykle muszą go implementować, aby uniknąć uszkodzenia istniejących programów.Linia, o której mowa, to (dosłownie lub skutecznie, w zależności od implementacji):
Głównym powodem, aby tego nie używać, jest długi numer linii; jeśli musisz wykonać wiele konstrukcji typu INTERCAL-72, jeśli lepiej, użyj własnego, aby nadać mu krótszą liczbę.
Oczywiście możesz łączyć techniki, pisząc coś podobnego
który jest tylko nieznacznie dłuższy niż
i ma tę zaletę, że stają się booleany
#2
i#3
(co jest trudniejsze do odczytania, ale zwykle łatwiejsze do wygenerowania). W rzeczywistości może być nawet warte dodania dodatkowego kodu do obsługi,#0
a#1
jeśli zamierzasz dużo tracić (ale obliczeniaCOME FROM
prawdopodobnie będą działać lepiej w tym przypadku, chyba że twoje wymagania są bardzo dziwne).źródło
INTERCAL nie określa pierwszeństwa, ale również nie błędnie przy dwuznacznym pierwszeństwie
Wyrażenie podobne do
jest niejednoznaczny i może oznaczać
lub
Specyfikacja INTERCAL pozostawia celowo niejasne, co ma na myśli, i ogólnie rzecz biorąc nie ma standardu (chociaż C-INTERCAL i CLC-INTERCAL starają się dopasować do siebie w prostszych przypadkach). To powiedziawszy, oryginał nie jest niepoprawny ; jest niejednoznaczny i nie radziłbym używać go w kodzie produkcyjnym (ale wtedy nie radziłbym używania samego INTERCAL-a w kodzie produkcyjnym), ale będzie miał pewne znaczenie w większości kompilatorów.
Innymi słowy, warto po prostu usunąć grupowanie znaków i mieć nadzieję, że Twój program nadal będzie działał. Większość tłumaczy konsekwentnie analizuje dowolne wyrażenia dwuznaczne, więc dla każdej pary znaków grupujących istnieje szansa 1 na 2, że jest to niepotrzebne; które mogą przynieść całkiem sporo oszczędności. (Niestety, INTERCAL Parsery wydają się być na tyle mylące, że nikt nie jest do końca pewien, co przepisy rzeczywiście są , ale może normalnie być określona doświadczalnie. W najprostszych przypadkach operatorzy zazwyczaj wszyscy mają równe pierwszeństwo i mieć spójną skojarzenia).
źródło
W C-INTERCAL rozważ użycie skrótu w kodzie
CREATE
CREATE
Zestawienie pozwala stworzyć nową składnię. Jest to szczególnie przydatne w golfie, ponieważ pozwala na nadawanie oświadczeniom krótszych nazw. Możesz go również użyć do skutecznego „zdefiniowania funkcji” poprzez utworzenie nowego operatora (co ma tę ogromną zaletę, że pozwala wywoływać funkcję w środku wyrażenia).Koszt instalacji tutaj jest dość wysoki, ale jeśli istnieje konstrukcja, której często używasz, wymyślenie krótszej składni jest prawdopodobnie dobrym pomysłem.
źródło