Eingabe : Eine RGBA-Hex-Farbe c
(z. B. FFFF00FF
) und eine Ganzzahl> 0 und <1000 n
(z. B. 200
).
Ausgabe : Rohes Bytes einer PNG - Datei , so dass , wenn die Ausgabe in eine Datei und öffnen in einem Bildbetrachter gespeichert wird, ein n
durch n
Bild mit der Farbe gefüllt c
wird angezeigt.
Spezifikation : Ihr Programm sollte genau Folgendes ausgeben :
- ein PNG-Header (
89504E470D0A1A0A
in hex) - ein
IHDR
Stück mit folgenden Angaben:- width: die vorherige Eingabe
n
- Höhe: die vorherige Eingabe
n
- Bittiefe:
8
(RGBA
) 6
Farbtyp : (Echtfarbe mit Alpha)- Kompressionsverfahren:
0
- Filtermethode:
0
- Interlace-Methode:
0
- width: die vorherige Eingabe
- einen oder mehrere
IDAT
Blöcke, die die Bilddaten enthalten (ein festes Bild der zuvor eingegebenen Farbec
); kann komprimiert oder unkomprimiert sein - ein
IEND
Bildende Chunk
Weitere Details finden Sie auf Wikipedia , auf der W3-Website oder über eine Google-Suche.
Einschränkungen :
- Sie dürfen keine Bildbibliotheken oder Funktionen verwenden, die für die Arbeit mit Bildern jeglicher Art entwickelt wurden.
- Ihr Programm muss in weniger als 3 Minuten ausgeführt werden und für alle Eingaben eine Datei unter 10 MB ausgeben (Sanity Check).
- Dies ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
code-golf
graphical-output
Türknauf
quelle
quelle
999x999
Datei hat mehr als 30720 Pixel, das scheint also widersprüchlich.Antworten:
Perl, 181
Die Größe beträgt 180 Byte und die Option
-p
wird benötigt (+1). Punktzahl ist dann 181.Die Argumente werden über STDIN in einer durch ein Leerzeichen getrennten Zeile, der Farbe als Hex-Wert (16 Zeichen) und der Anzahl der Pixel für Breite / Höhe angegeben, z.
Die Dateigröße beträgt 832 Bytes. Das maximal große Bild (n = 999) mit derselben Farbe hat 6834 Bytes (weit unter 10 MB).
Die Lösung verwendet zwei Bibliotheken:
use Digest::CRC crc32;
für die CRC32-Werte am Block endet.use IO::Compress::Deflate deflate;
um die Bilddaten zu komprimieren.Beide Bibliotheken beziehen sich nicht auf Bilder.
Ungolfed:
Bearbeitungen
use IO::Compress::Deflate':all';
wird ersetzt durchuse Compress::Zlib;
. Letzterer exportiertcompress
standardmäßig die Deflate-Funktion . Die Funktion benötigt keine Referenzen als Argumente und gibt das Ergebnis auch direkt zurück. Das erlaubt es, Variablen loszuwerden$o
.Danke für Michaels Antwort :
Funktion
k
: Ein Aufruf vonpack
kann mithilfe der VorlageNa*N
für den erstenpack
in der Funktion entfernt werden.pack
VorlageNNCV
mit vier Werten optimiertNNC3n
mit sechs Werten.Vielen Dank für den Kommentar von VadimR mit vielen Tipps:
use String::CRC32;
ist kürzer alsuse Digest::CRC crc32;
.y///c-4
ist kürzer als-4+y///c
.CH*
mit der Wiederholung im Wert erstellt.$i
unter Verwendung einer Wertreferenz.-p
) mit dem Leerzeichen abgeglichen wird/ /
. Dann ist die erste Option in$`
und das zweite Argument geht in$'
.-p
druckt auch automatisch$_
."\cZ"
ist kürzer als"\x1a"
.Bessere Komprimierung
Auf Kosten der Codegröße können die Bilddaten weiter komprimiert werden, wenn eine Filterung angewendet wird.
Ungefilterte Dateigröße für
FFFF0FF
200
: 832 BytesFilter
Sub
(horizontale Pixeldifferenzen): 560 BytesFilter
Sub
für die erste Zeile undUp
für die verbleibenden Zeilen: 590 BytesErst ungefilterte Zeile, dann Filter
Up
: 586 BytesAuch
Compress::Zlib
kann abgestimmt werden; Die höchste Komprimierungsstufe kann durch eine zusätzliche Option für die Komprimierungsstufe in Funktioncompress
auf Kosten von zwei Bytes festgelegt werden:Die Dateigröße des Beispiels
yellow200.png
ohne Filterung verringert sich von 832 Byte auf 472 Byte. Auf das Beispiel mitSub
Filterpngcrush -brute
angewendet , wird die Dateigröße von 560 Byte auf 445 Byte verkleinert ( kann nicht weiter komprimiert werden).quelle
-p
. Zusätzlich zu den Einsichten in Michaels Antwort (NA*N
undNNCV
Vorlagen) ist -String::CRC32
Exportieren standardmäßigy///c-4
OK,CH*
Vorlage,$i
weg sein\cZ
, Barewords sind OK-p
und/ /;
Argumente in Prematch und Postmatch. Ich frage mich, ob ich etwas verpasst habe und die Punktzahl unter 200 fallen kann :)use Compress::Zlib;
≈ 10% unter 200PHP 214
Ich bin kein PHP-Experte, es gibt Platz zum Golfen. Tipps sind willkommen.
Generieren Sie eine PNG-Datei:
Generieren Sie einen base64-Stream (fügen Sie das Ergebnis in die Adressleiste Ihres Browsers ein)
Ungolfed Version:
quelle
Python, 252 Bytes
Dieses Skript nimmt Eingaben von argv entgegen. Führen Sie dieses Skript über die Befehlszeile aus
python 27086.py deadbeef 999
quelle