De quelle couleur est-ce?


9

Vous devez jouer à un programme qui prendra un nom de fichier en entrée et vous devez afficher la couleur du fichier.

Le fichier aura n'importe laquelle de ces extensions, mais votre programme ne doit en prendre en charge qu'une seule. Veuillez dire lequel dans votre réponse.

  • .jpg
  • .png
  • .svg
  • .gif
  • .bmp

Et maintenant à la disposition classique.

Contribution

Un nom de fichier avec l'une des extensions ci-dessus.

Vous pouvez également prendre un objet image ou une image déjà encodée à la place.

Production

La seule couleur dans ce fichier comme un code hexadécimal à 6 chiffres avec une option de premier plan , #par exemple #000000est noir.

Vous pouvez également produire une liste / tuple / chaîne contenant les valeurs décimales ou hexadécimales de la couleur RVB, avec un délimiteur clair et non numérique, par exemple, , |etc.

Vous ne pouvez pas produire la transparence.

Si le fichier n'est pas d'une seule couleur, vous devez générer une valeur fausse qui ne l'est pas #000000et terminer sans imprimer quoi que ce soit STDERR. C'est ainsi que vous ne pouvez pas simplement ouvrir le fichier et obtenir la valeur RVB du premier pixel.

Règles

  • Le code hexadécimal ne doit être généré que si le fichier est d'une seule couleur.
  • Le fichier sera en 500x500pixels
  • Les pixels auront tous une transparence de 0%.
  • C'est le donc le code le plus court gagne!

Exemples


7
Le fichier n'étant pas d'une seule couleur me semble être une complication inutile. Et une valeur de falsey dans des langages fortement typés, par exemple C #, ne peut être que a bool. Pour ce cas, je retournerais un stringpour le cas normal et boolpour le cas non normal, enveloppé dans un object. Est-ce bien ou puis-je retourner une chaîne vide ou similaire?
TheLethalCoder

5
Je suggère également de télécharger vos images sur i.stack.imgur.com (mon programme ne peut pas retirer l'image du carton)
user41805

1
Nous avons un standard par défaut pour la saisie d'images, vous pouvez le trouver sur notre méta ici . Ce n'est pas très différent de ce que vous avez, mais vous voudrez peut-être vous y connecter au lieu de celui fourni.
Pavel

6
@Ilikemydog C'est important. Dire que la sortie est "la seule couleur de ce fichier" conduit les répondeurs à supposer que l'image contiendra une seule couleur. Ensuite, les règles contredisent cela. D'un autre côté, ce serait beaucoup plus clair si la section de sortie lisait quelque chose comme "La seule couleur dans ce fichier, ou une valeur fausse différente de ... si l'image contient plus d'une couleur". Ou, comme le dit si justement xnor, c'est déroutant quand le corps du défi dit une chose mais une partie ultérieure en dit une autre
Luis Mendo

2
Doit-on supposer que tous les fichiers seront toujours des fichiers RVB à 3 canaux (8 bits chacun)?
Octopus

Réponses:


6

MATL , 15 12 octets

Yi6Bed~?2MYm

Testé avec les images ".png" données dans le challenge. Cela fonctionne probablement aussi avec d'autres extensions. L'entrée peut être un nom de fichier ou une URL de l'image.

La sortie est des valeurs décimales R, G, B séparées par des espaces, ou la chaîne vide (qui est fausse) s'il y a plus d'une couleur.

Exemple avec les premier et dernier cas de test:

entrez la description de l'image ici

Explication

Yi      % Implicitly input filename. Read image as an M×N×3 array
6B      % Push [true true false] (6 in binary)
e       % Reshape. This collapses firsts two dimensions. Gives an (M*N)×3 array
d       % Consecutive diferences down each column. Gives an an (M*N-1)×3 array
~?      % If all those differences are zero (this means there is a single color)
  2M    %   Push the (M*N)×3 array again
  Ym    %   Mean of each column
        % Implicit end
        % Implicitly display

Cela a-t-il le contrôle de l'image de falsey?
TheLethalCoder

1
@TheLethalCoder résolu. Merci pour le heads-up
Luis Mendo

You may also take an image object or already encoded image instead.OP mis à jour pourrait être en mesure d'économiser des octets ...
TheLethalCoder

@TheLethalCoder Merci. Je ne pense pas que cela aide dans cette réponse, à moins que je ne puisse entrer le M×N×3tableau directement, ce qui n'est probablement pas ce que signifie l'OP
Luis Mendo

1
12 octets?! Eh bien, l'enfer!
Shaggy

4

Bash + core-utils + Imagemagick, 60

a=(`convert $1 txt:|sort -uk3`)
((${#a[@]}-9))||echo ${a[2]}

Sort la couleur s'il y a une couleur et rien s'il y a plus d'une couleur.

  • convert $1 txt: lit le fichier d'entrée et les sorties sous forme de fichier texte, spécifiquement dans ce format:
# Énumération des pixels ImageMagick: 500 500 255, srgba
0,0: (245,236,236,1) # F5ECEC srgba (245,236,236,1)
1,0: (245,236,236,1) # F5ECEC srgba (245,236,236,1)
2,0: (245,236,236,1) # F5ECEC srgba (245,236,236,1)
3,0: ​​(245,235,235,1) # F5EBEB srgba (245,235,235,1)
4,0: (245,235,235,1) # F5EBEB srgba (245,235,235,1)
  • sort -uk3trie ceci de manière unique par la troisième colonne. Cette sortie est affectée à un tableaua

  • ((${#a[@]}-9)) teste si le tableau n'a PAS de longueur 9

  • si le tableau n'a PAS une longueur 9 (c'est-à-dire qu'il a une longueur 9), alors l'élément de sortie 2 (basé sur 0) qui sera la couleur unique.


1
Oh mon Dieu, c'est impressionnant.
MD XF

4

JavaScript (ES6) + HTML, 315 289 243 218 217 215 211 210 208 octets

Vérifier que tous les pixels étaient identiques a ajouté beaucoup d'octets. Jusqu'à ce qu'il ne soit pas beaucoup plus grand que lorsque je vérifiais juste la couleur du premier pixel - heureux avec ça :)

Prend l'URL (absolue, relative, les données ou tout ce qui peut être utilisé comme srcun img) du fichier image comme entrée. Produit la couleur RVB sous forme de chaîne séparée par des virgules ou 0pour falsey. Testé avec des fichiers PNG mais devrait également fonctionner avec JPG et GIF.

u=>(a=[...Array(c.width=c.height=500)]).map((_,x)=>a.map((_,y)=>(v=""+[(d=g.getImageData(x,y,1,1).data)[0],d[1],d[2]],h=x&y?v!=h?0:h:v)),i.src=u,(g=c.getContext`2d`).drawImage(i,0,0))&&h
<img id=i><canvas id=c

Essayez-le

Nécessite l'ajout d'une fermeture >sur l' canvasélément afin de travailler dans un extrait de code. Étant donné que l'extraction d'images à partir de sources externes entraînerait une erreur, les éléments suivants prendront à la place les URL de données Base-64 en entrée. Décommentez la dernière ligne pour tester différentes couleurs en utilisant une image composée des 4 couleurs de test.

f=
u=>(a=[...Array(c.width=c.height=500)]).map((_,x)=>a.map((_,y)=>(v=""+[(d=g.getImageData(x,y,1,1).data)[0],d[1],d[2]],h=x&y?v!=h?0:h:v)),i.src=u,(g=c.getContext`2d`).drawImage(i,0,0))&&h
console.log(f("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAH0AQMAAADxGE3JAAAAA1BMVEUWwpMvG5UqAAAANUlEQVR42u3BMQEAAADCIPun9lkMYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5fQAAASJ0bysAAAAASUVORK5CYII"))
//console.log(f("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAH0AgMAAAC2uDcZAAAADFBMVEWLFsIWwpOVkJCE8Az9F2TyAAABB0lEQVR42uzNIQEAMAwDsEk8ucmTS9xElAwkBlI3cipit9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91uX72/yO+I3W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdPhu1fdT2UdtHbR+1fdT2UdsHs+0AqVGfBnNZ7+UAAAAASUVORK5CYII"))
<img id=i><canvas id=c>


A filename with one of the above extensions.-> Vous êtes sûr de pouvoir prendre l'image comme une chaîne encodée au lieu de la charger depuis un fichier?
TheLethalCoder

1
@TheLethalCoder, non! : D Et, maintenant que vous le dites, je peux voir comment je peux économiser quelques octets :)
Shaggy

You may also take an image object or already encoded image instead.OP mis à jour pourrait être en mesure d'économiser des octets ...
TheLethalCoder

@TheLethalCoder, j'ai pu couper "data:image/png;base64,"+mon code en prenant plutôt la saisie comme URL.
Shaggy

3

Python 2, 80 octets

from PIL import Image
i=Image.open(input()).getcolors(1)
print i and i[0][1][:3]

PIL.Image a une fonction getcolors qui renvoie Nonesi le nombre de couleurs est supérieur au paramètre et renvoie un histogramme des couleurs dans une [(pixels, (r,g,b,a)), ...]structure.


You may also take an image object or already encoded image instead.OP mis à jour pourrait être en mesure d'économiser des octets ...
TheLethalCoder

@TheLethalCoder Alors je devrais supposer une image déjà ouverte et simplement écrire print i and i[0][1][:3]?
Gábor Fekete

Je suppose que vous auriez besoin de l'appel de couleurs
TheLethalCoder

3

Mathematica, 55 51 octets

-4 grâce à CalculatorFeline

+0 pour le refactoring en fonction complète.

Utilisation de l'objet image Mathematica comme entrée - Import["filename.png"].

If[Length@#==1,#,0]&@Union[Join@@ImageData@#]&

Renvoie 0 sinon toutes une couleur. Génère la valeur décimale de la couleur si elle est unique.

Explication:

                                 ImageData@# & - Convert input into 2D array of RGB values
                           Join@@              - Join the array into 1D array f RGB values
                     Union[                 ]  - Union all the RGB values
   Length@#        &@                          - Find length of the union of arrays
If[        ==1,#,0]                            - Check if its 1, return it if true, return 0 if not

a==1== a<2et Join@@est équivalent à ~Flatten~1dans ce cas. (Rejoignez les pauses si la liste contient des non-listes.)
CalculatorFeline

Par défaut, une fonction ou un programme complet est requis. Pour utiliser un objet image déjà décodé, je pense que vous auriez encore besoin de faire quelque chose commeIf[Length@#==1,#,0]&@Union[ImageData@#~Flatten~1]&
Julian Wolf

J'ai mal interprété le commentaire du PO You may also take an image object or already encoded image instead.. Mettra à jour.
Ian Miller

@CalculatorFeline Merci pour un indice sur Join@@.
Ian Miller

2

Java 8+, 331 165 119 octets

i->{Integer j=i.getRGB(0,0),k=500,l;for(;k-->0;)for(l=500;l-->0;)if(i.getRGB(k,l)!=j)return"";return j.toHexString(j);}

-un grand nombre d'octets grâce à @LethalCoder pour m'avoir mis à jour sur un changement de règle qui a permis beaucoup de golf
-46 octets grâce à @KevinCruijssen et une faute de frappe corrigée


You may also take an image object or already encoded image instead.OP mis à jour pourrait être en mesure d'économiser des octets ...
TheLethalCoder

@TheLethalCoder Oh parfait. Merci!
HyperNeutrino

Je sais que ça fait un certain temps, mais certaines choses au golf (sans changer la version Java 7): Object f(java.awt.image.BufferedImage i){Integer j=i.getRGB(0,0),k=500,l;for(;k-->0;)for(l=500;l-->0;)if(i.getRGB(k,l)!=i)return"";return j.toHexString(j);}. En changeant la version Java en 8+, vous pouvez également passer Object f(java.awt.image.BufferedImage i)à i->. De plus, je pense que vous avez fait une faute de frappe: ne devrait pas if(i.getRGB(k,l)!=i)être à la !=jplace?
Kevin Cruijssen

@KevinCruijssen Merci. Et oui, je pense que je l'ai fait: P
HyperNeutrino

1
@HyperNeutrino Vous avez oublié de le changer en Java 8 (ou supérieur). ;)
Kevin Cruijssen

1

Python 2 , 123 85 octets

from PIL import Image
c=Image.open(input()).getdata()
print len(set(c))<2and c[0][:3]

You may also take an image object or already encoded image instead.OP mis à jour pourrait être en mesure d'économiser des octets ...
TheLethalCoder

Je m'attendrais à ce que l'importation PIL * enregistre quelques octets (ou bien, importez PIL puis c = PIL.Image) à moins que je ne néglige quelque chose
Foon

@Foon PILest une exception aux importations, vous ne pouvez pas le faire from PIL import*non plusPIL.
Rod

Merci; ne le savait pas ou du moins l'a oublié
Foon

L'incohérence est horrible :(
CalculatorFeline

1

C #, 163 128 125 octets

b=>{var c=b.GetPixel(0,0);for(int w=500,h;w-->0;)for(h=500;h-->0;)if(b.GetPixel(w,h)!=c)return"";return c.R+" "+c.G+" "+c.B;}

Enregistré 3 octets grâce à @Kevin Cruijssen.

Si nous n'avions pas à effectuer le contrôle supplémentaire pour que l'image soit de la même couleur, cela ne représente que 55 octets:

b=>{var c=b.GetPixel(0,0);return c.R+" "+c.G+" "+c.B;};

Je sais que ça fait un moment, mais: b=>{var c=b.GetPixel(0,0);for(int w=500,h;w-->0;)for(h=500;h-->0;)if(b.GetPixel(w,h)!=c)return"";return c.R+" "+c.G+" "+c.B;}(-3 octets)
Kevin Cruijssen

0

Mathematica, 112 octets

image

i = Importer @ "c: \ a.png";

If[Length@DominantColors@i==1,"#"<>StringPadLeft[IntegerString[Most@PixelValue[i,{1,1},"Byte"],16],2,"0"],False]

You may also take an image object or already encoded image instead.OP mis à jour pourrait être en mesure d'économiser des octets ...
TheLethalCoder

D'accord. J'ai apporté quelques
modifications.Merci

L'hex en minuscule est-il acceptable?
user202729

Most@PixelValue[i, {1, 1}, "Byte"]sauvera quelques octets.
user202729

103 octets: If[Length@Tally[a=i~ImageData~"Byte"]<2,"#"<>StringPadLeft[Most@a[[1,1]]~IntegerString~16,2,"0"],False]- utilisez votre fonction ImageData. Je ne savais pas que ça existait.
user202729

0

Bash + ImageMagick, 100 octets

i=$(expr `identify -format "%k" $1` = 1)&&convert $1 -format "%c" histogram:info:-|grep -o "#......"

Testé avec .png, devrait également fonctionner avec les autres formats. La sortie pour une image polychromatique est simplement une chaîne vide.


Vous pouvez supprimer les guillemets autour des spécificateurs de format. Est également ((`identify -format %k $1`-1))||plus court que i=$(expr `identify -format "%k" $1` = 1)&&.
Digital Trauma

0

C, 224 205 octets

m[3],i;
main(c,v)char**v;{
void*s=fopen(v[1],"r");
for(;i<54;i++)getc(s);
m[2]=getc(s);m[1]=getc(s);*m=getc(s);
for(i=0;i<500*500;i++)if((c=getc(s))!=m[i%3]&&~c)exit(puts("0"));
printf("%d,%d,%d",*m,m[1],m[2]);}

Prend un bitmap 500x500 comme argument de ligne de commande. Imprime le RVB du fichier, par exemple 255,255,255, ou 0si le fichier n'est pas constant. Se bloque probablement mal si aucun fichier n'est fourni.

Points intéressants à noter:

  • Utilisations void*à la place de FILE*pour éviter d'inclure<stdio.h>
  • Utilise une forboucle simple avec i%3pour déterminer si tous les octets sont identiques
  • Peut être très golfé, j'ai joué 50 octets en écrivant cette réponse
  • BMP stocke les couleurs sous forme de BGR pour une lecture plus / moins en arrière

0

JavaScript + HTML, 143 + 23 = 166 octets

u=>(i.src=u,s=C.width=C.height=500,c=C.getContext`2d`,c.drawImage(i,0,0),d=c.getImageData(0,0,s,s).data,!d.some((n,i)=>n-d[i%4])&&d.slice(0,3))
<img id=i><canvas id=C>

Essayez-le:

f=
u=>(i.src=u,s=C.width=C.height=500,c=C.getContext`2d`,c.drawImage(i,0,0),d=c.getImageData(0,0,s,s).data,!d.some((n,i)=>n-d[i%4])&&d.slice(0,3))

console.log(
    f('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAH0AQMAAADxGE3JAAAAA1BMVEUWwpMvG5UqAAAANUlEQVR42u3BMQEAAADCIPun9lkMYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5fQAAASJ0bysAAAAASUVORK5CYII'),
    f('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAH0AgMAAAC2uDcZAAAADFBMVEWLFsIWwpOVkJCE8Az9F2TyAAABB0lEQVR42uzNIQEAMAwDsEk8ucmTS9xElAwkBlI3cipit9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91uX72/yO+I3W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdPhu1fdT2UdtHbR+1fdT2UdsHs+0AqVGfBnNZ7+UAAAAASUVORK5CYII')
)
<img id=i><canvas id=C>

Moins golfé:

u => {
    i.src = u
    s = C.width = C.height = 500
    c = C.getContext('2d')
    c.drawImage(i, 0, 0)
    d = c.getImageData(0, 0, s, s).data
    return d.every((n,i) => n == d[i % 4]) && d.slice(0,3)
}

0

PowerShell, 79 octets

param($b)if(!($c=499..0*500|%{$b|% G*l $_ $y;$y+=!$_}|gu).Rank){$c.R;$c.G;$c.B}

Script de test moins golfé:

$f = {

    param($b)
    $c=499..0*500|%{$b.GetPixel($_,$y);$y+=!$_}|gu
    if(!$c.Rank){
        $c.R;$c.G;$c.B
    }

}

@(
    ,("22 194 147", "https://cdn.pbrd.co/images/8bawQk5kM.png")
    ,("139 22 194", "https://cdn.pbrd.co/images/8b9foR0H6.png")
    ,("149 144 144","https://cdn.pbrd.co/images/8baglmIE8.png")
    ,("132 240 12", "https://cdn.pbrd.co/images/8b9Uhhovn.png")
    ,("",           "https://cdn.pbrd.co/images/8bb4DeKx3.png")

) | % {
    $expected,$s = $_

    $binData = [System.Net.WebClient]::new().DownloadData($s)
    $memoryStream = [System.IO.MemoryStream]::new($binData)
    $bitmap = [System.Drawing.Bitmap]::FromStream($memoryStream)

    $sw = [System.Diagnostics.Stopwatch]::StartNew()
    $result = &$f $bitmap
    "$("$result"-eq$expected): $($sw.Elapsed): $result"
}
  • Remarque 1 : l'expression 499..0*500signifie: répéter 500 fois une plage de 499 à 0
  • Remarque 2 : l'expression $b|% G*l $_ $y est un raccourci pour $b.GetPixel($_,$y). Cette astuce est utile avec gofing, mais elle ralentit le code.

Sortie avec $b|% G*l $_ $y:

True: 00:01:45.4904622: 22 194 147
True: 00:01:56.4208157: 139 22 194
True: 00:01:46.7629439: 149 144 144
True: 00:01:48.1999005: 132 240 12
True: 00:01:55.8579935:

Sortie avec $b.GetPixel($_,$y):

True: 00:00:05.7637937: 22 194 147
True: 00:00:06.8743244: 139 22 194
True: 00:00:08.7456055: 149 144 144
True: 00:00:08.5942450: 132 240 12
True: 00:00:06.6495706:

Explication:

  • le script crée un tableau de chaque couleur de pixel.
  • le script s'applique gu(alias pour Get-Unique ) au tableau de couleurs.
  • si le résultat de huest un seul élément (la propriété rankn'a de valeur que pour un tableau), alors affichez la valeur décimale R, G, B de cet élément

0

Python 2 + OpenCV + NumPy: 66 caractères

colours.py

import numpy as N
def c(i):p=i[0,0];print(p[::-1],"")[N.any(i-p)]

test.py

import cv2
from colors import c

c(cv2.imread('16C293.png'))
c(cv2.imread('84F00C.png'))
c(cv2.imread('8B16C2.png'))
c(cv2.imread('959090.png'))
c(cv2.imread('falsy.png'))

Résultat:

18:14 ~/colors $ python test.py
[ 22 194 147]
[132 240  12]
[139  22 194]
[149 144 144]

18:15 ~/colors $ 

OpenCV est capable de lire une image et de la renvoyer sous forme de tableau à N dimensions. NumPy est utilisé pour tester le premier pixel contre les autres et imprimer les valeurs RVB ou vide.


0

PHP, 88 octets

function($i){return~-imagecolorstotal($i)?0:sprintf("#%06x",imagecolorsforindex($i,0));}

La fonction anonyme prend une ressource d'image PHP indexée comme paramètre, suppose la couleur dans le premier emplacement de palette, retourne le code de couleur ou 0.

programme, 96 octets

imagecolorstotal($i=imagecreatefromgif($argv[1]))-1||sprintf("#%06x",imagecolorsforindex($i,0));

prend le nom du fichier GIF de l'argument, imprime le code couleur ou rien. Courez avec php -r '<code>' <filename.gif>.

pour des images en vraies couleurs, 113 112 octets

function($i){for(;$p<25e4;$p++)$r[$c=imagecolorat($i,$p%500,$p/500)]=1;return~-count($r)?0:sprintf("#%06x",$c);}

comme ci-dessus, mais nécessite une image en vraies couleurs.

programme, 122 116 octets

for(;$p<25e4;$p++)$r[$c=imagecolorat(imagecreatefrompng($argv[1]),$p%500,$p/500)]=1;count($r)-1||printf("#%06x",$c);

comme ci-dessus, mais nécessite un fichier PNG.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.