Wskazówki do gry w golfa w Lisp

9

Jakie są ogólne wskazówki dotyczące gry w golfa w Lisp (dowolny dialekt)? Proszę zamieścić jedną wskazówkę na odpowiedź i tylko odpowiedzi, które są specyficzne dla dialektu Lisp (np. „Usuń komentarze” nie jest odpowiedzią).

Prosimy o podanie dialektu Lisp, którego dotyczy wskazówka.

Nikogo tu nie ma
źródło
3
xkcd.com/297
James
1
Czy wyobrażasz sobie, że będą się różnić od wskazówek dotyczących gry w golfa w Scheme and Racket ?
Alex A.
1
Radziłbym użyć Tinylisp, mniejszej, zdartej wersji Lisp dla twojej przyjemności z gry w golfa.
ckjbgames

Odpowiedzi:

4

Porządkuj parametry funkcji, aby zminimalizować białe znaki

Zamiast

(defun f(a b)(...))
...
(f x(1+ y))

spróbuj czegoś takiego

(defun f(b a)(...))
...
(f(1+ y)x)
sufitowy
źródło
1

Drukuj ciągi składające się z wielkich liter za pomocą atomów drukujących

princFunkcji w Common Lisp jest krótki, i będzie drukować obiekty bez characers ewakuacyjnych. Jeśli drukujesz symbole Common Lisp, które mają sykx 'symbol-name, to oszczędza ci konieczności szukania cudzysłowów wokół tego, co chcesz wydrukować, a także może zaoszczędzić na białych znakach. Pamiętaj, że podczas drukowania symboli będą one pisane wielkimi literami. Ponadto nie dodaje nowej linii ani spacji, więc nie potrzebujesz konkatenacji.

Na przykład,

(princ'hai)

wydrukuje HAI.

I

(princ'hai)(princ(read))

wydrukuje HAI, poprosi o dane wejściowe i wydrukuje je z powrotem, np. jeśli wpiszesz hello, wynikiem będzie

HAIhellohello
Matceporial
źródło
1

Użyj 1+i 1-do zwiększenia i zmniejszenia

Zamiast (+ a 1)lub (- b 1)spróbuj (1+ a)lub (1- b).

sufitowy
źródło
Nie rozumiem tego Nie jest 1+analizowany jako dwa tokeny 1i +? Tak myślałem +1.
Esolanging Fruit
@ Challenger5 1+i 1-są analizowane jako pojedynczy token Common Lisp HyperSpec Function 1+, 1-
pułapkat
Myślałem, że imiona nie mogą zaczynać się cyframi?
Esolanging Fruit
@EsolangingFruit to jest Lisp ...
ASCII tylko
1

Użyj loopi format, jak printfna sterydach. formatobejmuje iterację i warunki, a także cyfry rzymskie, liczby angielskie i liczbę mnogą w języku angielskim. Jest bardzo, bardzo brzydki i bardzo zwarty.

Michael Vehrs
źródło
1

Wyjście warunkowe

GNU Common Lisp

~v^

Dyrektywa zwiększania i wyłączania ~^jest najczęściej używana w operacji formatowania listy w celu zakończenia jej po ostatnim elemencie listy. Można go jednak również użyć z vmodyfikatorem do zużywania argumentu, w którym to przypadku kończy się, jeśli argument ten wynosi zero. Jest to szczególnie przydatne w przypadku zera wytwarzanego przez dotimes.

(loop as n from 1 to 10 do(format t"~d~%"n))

(dotimes(n 11)(if(> n 0)(format t"~d~%"n)))

(dotimes(n 11)(format t"~v^~d~%"n n))

format(condition)

Pierwszym argumentem formatmoże być jeden t, nilaka (), lub strumienia. Jeśli zostanie przekazany t, wyśle ​​go do stdout, jeśli nilzwróci sformatowane wyjście jako ciąg. Można to wykorzystać warunkowo. Powyższy przykład można napisać równie krótko, jak:

(dotimes(n 11)(format(> n 0)"~d~%"n))

Jeśli wyprowadzono wartość, zwracana będzie wartość nil. Z tego powodu może być również używany jako warunek zakończenia dopętli:

(do((n 11))((<(decf n)1))(format t"~d~%"n))

(do((n 11))((format(>(decf n)0)"~d~%"n)))

~[...~]

Formater warunkowy zużywa argument i wybiera ciąg formatujący z listy według indeksu. Częstym przypadkiem użycia jest domyślny formatyzator, ~:;który wybiera pomiędzy zero a zero.

(dotimes(n 11)(format t"~v^~[~r~:;~d~]~%"n(mod n 3)n))

Można również zagnieżdżać formatory warunkowe, w którym to przypadku każdy z nich zużyje argument.


~&

W każdym z powyższych przykładów ~%zastosowano znak nowej linii. W większości przypadków można to zastąpić dosłownie nową linią. Inną opcją jest użycie ~&, która wyemituje nowy wiersz wtedy i tylko wtedy, gdy kursor wyjściowy nie znajduje się na początku linii, czyli a fresh-line.

Oba ~%i ~&mogą również przyjmować argument, z vmodyfikatorem lub jako stałą, i wygenerują tyle nowych linii. Oboje również chętnie zaakceptują argument negatywny, w którym to przypadku nic nie emitują.


Referencje zewnętrzne

Praktyczne wspólne Lisp
18. Kilka przepisów na formaty

Common Lisp the Language, wydanie drugie
22.3.3. Sformatowane wyjście do strumieni znaków

primo
źródło