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.



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)

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


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.


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

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.