Wskazówki dotyczące gry w golfa w INTERCAL


10

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...


Większość języków nie ma tutaj własnych tagów ani ich nie potrzebuje, ponieważ wyzwania związane z danym językiem są na ogół odradzane.
Alex A.,

9
Podpowiedź, że to może nie być najlepszy język golfowy, ze strony wikipedii:Despite the language's intentionally obtuse and wordy syntax,
isaacg

Odpowiedzi:


2

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 NOTsą dwa tokeny, ale można je napisać DONOTbez 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'TPrawdopodobnie 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 z DO READ OUTdarów, które mogą mylić niektóre starsze parsery INTERCAL ze względu na osadzoneDOREADOUTDO(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.


2

Skoncentruj się na wykonaniu jak największej ilości pracy w jednym oświadczeniu

Identyfikatory instrukcji INTERCAL są dość szczegółowe; DOto 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, PLEASEaby parser był szczęśliwy. (Najlepsze, co możesz zrobić, to stosunek czterech DOdo jednego PLEASE, 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ć #1do .1i #2do .2, zamiast robić to w oczywisty sposób INTERCAL-72:

DO.1<-#1DO.2<-#2

zdecydowanie warto rozważyć przeciążenie zmiennej losowej, aby umożliwić przypisanie obu jednocześnie:

DO:1<-#1$#2

( :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 .1i .2wię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:

DOSTASH.1DOSTASH.1

ale tak:

DOSTASH.1+.1

( +Notacja działa w przypadku większości poleceń, w których może mieć sens koncepcyjny).


2

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 NEXTdwukrotne wykonanie obliczenia RESUME. (We współczesnym kodzie często obliczenia COME FROMbędą lepsze, ale ta wskazówka zakłada, że ​​twój kod woli NEXT). Niemal na pewno musisz zapłacić bajty za pierwsze NEXT, ponieważ przeskakuje z jednej gałęzi „jeśli” do drugiej. Dzielenie się drugim NEXTjest również nietrywialne, chyba że masz wiele stwierdzeń „jeśli”, które idą w to samo miejsce po zobaczeniu #1. Jednakże, RESUMEmoż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 RESUMEprawdopodobnie gwarantuje jednocyfrowy numer wiersza, dzięki czemu twoje drugie NEXTzdanie może być jak najkrótsze. Jeśli to możliwe, spróbuj zrobić z niego obliczenia RESUME, 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ą NEXTedytowane); wtedy jedynym kosztem jest numer linii. Będziesz musiał użyć jednej zmiennej boolean dla wszystkich tych NEXTs; 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 RESUMEjest 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żna NEXTw prawo w standardowych wewnętrznych bibliotecznych, jeśli chcesz, a w szczególności, może NEXTna 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):

(1001) DO RESUME .5

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

(9)DO(1001)NEXT

który jest tylko nieznacznie dłuższy niż

(9)DORESUME.5

i ma tę zaletę, że stają się booleany #2i #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, #0a #1jeśli zamierzasz dużo tracić (ale obliczenia COME FROMprawdopodobnie będą działać lepiej w tym przypadku, chyba że twoje wymagania są bardzo dziwne).


2

INTERCAL nie określa pierwszeństwa, ale również nie błędnie przy dwuznacznym pierwszeństwie

Wyrażenie podobne do

#1$#2~#3

jest niejednoznaczny i może oznaczać

'#1$#2'~#3

lub

#1$'#2~#3'

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 , 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).


2

W C-INTERCAL rozważ użycie skrótu w kodzie CREATE

CREATEZestawienie 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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.