sfondo
(Basato su una storia vera e straziante)
Ai miei tempi, ho giocato spesso con Lisp e lingue simili. Ho scritto con loro, li ho eseguiti, li ho interpretati, li ho progettati e ho fatto scrivere macchine con loro per me ... E se c'è una cosa che mi disturba, è vedere Lisp che non è conforme al mio stile di formattazione specifico.
Sfortunatamente, alcuni editor di testo ( tosse XCode tosse ) tendono a rimuovere le mie belle schede e spazi ogni volta che il codice viene copiato e incollato ... Prendi questa sintassi splendidamente spaziata simile a Lisp:
(A
(B
(C)
(D))
(E))
(Dove ABCDE
sono le funzioni arbitrarie)
ALCUNI editor di testo macellano questo adorabile codice fino alla fine seguente:
(A
(B
(C)
(D))
(E))
Che casino! Non è leggibile!
Aiutami, qui?
La sfida
Il tuo obiettivo in questa sfida è quello di prendere una serie di funzioni separate da nuove righe in un formato descritto di seguito e restituire una disposizione più bella che evidenzi la leggibilità e l'eleganza.
L'ingresso
Definiamo una funzione F
di N
argomenti arity come un costrutto simile al seguente:
(F (G1 ...) (G2 ...) (G3 ...) ... (GN ...))
dove G1, G2, ..., GN
sono tutte le funzioni in sé e per sé. Una 0
funzione arity A
è semplicemente (A)
, mentre una 2
funzione arity B
è della forma(B (...) (...))
Il codice deve essere inserito come una serie di funzioni con una nuova riga prima della parentesi iniziale di ogni funzione (ad eccezione della prima funzione). L'esempio sopra è un input valido.
Puoi presumere:
- Le parentesi sono bilanciate.
- Una funzione non dovrà mai essere rientrata più di 250 volte.
- OGNI funzione è racchiusa tra parentesi:
()
- Il nome di una funzione conterrà solo caratteri ASCII stampabili.
- Il nome di una funzione non conterrà mai parentesi o spazi.
- C'è una nuova riga finale opzionale sull'input.
L'output
Il codice dovrebbe generare lo stesso insieme di funzioni, in cui le uniche modifiche apportate sono le aggiunte di spazi o schede prima delle parentesi iniziali delle funzioni. L'output deve essere conforme alle seguenti regole:
- La prima funzione (e successivamente le funzioni di livello superiore) fornite non dovrebbero avere spazi precedenti
- Un argomento per la posizione orizzontale di una funzione è esattamente una scheda a destra della posizione orizzontale di quella funzione.
- Una scheda è definita dall'implementazione, ma deve essere di almeno 3 spazi.
- È possibile stampare facoltativamente un massimo di due spazi dopo ogni riga.
Regole
- Questo è code-golf: vince il codice più corto!
- Le scappatoie standard non sono ammesse.
Esempi
Ingresso:
(A
(B
(C)
(D))
(E))
Produzione:
(A
(B
(C)
(D))
(E))
Ingresso:
(!@#$%^&*
(asdfghjklm
(this_string_is_particularly_long
(...))
(123456789)))
(THIS_IS_TOP_LEVEL_AGAIN
(HERE'S_AN_ARGUMENT))
Produzione:
(!@#$%^&*
(asdfghjklm
(this_string_is_particularly_long
(...))
(123456789)))
(THIS_IS_TOP_LEVEL_AGAIN
(HERE'S_AN_ARGUMENT))
Ingresso:
(-:0
(*:0
(%:0
(Arg:6)
(Write:0
(Read:0
(Arg:30))
(Write:0
(Const:-6)
(Arg:10))))
(%:0
(Const:9)
(/:0
(Const:-13)
(%:0
(Arg:14)
(Arg:0)))))
(WriteArg:22
(-:0
(Const:45)
(?:0
(Arg:3)
(Arg:22)
(Arg:0)))))
Produzione:
(-:0
(*:0
(%:0
(Arg:6)
(Write:0
(Read:0
(Arg:30))
(Write:0
(Const:-6)
(Arg:10))))
(%:0
(Const:9)
(/:0
(Const:-13)
(%:0
(Arg:14)
(Arg:0)))))
(WriteArg:22
(-:0
(Const:45)
(?:0
(Arg:3)
(Arg:22)
(Arg:0)))))
()
?