Entrée : une couleur hexadécimale RGBA c
(ex. FFFF00FF
) Et un entier> 0 et <1000 n
(ex. 200
).
Sortie : Raw octets d'un fichier PNG de sorte que lorsque la sortie est enregistrée dans un fichier et ouvert dans une visionneuse d'images, une n
par n
image remplie avec la couleur c
est affichée.
Spécification : votre programme doit produire exactement :
- un en-tête PNG (
89504E470D0A1A0A
en hexadécimal) - un
IHDR
morceau contenant ces spécifications:- largeur: l'entrée précédente
n
- hauteur: l'entrée précédente
n
- profondeur de bits:
8
(RGBA
) - type de couleur:
6
(truecolor avec alpha) - méthode de compression:
0
- méthode de filtrage:
0
- méthode entrelacée:
0
- largeur: l'entrée précédente
- un ou plusieurs
IDAT
morceaux contenant les données d'image (une image solide de couleur entrée précédemmentc
); peut être compressé ou non compressé - un
IEND
morceau de fin d'image
Plus de détails disponibles sur Wikipedia , sur le site W3 , ou via une recherche Google.
Restrictions :
- Vous ne pouvez pas utiliser de bibliothèques d'images ou de fonctions conçues pour fonctionner avec des images de toute nature.
- Votre programme doit s'exécuter en moins de 3 minutes et générer un fichier de moins de 10 Mo pour toutes les entrées (vérification de l'intégrité).
- Il s'agit de code-golf , donc le code le plus court en octets gagnera!
code-golf
graphical-output
Poignée de porte
la source
la source
999x999
fichier a plus de 30720 pixels, ce qui semble contradictoire.Réponses:
Perl, 181
La taille est de 180 octets et une option
-p
est nécessaire (+1). Le score est alors de 181.Les arguments sont donnés via STDIN dans une ligne, séparés par un espace, la couleur en valeur hexadécimale (16 caractères) et le nombre de pixels pour la largeur / hauteur, par exemple:
La taille du fichier est de 832 octets. L'image de taille maximale (n = 999) avec la même couleur a 6834 octets (bien en dessous de 10 Mo).
La solution utilise deux bibliothèques:
use Digest::CRC crc32;
pour les valeurs CRC32 aux extrémités du bloc.use IO::Compress::Deflate deflate;
pour compresser les données d'image.Les deux bibliothèques ne sont pas liées aux images.
Non golfé:
Modifications
use IO::Compress::Deflate':all';
est remplacé paruse Compress::Zlib;
. Ce dernier exporte la fonction de dégonflagecompress
par défaut. La fonction n'a pas besoin de références comme arguments et renvoie également le résultat directement. Cela permet de se débarrasser des variables$o
.Merci pour la réponse de Michael :
Fonction
k
: Un appel depack
pourrait être supprimé en utilisant un modèleNa*N
pour le premierpack
de la fonction.pack
modèleNNCV
avec quatre valeurs optimiseNNC3n
avec six valeurs.Merci pour le commentaire de VadimR avec beaucoup de conseils:
use String::CRC32;
est plus court queuse Digest::CRC crc32;
.y///c-4
est plus court que-4+y///c
.CH*
avec la répétition dans la valeur.$i
en utilisant une référence de valeur.-p
) avec une correspondance avec le séparateur d'espace/ /
. Ensuite, la première option est entrée$`
et le deuxième argument est entré$'
.-p
imprime également automatiquement$_
."\cZ"
est plus court que"\x1a"
.Meilleure compression
Au prix de la taille du code, les données d'image peuvent être encore compressées si un filtrage est appliqué.
Taille de fichier non filtrée pour
FFFF0FF
200
: 832 octetsFiltre
Sub
(différences de pixels horizontales): 560 octetsFiltre
Sub
pour la première ligne etUp
pour les lignes restantes: 590 octetsPremière ligne non filtrée, puis filtre
Up
: 586 octetsCompress::Zlib
Peut également être réglé; le niveau de compression le plus élevé peut être défini par une option supplémentaire pour le niveau de compression en fonctioncompress
au prix de deux octets:La taille de fichier de l'exemple
yellow200.png
sans filtrage passe de 832 octets à 472 octets. Appliquée à l'exemple avecSub
filtre, la taille du fichier passe de 560 octets à 445 octets (pngcrush -brute
impossible de compresser davantage).la source
-p
. En plus des informations contenues dans la réponse de Michael (NA*N
et lesNNCV
modèles), - lesString::CRC32
exportations par défauty///c-4
sont OK, leCH*
modèle$i
est parti\cZ
, les mots nus sont OK-p
et/ /;
placent les arguments en prématch et postmatch. Je me demande si j'ai raté quelque chose et que le score peut descendre en dessous de 200 :)use Compress::Zlib;
PHP 214
Je ne suis pas un expert en PHP, il y a de la place pour le golf. Les pourboires sont les bienvenus.
Générez un fichier PNG:
Générez un flux base64 (collez le résultat dans la barre d'adresse de votre navigateur)
Version non golfée:
la source
Python, 252 octets
Ce script prend l'entrée d'argv. Exécutez ce script à partir de la ligne de commande, comme
python 27086.py deadbeef 999
la source