Suggerimenti per il golf a Lisp


9

Quali consigli generali sono per giocare a golf a Lisp (qualsiasi dialetto)? Si prega di inviare un suggerimento per risposta, e solo le risposte specifiche di un dialetto di Lisp (ad es. "Rimuovi commenti" non è una risposta).

Pubblica il dialetto di Lisp a cui si applica il tuo suggerimento con il tuo suggerimento.



1
Pensi che questi saranno distinti dai suggerimenti per giocare a golf in Scheme e Racket ?
Alex A.

1
Ti consiglierei di usare tinylisp, una versione più piccola e ridotta di Lisp per il tuo piacere di giocare a golf.
ckjbgames,

Risposte:


4

Ordinare i parametri delle funzioni per ridurre al minimo gli spazi bianchi

Invece di

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

prova qualcosa del genere

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

1

Stampa stringhe costituite da lettere maiuscole tramite atomi di stampa

La princfunzione in Common Lisp è breve e stampa oggetti senza caratteri di escape. Se si stampano simboli Common Lisp, che hanno la sinossi 'symbol-name, questo ti evita di avere bisogno di virgolette su ciò che vuoi stampare e può anche risparmiare su spazi bianchi. Si noti che quando si stampano i simboli, questi saranno maiuscoli. Inoltre, non aggiunge una nuova riga o uno spazio, quindi non è necessario il concatenamento.

Per esempio,

(princ'hai)

stamperà HAI.

E

(princ'hai)(princ(read))

stamperà HAI, chiederà l'input e lo stamperà nuovamente, ad esempio se si digita ciao, il risultato è

HAIhellohello


1

Usa loope format, che è come printfsugli steroidi. formatinclude iterazione e condizioni, nonché numeri romani, numeri inglesi e plurali inglesi. È molto, molto brutto e molto compatto.


1

Uscita condizionale

GNU Common Lisp

~v^

La direttiva up-and-out~^ viene utilizzata più comunemente in un'operazione di formattazione dell'elenco per terminare dopo l'ultimo elemento dell'elenco. Tuttavia, può anche essere utilizzato con un vmodificatore per utilizzare un argomento, nel qual caso termina se tale argomento è zero. Ciò è particolarmente utile per gestire lo zero prodotto da 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)

Il primo argomento formatpuò essere uno di t, nilaka (), o uno stream. Se passato t, verrà generato in stdout, se nilrestituirà l'output formattato come stringa. Questo può essere usato in modo condizionale. L'esempio sopra potrebbe essere scritto ugualmente breve come:

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

Se è stato emesso un valore, il valore restituito sarà nil. Per questo motivo, può anche essere utilizzato come condizione di terminazione per un dociclo:

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

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

~[...~]

Il formattatore condizionale utilizza un argomento e seleziona una stringa di formattazione da un elenco per indice. Un caso d'uso comune è con il formattatore predefinito ~:;per selezionare tra zero e non zero.

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

I formattatori condizionali possono anche essere nidificati, nel qual caso ciascuno consumerà a sua volta un argomento.


~&

In ciascuno degli esempi sopra, ~%viene utilizzato per emettere una nuova riga. Nella maggior parte dei casi, questo potrebbe essere sostituito da una nuova riga letterale. Un'altra opzione è utilizzare ~&, che emetterà una nuova riga se e solo se il cursore di output non si trova all'inizio di una riga, ovvero a fresh-line.

Entrambi ~%e ~&possono anche prendere un argomento, con un vmodificatore o come costante, e produrranno tante nuove righe. Accetteranno entrambi felicemente un argomento negativo, nel qual caso non emettono nulla.


Riferimenti esterni

Pratico Lisp comune
18. Alcune ricette di FORMATO

Common Lisp the Language, 2nd Edition
22.3.3. Output formattato in flussi di caratteri

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.