Sottocarico, 196 byte
()()(<svg width="99" height="147">)S(<g transform="translate):S((33,33)">)S((3,0)rotate)*a(*a(~*)*~("><path d="M0h3" stroke="#"/>)~*a(*)**:(-90)a~^~(90)a~^)*::*:**:*^S(</g>)(:*)::*:**:*^S(</svg>)S
Ho pensato che potesse essere interessante provare questa sfida in un esolang a bassa potenza; Underload funziona abbastanza bene per una lingua con un numero di comandi così basso.
L'output è un file SVG con tag fortemente nidificati e alcune scorciatoie da golf. Finora non ho trovato un browser in grado di visualizzarlo (Firefox si blocca per diversi minuti nel tentativo di caricarlo e sia Firefox che Chromium danno uno schermo vuoto). La maggior parte dei programmi di elaborazione delle immagini non può nemmeno caricarlo (rendendo difficile la conversione in un altro formato), ma sono riuscito a caricarlo nel visualizzatore di immagini Eye of Gnome (che fa parte dell'installazione predefinita su Ubuntu). Quindi ho fatto uno screenshot dell'immagine in modo che tu possa vederlo (l'immagine reale ha uno sfondo trasparente, ma non puoi davvero fare uno screenshot trasparente):
Dobbiamo specificare esplicitamente la dimensione dell'immagine. Scegliere un orientamento appropriato per l'immagine, disegnare tutto alla minima dimensione legale e fare il numero minimo di iterazioni specificato dalla sfida, ci dà un'immagine che si adatta a soli 99 pixel di larghezza, salvando un byte. È bello quando le cose vanno così.
L'algoritmo generale utilizzato per disegnare immagine è di mantenere due variabili (sottocarico non nomina variabili, ma ho pensato di loro come x ed y ), sia inizialmente vuota. Quindi sostituiamo ripetutamente ( x , y ) con ( x , gira a sinistra e avanza, y ) e ( x , gira a destra e avanza, y ). Dopo dieci iterazioni, sia x ed y tenere una curva drago nove iterazione.
Ci sono anche alcune micro-ottimizzazioni e trucchi specifici per il sottocarico. Al fine di evitare troppa guai con la parte superiore della pila, ogni iterazione del ciclo, iniziamo combinando x ed y nella funzione "restituire la stringa creata concatenando: x , un'istruzione volta, l'argomento della funzione, un movi- istruzioni avanti e y ". Questa funzione occupa solo uno spazio sulla pila, in modo da poter duplicare, chiama con -90
come argomento, scambiare il valore restituito sotto il duplicato, e chiamare con 90
come argomento, per entrare in possesso di nuovi valori per x ed ysenza mai dover toccare più dei primi due elementi della pila (che sono di gran lunga i più comunemente accessibili). Questa funzione è generata dal codice in fase di esecuzione. Il generatore stesso è anche generato dal codice in fase di runtime, al fine di consentirgli di riutilizzare la stringa <g transform="translate
utilizzata anche per impostare l'origine dell'immagine. Generiamo prima tutti i tag aperti, e quindi poiché tutti i tag di chiusura sono giusti </g>
, possiamo generare 1024 tag di chiusura semplicemente ripetendo la stringa, senza preoccuparci di abbinarli ai tag aperti. (Scrivere i numeri in modo efficiente in Underload è un problema interessante a sé stante; (:*)::*:**:*
è probabilmente il modo più efficiente per scrivere 1024, tuttavia, traducendo in "2 alla potenza di (1 + 2 × 2) × 2".
Underload non ha librerie grafiche, quindi produco SVG usando una combinazione di linee di disegno in una posizione fissa e ruotando l'immagine attorno a un determinato punto; invece di girare la penna, giriamo la carta. L'idea è che disegnando una linea, ruotando l'intera immagine, disegnando un'altra linea, ruotando di nuovo l'immagine, ecc., Possiamo simulare efficacemente la grafica delle tartarughe senza dover fare alcuna aritmetica o utilizzare librerie grafiche, poiché tutte le linee sono disegnate nella stessa posizione. Ovviamente, ciò significa che abbiamo alcuni tag di rotazione dell'immagine fortemente nidificati, che confondono molti visualizzatori SVG.
Lo stile dell'immagine conterebbe rispetto al conteggio dei byte, quindi dovevo fornire lo stile minimo necessario per visualizzare l'immagine. Questo risulta essere stroke="#"
, che più o meno si traduce come "la linea deve essere un po 'di colore"; questo sembra essere espanso per disegnarlo in nero. (Normalmente dovresti specificare il colore come, ad esempio, "# 000".) Lo sfondo è trasparente per impostazione predefinita. Non specifichiamo la larghezza del tratto, ma la scelta scelta da Eye of Gnome lascia tutto visibile.
Molti interpreti di Underload hanno difficoltà con questo programma, ad esempio quello su Try It Online si arresta in modo anomalo perché genera internamente stringhe molto grandi. L'interprete online Underload originale funziona, tuttavia. (È interessante notare che il primo interprete era online, quindi la lingua era utilizzabile online prima che fosse utilizzabile offline.)
Qualcosa di cui sono leggermente a disagio è che qui sembrano esserci solo 1023 segmenti di linea, e ci aspetteremmo 1024. Potrebbe essere che uno dei segmenti alla fine non sia disegnato con questo algoritmo (sarebbe disegnato invece sulla prossima iterazione). Se questo è squalificante, potrebbe essere possibile adattare il programma, ma potrebbe finire molto più a lungo. (Non è che questa sfida vincerà comunque la competizione; ci sono già diverse voci più brevi.)