sfondo
PICASCII è uno strumento accurato che converte le immagini in arte ASCII.
Raggiunge diversi gradi di luminosità usando i seguenti dieci caratteri ASCII:
@#+';:,.`
Diremo che questi charxel (elementi del personaggio) hanno una luminosità da 1 (a segno) a 10 (spazio).
Di seguito, puoi vedere i risultati della conversione di un piccolo codice, la bandiera gallese, un frattale rovesciato, una grande trota e un piccolo golf, visualizzati con il carattere corretto:
Puoi vedere le immagini in questo violino e scaricarle da Google Drive .
Compito
Mentre i risultati finali di PICASCII sono visivamente gradevoli, tutte e cinque le immagini combinate pesano 153.559 byte. Quanto potrebbero essere compresse queste immagini se siamo disposti a sacrificare parte della loro qualità?
Il tuo compito è quello di scrivere un programma che accetta un'immagine d'arte ASCII come quelle sopra e una qualità minima come input e stampare una compressione con perdita dell'immagine - sotto forma di un programma completo o una funzione che restituisce una singola stringa - che soddisfi il requisito di qualità.
Ciò significa che non si riesce a scrivere un decompressore separato; deve essere incorporato in ciascuna delle immagini compresse.
L'immagine originale sarà composta da charxel con luminosità compresa tra 1 e 10, separate da avanzamenti di riga in linee della stessa lunghezza. L'immagine compressa deve avere le stesse dimensioni e utilizzare lo stesso set di caratteri.
Per un'immagine non compressa composta da n charxel, la qualità di una versione compressa dell'immagine è definita come
dove c i è la luminosità della i esima charxel dell'uscita dell'immagine compressa e u i la luminosità della i esima charxel dell'immagine non compressa.
punteggio
Il codice verrà eseguito con le cinque immagini dall'alto come input e impostazioni di qualità minima di 0,50, 0,60, 0,70, 0,80 e 0,90 per ciascuna delle immagini.
Il tuo punteggio è la media geometrica delle dimensioni di tutte le immagini compresse, ovvero la venticinquesima radice del prodotto delle lunghezze di tutte le venticinque immagini compresse.
Vince il punteggio più basso!
Regole aggiuntive
Il tuo codice deve funzionare per immagini arbitrarie, non solo per quelle utilizzate per il punteggio.
Si prevede che ottimizzi il tuo codice verso i casi di test, ma un programma che non tenta nemmeno di comprimere immagini arbitrarie non otterrà un mio voto.
Il compressore può utilizzare compressori di flusso di byte integrati (ad es. Gzip), ma è necessario implementarli da soli per le immagini compresse.
Sono consentiti bulit-in normalmente utilizzati nei decompressori di flussi di byte (ad es. Conversione di base, decodifica di lunghezza di esecuzione).
Il compressore e le immagini compresse non devono essere nella stessa lingua.
Tuttavia, è necessario scegliere una sola lingua per tutte le immagini compresse.
Per ogni immagine compressa, si applicano le regole standard per il golf del codice.
Verifica
Ho realizzato uno script CJam per verificare facilmente tutti i requisiti di qualità e calcolare il punteggio di un invio.
È possibile scaricare l'interprete Java da qui o qui .
e# URLs of the uncompressed images.
e# "%s" will get replaced by 1, 2, 3, 4, 5.
"file:///home/dennis/codegolf/53199/original/image%s.txt"
e# URLs of the compressed images (source code).
e# "%s-%s" will get replaced by "1-50", "1-60", ... "5-90".
"file:///home/dennis/codegolf/53199/code/image%s-%s.php"
e# URLs of the compressed images (output).
"file:///home/dennis/codegolf/53199/output/image%s-%s.txt"
e# Code
:O;:C;:U;5,:)
{
5,5f+Af*
{
C[IQ]e%g,X*:X;
ISQS
[U[I]e%O[IQ]e%]
{g_W=N&{W<}&}%
_Nf/::,:=
{
{N-"@#+';:,.` "f#}%z
_::m2f#:+\,81d*/mq1m8#
_"%04.4f"e%S
@100*iQ<"(too low)"*
}{
;"Dimension mismatch."
}?
N]o
}fQ
}fI
N"SCORE: %04.4f"X1d25/#e%N
Esempio
Bash → PHP, punteggio 30344.0474
cat
Raggiunge il 100% di qualità per tutti gli input.
$ java -jar cjam-0.6.5.jar vrfy.cjam 1 50 1.0000 1 60 1.0000 1 70 1.0000 1 80 1.0000 1 90 1.0000 2 50 1.0000 2 60 1.0000 2 70 1.0000 2 80 1.0000 2 90 1.0000 3 50 1.0000 3 60 1.0000 3 70 1.0000 3 80 1.0000 3 90 1.0000 4 50 1.0000 4 60 1.0000 4 70 1.0000 4 80 1.0000 4 90 1.0000 5 50 1.0000 5 60 1.0000 5 70 1.0000 5 80 1.0000 5 90 1.0000 SCORE: 30344.0474