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
quelle
Antworten:
Java → CJam, Ergebnis 4417,89
Benötigt das CJam-Glas im Klassenpfad. Wenn Sie 2 Befehlszeilenargumente (Dateiname und Qualität) angeben, wird ".cjam" an den Dateinamen angehängt und das komprimierte Bild dort geschrieben. Andernfalls berechnet es seine Punktzahl anhand der 5 Testbilder, von denen angenommen wird, dass sie sich im aktuellen Verzeichnis befinden. Das Programm überprüft auch jedes komprimierte Bild automatisch. Sie können die Punktzahlberechnung überprüfen, falls Unstimmigkeiten auftreten.
Die bisher verwendeten Techniken sind: Skalierung auf die Hälfte (horizontal, vertikal oder beides), wenn die Qualität nicht zu stark verringert wird, eine benutzerdefinierte RLE und eine Basiskonvertierung, um mehr Daten in jedes Zeichen zu packen und dabei im zu bleiben druckbarer ASCII-Bereich.
quelle
javac -cp cjam-0.6.5.jar Compress.java
,java -cp cjam-0.6.5.jar Compress
sagt aberError: Could not find or load main class Compress
undjava Compress
findet die CJam-Klasse nicht.-cp .:cjam-0.6.5.jar
(in Windoze, glaube ich, brauchen Sie ein Semikolon anstelle eines Doppelpunkts)Python 3.5 (Haupt- und Ausgabe) (derzeit nicht konkurrierend)
Alles Gute zum Geburtstag, Herausforderung! Hier ist dein Geschenk: eine Antwort!
BEARBEITEN: Konvertierte Ausgabe in Python-Code, verbesserte Komprimierungsrate (geringfügig)
size
1 gesetzt. Verbesserte Punktzahl, die Punktzahl muss jedoch erneut berechnet werden. EDIT3: @Dennis wies darauf hin, dass ich immer noch Fehler zu beheben habe, also habe ich die Antwort als nicht konkurrierend markiertCode:
Diese Antwort könnte eine Menge gebrauchen Verbesserungen , deshalb werde ich wahrscheinlich am Wochenende mehr daran arbeiten.
Wie das funktioniert:
size
.size
und erneut versuchen.Dieser Algorithmus eignet sich gut für Bilder mit geringer Qualität (0,5, 0,6), eignet sich jedoch nicht für Bilder mit höherer Qualität (wird tatsächlich aufgeblasen). Es ist auch sehr langsam.
Hier habe ich alle generierten Dateien, sodass Sie sie nicht erneut generieren müssen.
quelle
comping
sollte es seincompimg
), den ich behoben habe, um das Programm auszuführen. Sofern ich beim Ausführen des Codes keinen Fehler gemacht habe, sind die Abmessungen einiger der generierten Bilder falsch (z. B.image2.txt
33.164 Byte, aber 33.329 Byteimage2-50.0.txt
), und andere generieren beim Ausführen der generierten Programme nicht dieselbe Datei (image3-50.0.txt
mit einer Qualität von 0,5110) Das Ausführen des generierten Programms führt jedoch zu einer Qualität von 0,4508 .image3-50.0.py
von Ihrer Dropbox heruntergeladen und es stimmt mit der Datei überein, die ich erstellt habe.