sfondo
Un sistema L (o sistema Lindenmayer) è un sistema di riscrittura parallela che, tra le altre cose, può essere facilmente utilizzato per modellare i frattali. Questa domanda riguarda i sistemi L deterministici e senza contesto . Sono costituiti da un alfabeto di simboli, una stringa di assioma iniziale e un insieme di regole di riscrittura che associano ciascun simbolo dell'alfabeto a una nuova stringa. Le regole vengono applicate all'assioma in parallelo, generando una nuova stringa. Questo processo viene quindi ripetuto.
Ad esempio, il sistema con l'assioma "A" e le regole A = ABA; B = BBB genera la sequenza di stringhe "ABA", "ABABBBABA", "ABABBBABABBBBBBBBBABABBBABA", ecc. Per concisione, non menzioniamo esplicitamente il alfabeto quando si definisce il sistema L. Inoltre, si presume che qualsiasi simbolo senza una regola di riscrittura esplicita sia invariato (ovvero la regola predefinita per un simbolo A è A = A).
I sistemi L possono essere visualizzati utilizzando una forma di grafica tartaruga. Per convenzione, la tartaruga inizia rivolta verso destra. Una stringa viene quindi disegnata ripetendo i suoi simboli: una F significa "trascina avanti di un'unità", una G significa "sposta avanti di un'unità", un + significa "gira a sinistra di un'unità ad angolo" e un - significa "gira a destra di un angolo unità". Tutti gli altri simboli nella stringa vengono ignorati. Ai fini di questa domanda, si presume che le unità angolari siano sempre di 90 °.
Compito
Data una specifica di qualsiasi sistema L e un numero di iterazioni, il tuo programma dovrebbe produrre un rendering ASCII della stringa risultante (come descritto sopra) usando caratteri di disegno a scatola.
- I parametri vengono passati come una stringa separata dallo spazio comprendente l'assioma, le regole di riscrittura (come un elenco separato di equazioni;) e il numero di iterazioni di riscrittura. Ad esempio, l'ingresso "FF = FGF; G = GGG 2" genera la stringa "FGFGGGFGF" e quindi disegna quattro linee con spazi adeguati.
- I simboli utilizzati dal sistema L possono essere qualsiasi carattere ASCII a parte spazio e punto e virgola. Esiste al massimo una regola esplicita specificata per simbolo (la regola di riscrittura predefinita è la mappatura dell'identità come descritto sopra).
- Si può presumere che l'output conterrà sempre almeno una F.
- L'output dovrebbe usare i seguenti caratteri UNICODE per rappresentare la visualizzazione: ─ (U + 2500), │ (U + 2502), ┌ (U + 250C), ┐ (U + 2510), └ (U + 2514) , ┘ (U + 2518), ├ (U + 251C), ┤ (U + 2524), ┬ (U + 252C), ┴ (U + 2534), ┼ (U + 253C), ╴ (U + 2574), ╵ (U + 2575), ╶ (U + 2576) e ╷ (U + 2577). Vedi sotto per esempi.
- L'output non deve contenere righe vuote sopra il carattere della casella più in alto o sotto quello più in basso. Inoltre, non deve contenere spazi alla sinistra del riquadro più a sinistra o alla destra di quello più a destra. Sono consentite le linee con spazi finali che non si estendono oltre il carattere del riquadro più a destra.
È possibile scrivere un programma o una funzione, prendendo l'input tramite STDIN (o l'alternativa più vicina), argomento della riga di comando o argomento della funzione. I risultati devono essere stampati su STDOUT (o alternativa più vicina), salvati su un file o restituiti come stringa.
Esempi
# Cantor dust
>> "F F=FGF;G=GGG 0"
╶╴
>> "F F=FGF;G=GGG 1"
╶╴╶╴
>> "F F=FGF;G=GGG 2"
╶╴╶╴ ╶╴╶╴
>> "F F=FGF;G=GGG 3"
╶╴╶╴ ╶╴╶╴ ╶╴╶╴ ╶╴╶╴
# Koch curve
>> "F F=F+F−F−F+F 1"
┌┐
╶┘└╴
>> "F F=F+F-F-F+F 2"
┌┐
┌┘└┐
┌┘ └┐
┌┼┐ ┌┼┐
╶┘└┘ └┘└╴
Altri esempi con cui testare il programma includono:
# Dragon curve
>> "FX X=X+YF+;Y=-FX-Y n"
# Hilbert curve
>> "A A=-BF+AFA+FB-;B=+AF-BFB-FA+ n"
# Sierpinski carpet
>> "F F=F+F-F-F-G+F+F+F-F;G=GGG n"
I primi due sono i seguenti (prodotti utilizzando la risposta di @ edc65):
Puoi testare qualsiasi sistema in questa pagina .
punteggio
Vince il codice più breve (in byte). Si applicano le regole standard.
Miscellania
Questa sfida è stata ispirata da Draw a Random Walk with Slash . In effetti, è possibile rappresentare una camminata casuale come sistema L se si estende il sistema per consentire più regole per simbolo, con l'espansione scelta in modo non deterministico durante la riscrittura. Una formulazione è:
"F F=FF;F=F+F;F=F++F;F=F+++F"
Un'altra estensione comune, spesso usata quando si modellano le piante, è interpretare i caratteri [e] come spingere e schioccare la posizione e l'angolazione attuali. La maggior parte delle piante usa angoli inferiori a 90 °, ma ecco un esempio che non:
"FAX X=[-FAX][FAX][+FAX];A=AFB;B=A"
Nessuno di questi esempi deve essere supportato in questa sfida.
Questa sfida è anche simile a "Mi dispiace, giovanotto, ma sono le tartarughe fino in fondo!" . Tuttavia, quella sfida utilizzava il rendering delle linee anziché ASCII e consentiva una sintassi più flessibile.