Hintergrund
PICASCII ist ein übersichtliches Tool, das Bilder in ASCII- Grafiken konvertiert.
Mit den folgenden zehn ASCII-Zeichen werden unterschiedliche Helligkeitsgrade erreicht:
@#+';:,.`
Wir werden sagen, dass diese Charxel (Zeichenelemente) Helligkeiten von 1 (Vorzeichen) bis 10 (Leerzeichen) haben.
Unten sehen Sie die Ergebnisse der Konvertierung eines kleinen Codes, der walisischen Flagge, eines übergebenen Fraktals, einer großen Forelle und eines kleinen Golfs mit der richtigen Schriftart:
Sie können die Bilder in dieser Geige sehen und von Google Drive herunterladen .
Aufgabe
Während die Endergebnisse von PICASCII optisch ansprechend sind, wiegen alle fünf Bilder zusammen 153.559 Bytes. Wie stark könnten diese Bilder komprimiert werden, wenn wir bereit wären, einen Teil ihrer Qualität zu opfern?
Ihre Aufgabe ist es, ein Programm zu schreiben, das ein ASCII - Kunstbild wie das oben genannte und eine Mindestqualität als Eingabe akzeptiert und eine verlustbehaftete Komprimierung des Bildes druckt - in Form eines vollständigen Programms oder einer Funktion, die eine einzelne Zeichenfolge zurückgibt -, die die Anforderungen erfüllt Qualitätsanforderung.
Dies bedeutet, dass Sie keinen separaten Dekomprimierer schreiben müssen. Es muss in jedes der komprimierten Bilder integriert sein.
Das Originalbild besteht aus Zeichen mit Helligkeiten zwischen 1 und 10, die durch Zeilenvorschübe in Zeilen gleicher Länge getrennt sind. Das komprimierte Bild muss dieselben Abmessungen haben und denselben Zeichensatz verwenden.
Für ein unkomprimiertes Bild, das aus n Zeichen besteht, ist die Qualität einer komprimierten Version des Bildes definiert als
wobei c i die Helligkeit des IS i th charxel des komprimierten Bildes des Ausgang und u i die Helligkeit des i - ten Zeichens des unkomprimierten Bildes.
Wertung
Ihr Code wird mit den fünf Bildern von oben als Eingabe- und Mindestqualitätseinstellungen von 0,50, 0,60, 0,70, 0,80 und 0,90 für jedes der Bilder ausgeführt.
Ihre Punktzahl ist das geometrische Mittel der Größen aller komprimierten Bilder, dh die fünfundzwanzigste Wurzel des Produkts aus den Längen aller fünfundzwanzig komprimierten Bilder.
Die niedrigste Punktzahl gewinnt!
Zusätzliche Regeln
Ihr Code muss für beliebige Bilder funktionieren, nicht nur für die, die für das Scoring verwendet werden.
Es wird erwartet, dass Sie Ihren Code für die Testfälle optimieren, aber ein Programm, das nicht einmal versucht , beliebige Bilder zu komprimieren, wird von mir nicht positiv bewertet.
Ihr Kompressor verwendet möglicherweise eingebaute Byte-Stream-Kompressoren (z. B. gzip), aber Sie müssen sie für die komprimierten Bilder selbst implementieren.
Bulit-Ins, die normalerweise in Byte-Stream-Dekomprimierern verwendet werden (z. B. Basiskonvertierung, Lauflängendekodierung), sind zulässig.
Compressor und komprimierte Bilder müssen nicht in derselben Sprache sein.
Sie müssen jedoch für alle komprimierten Bilder eine einzige Sprache auswählen.
Für jedes komprimierte Bild gelten die Standardcode-Golfregeln.
Nachprüfung
Ich habe ein CJam-Skript erstellt, um alle Qualitätsanforderungen zu überprüfen und die Punktzahl einer Einreichung zu berechnen.
Sie können den Java-Interpreter hier oder hier herunterladen .
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
Beispiel
Bash → PHP, Ergebnis 30344.0474
cat
Erreicht 100% Qualität für alle Eingaben.
$ 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