Le proposte di golf in codice di successo sono, per natura, piene di simboli pazzi in tutto il luogo. Per rendere più comprensibile la presentazione, molti golfisti del codice scelgono di includere una spiegazione del loro codice. Nella loro spiegazione, la linea di codice viene trasformata in un diagramma esploso verticalmente.
Ad esempio, se questo fosse il mio codice:
1_'[3:~2@+]`
Uno dei tanti possibili diagrammi che potrei creare sarebbe simile al seguente:
1
_'
[ ]
[3: ]
[ ~ ]
[ 2@ ]
[ +]
`
L'obiettivo. il gol
In questa sfida, si scriverà uno strumento di formattazione automatica delle spiegazioni che accetta una riga di codice e crea un diagramma a cui è possibile aggiungere facilmente testo esplicativo.
Per rendere questa una sfida più utile , l'utente sarà in grado di specificare il contenuto di ogni riga, fornendo una stringa di formattazione. La stringa di formattazione sarà una seconda riga, contenente solo lettere A-Za-z
, della stessa lunghezza del programma. Le lettere mostrano l'ordine in cui i caratteri del programma devono essere stampati nella spiegazione.
Ecco un esempio di I / O senza alcuna formattazione simile a parentesi :
123423
AabcBC
1
2
3
2
3
4
Parentesi
Se più di un carattere nel programma ha lo stesso livello di priorità, quell'insieme di caratteri agisce come un singolo blocco di codice (se formano un gruppo) o un insieme di parentesi (se contengono altri caratteri nel mezzo). Le regole generali sono semplici:
I caratteri non compaiono in una riga del diagramma fino a quando tutti gli altri caratteri con maggiore priorità non sono già comparsi sulle righe sopra di esso nel diagramma.
I caratteri di uguale priorità vengono sempre stampati sulle stesse linee. Se un certo personaggio appare su una linea, tutti gli altri personaggi di uguale priorità appaiono sulla linea.
Una serie di caratteri di uguale priorità continua ad apparire su ogni riga fino a quando tutti gli altri caratteri racchiusi da essa non sono comparsi almeno una volta. Ciò consente costruzioni "simili a parentesi". Se
bceab
sono le priorità, ib
personaggi appariranno sulla seconda riga (sono la seconda priorità più alta) e continueranno ad apparire fino a quando tutti icea
personaggi non sono apparsi. Se la stringa di priorità èabcadeafga
, allora tuttibcdefg
sono considerati contenuti al suo interno, tutti i 4a
s continueranno ad apparire fino a quando nong
è apparso.
Ulteriori requisiti di formattazione
Tutte le linee di output devono avere la stessa lunghezza (la lunghezza delle linee di input), riempite con spazi necessari. La riga del programma di input può contenere spazi, anche se a questi spazi verrà assegnata una lettera prioritaria. Le nuove righe finali sull'output / input sono facoltative.
punteggio
Questo è il golf del codice, vince meno byte.
Esempi
Ecco un esempio commentato di un pezzo di codice con una formattazione più complessa.
1_'[3:~2@+]`
abbcddeffgch
1 #highest priority is denoted by the lowercase letter a
_' #priority b
[ ] #all characters with priority c
[3: ] #priority d, but priority c still printed because it encloses more
[ ~ ] #priority e
[ 2@ ] #priority f
[ +] #priority g, last line of c because all enclosed characters have appeared
` #priority h
Un esempio in Perl:
$_=<>;s/[^aeiou\W]/$&o$&/gi;print
aaaaaabbccccccccccbdddddbbbbeeeee
$_=<>;
s/ / /gi;
s/[^aeiou\W]/ /gi;
s/ /$&o$&/gi;
print
Ecco alcuni esempi in CJam, per gentile concessione di Martin Büttner:
l~2*{_2%{3*)}{2/}?_p_(}g;
aabbcdddefffeeggeehhiiccj
l~
2*
{ }g
{_2% }g
{ { }{ }? }g
{ {3*)}{ }? }g
{ { }{2/}? }g
{ _p }g
{ _(}g
;
q{_eu'[,66>"EIOU"-#)g{'o1$}*}/
abcccddddddeeeeeeefgghiijjhhbb
q
{ }/
{_eu }/
{ '[,66> }/
{ "EIOU"- }/
{ # }/
{ )g }/
{ { }*}/
{ {'o }*}/
{ { 1$}*}/
Ecco un esempio folle solo per scherzare con te:
1_'[3:~2@+]`
azTABACBDCAT
[ : ]
[3: 2 ]
[3:~2 +]
[ :~ @+]
' `
1
_
Ecco un esempio più esplicito di cosa succede quando le parentesi si sovrappongono abab
. (Normalmente, questo non è il modo in cui sceglieresti di formattare la tua spiegazione.)
aabbccddaaeebb
aabbccddaaeebb
aa aa
aabb aa bb
aabbcc aa bb
aabb ddaa bb
bb eebb #"aa" no longer appears because all of "bbccdd" have already appeared.
oNo
può essere sostituito conn
in TIO .