Votre tâche consiste à créer un programme qui, à partir d’une image d’entrée, crée une image de sortie de la même taille, dans laquelle tous les pixels sont classés par valeur hexadécimale.
Votre programme peut:
- Triez les pixels de gauche à droite et ensuite vers le bas ou commencez par les colonnes puis par la droite. Dans tous les cas, le pixel en haut à gauche est le plus petit et le coin en bas à droite est le plus grand.
- Utilisez la transparence, mais ce n'est pas obligatoire.
- Triez par RVB, mais vous pouvez utiliser CMJ ou tout autre format avec au moins 3 valeurs. Vous pouvez choisir les valeurs à trier. (HSV peut donner de belles images)
- Utilisez n’importe quel format d’image connu que la plupart des ordinateurs peuvent ouvrir.
Règles:
- La sortie doit être écrite sur le disque ou raccordée à un fichier.
- L'entrée est donnée sous forme d'argument de ligne de commande, sous la forme d'un chemin relatif à l'image ou acheminé depuis la ligne de commande.
- C'est le code de golf, donc le code le plus court en octets gagne!
Réponses:
Pyth - 10 octets
Lit les images, réduit les images, trie, puis sépare à nouveau les images, puis écrit.
Ne fonctionne pas en ligne pour des raisons évidentes. Prend l'entrée en tant que chemin relatif au fichier image et en génère le résultat
o.png
.Sortie du gothique américain:
la source
JavaScript (ES6),
383377354 octetsDémo exécutable:
Afficher l'extrait de code
Comment fonctionne ce code est d'utiliser
getImageData
pour obtenir un tableau de la formeEt
map
cela à un tableau de la formeAinsi, les valeurs R sont mappées sur les tableaux de l'ensemble RGBA et les valeurs B, G et A se transforment en tableaux de valeurs minimales nuls. Lorsque nous trions ce tableau, tous les
[0,0,0,0]
tableaux sont classés en bas et les tableaux de valeurs réelles, normalement en haut:Nous parcourons le quart supérieur du tableau (pour perdre les valeurs vides que nous avons créées), l'aplatissons avec
[].concat.apply
et un tableau de la première forme, mais cette fois, il est trié.Légèrement défiguré avec des espaces et des commentaires:
Notez que la plupart des navigateurs peuvent ne pas exécuter ce code pour les images volumineuses, car il transmet un grand nombre d'arguments
[].concat
. Lorsque l'environnement du navigateur n'autorise pas suffisamment de mémoire pour tous les arguments, une autre approche consiste à réaffecter les valeurs RGBA des quatrièmes premiers tableaux au tableau, pour un score total de 361 octets :Nous remplaçons simplement le
[].concat(...{stuff}).slice(12*w*h)
avec{stuff}.map((v,i,A)=>A[3*w*h+(i>>2)][i%4])
.)la source
concat.apply
appel fournit trop d'arguments àconcat
et le moteur JS le rejette.D:
Merci! Je vais arranger ça et noter les deux partitions. (Et je suis heureux de pouvoir aider!)Mathematica
86 8372 octetsAvec 14 octets sauvegardés grâce à @Martin Buttner.
Exemple
L'image elle-même est entrée. Alternativement, une variable contenant l'image pourrait être utilisée.
la source
ImageData
etArrayReshape
pourrait utiliser la notation infixe.Flatten
est assez long pour sauvegarder quelques octets en l’affectant àf
. Et avez-vous réellement besoin"Byte"
? Par défaut, les valeurs de canal ne[0,1]
seraient -elles pas simplement dimensionnées de manière à ce que le tri et la reconstruction des images fonctionnent toujours correctement?Javascript ES6, 334 octets
Ungolfed:
la source
appendChild
retourne son argument. Très utile! Vous m'avez inspiré de réduire mon entrée de 377 à 354, mais je ne peux pas battre le vôtre :). (Quand j'utilise votreappendChild
chaîne etwith
technique technique, je peux le réduire à 347, mais il en reste 13!) Excellent travail!C (utilisant SDL1.2),
333322315 octetsC n’est probablement pas le «couteau le plus tranchant de l’étagère» pour ce genre de travail, j’ai voulu essayer quand même. Les astuces pour améliorer ma réponse sont les bienvenues. Le programme obtient le nom du fichier image d'entrée en tant qu'argument cli.
compiler et exécuter:
gcc -I/usr/include/SDL snippet.c -lSDL -lSDL_image && ./a.out
Je ne joue généralement pas au C, mais je viens de répondre. relever ce défi joue hier et je voulais juste continuer à jouer avec ce nouveau jouet :)
merci à @ pseudonym117 de m'avoir aidé à économiser 5 octets
la source
while
à la finfor(;;SDL_Flip(s));
, et je crois que vous pouvez omettreint
la méthodeC
et en économiser 4 de plus.JavaScript (ES6), 452
480484487511octetsWow, cela a pris plus de temps que prévu:
La fonction prend une URL en entrée
f('test.jpg');
et dessine le résultat dans uncanvas
élément qui est ajouté à l'élément.body
.Notez que la source doit être sur le même domaine ou le script s’arrêtera avec un problème de sécurité.
Limites
Je l'ai testé sous Firefox 42 sous OS X (10.10) sur un ordinateur doté de 2,5 GHz i7 et de 16 Go de RAM. La taille d'image maximale que je pouvais traiter sans que Firefox ne demande à continuer l'exécution du script était de 1600 x 1932 px .
Ungolfed
Sortie
Pour une meilleure comparaison, j'ai également pris le " gothique américain " comme exemple:
Édite
for (a in b)
au lieu defor(;;)
. Merci à ar34zdocument
dans une variable.()
.()
création d'objet lors de la suppression d'un autre couple redondant()
. Merci à apsillers .for
-loop qui récupère les couleurs de chaque pixel.la source
for(k in t)
ce qui économisera quelques octets supplémentaires :)()
ennew Image()
; utiliser des chaînes de modèles étiquetés pour vos arguments de chaîne (createElement`canvas`
,getContext`2d`
), n'utilisez pas de parenthèses pour les paramètres de fonction flèche unique (il suffit de le fairef=u=>{...}
; les parenthèses ne concernent que les fonctions de flèche à paramètres multiples ou à paramètres zéro). Vous pouvez également avoir une ou deuxfor
boucles à une seule instruction avec des crochets, ce qui n'est pas nécessaire.i.onload=$=>...
au lieu dei.onload=()=>...
)for(l in u)f.push(u[l]);
peut devenirfor(z of u)f.push(z);
:)
. -for(u of t)for(z of u)f.push(z)
est assez court, mais on peut le raccourcir davantaget.map(u=>u.map(z=>f.push(z)))
. Dans beaucoup de cas, utiliser.map
ou.some
avec une fonction flèche sera plus court que d'utiliser unefor
boucle. Si vous voulez devenir vraiment fou, vous pouvez économiser encore plus ici avect.map(u=>f.push.apply(f,u));
ce qui suit: "Pour chaque tableauu
danst
, fournissezu
une liste d'arguments àf.push
viaapply
(carpush
peut accepter un nombre illimité d'arguments et les met dans l'ordre).Bash + utilitaires GNU, 80
Cela suppose que le format d'entrée / sortie est au format .txt d'énumération de pixels ImageMagick. L'entrée est passée en tant que nom de fichier et la sortie passe à STDOUT.
Si ce qui précède n'est pas considéré comme un format d'image bien connu, nous pouvons ajouter les conversions nécessaires:
Bash + utilitaires GNU + ImageMagick, 108
L'entrée et la sortie sont spécifiées en tant que noms de fichiers. ImageMagick détermine les formats de fichiers à utiliser en fonction des extensions de fichiers transmises. Nous pouvons donc utiliser les formats les plus courants:
Le o.png résultant ressemble à ceci:
la source
Python 2, 128 octets
À condition que l'image soit un fichier nommé
a
sans extension, la sortie sera un fichier nomméb
sans extension.la source
a.putdata(sorted(b[f/c,f%d]for f in range(d*c)))
(je viens de me réveiller, alors j'ai peut-être mélangé les variables).Java, 316 octets
Place les valeurs hexadécimales des couleurs de pixel dans un tableau. Le tableau est trié et les couleurs sont remappées sur les pixels de l'image. Le nom de l'image résultante est
a.png
.la source
SmileBASIC,
3935 octetsEn supposant que l'image soit chargée sur la page graphique 512 * 512:
A expliqué:
C'est si simple!
Malheureusement, nous devons utiliser des entiers, ce qui ajoute 4 octets à la taille du programme en raison des suffixes de type.la source
SYS/DEFSP.GRP
met unFF000000
en haut à gauche et un00101010
en bas à droite, ce qui est le contraire apparent de la question. Utiliser des flotteurs met00000000
en haut à gauche etFFF8F8F8
en bas à droite, ce qui est correct. (Bien sûr, cela traite les couleurs hexadécimales comme des canaux non signés / supérieurs, ce qui est probablement correct.)0xFF000000
est plus petit que0x00101010
) mais de toute façon, je ne suis pas sûr de savoir pourquoi j'ai utilisé des entiers ici ... À l'époque, je ne comprenais pas comment GLOAD utilisait des valeurs non signées lorsque vous utilisiez un tableau flottant, et supposais simplement que cela ne fonctionnait pas.Java,
424417404 octetsEh bien, ce n'est pas une langue dans laquelle vous voulez jouer au golf ...
la source
C #, 497 octets
Premier post, premier golf. Ce n'est clairement pas le meilleur pour le golf
Pas vraiment respecter la tuyauterie. Prend un chemin d’image en tant qu’entrée et le sort avec la lettre "o" précédée du nom.
Fonctionne mieux avec les bitmaps, les résultats de cotes avec les autres
la source
Haskell, 195 octets
Cela utilise la
GD
bibliothèque. Utilisationf <filename>
. Le fichier d'entrée doit être aupng
format. Le fichier de sortie est nomméo
.Comment ça marche: simple, c'est-à-dire lire l'image, parcourir toutes les coordonnées et obtenir les pixels, trier les pixels, repasser sur les coordonnées, mais cette fois, réglez les pixels dans l'ordre dans lequel ils apparaissent dans la liste triée, écrivez le fichier disque.
la source