Che colore è questo?


9

Devi giocare a golf un programma che prenderà un nome file come input e devi produrre il colore del file.

Il file avrà una di queste estensioni ma il tuo programma deve supportarne solo una. Per favore, dì quale nella tua risposta.

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

E ora al layout classico.

Ingresso

Un nome file con una delle estensioni sopra.

Puoi anche prendere un oggetto immagine o un'immagine già codificata.

Produzione

L'unico colore in quel file come codice esadecimale a 6 cifre con un optional che porta #ad esempio #000000è nero.

Puoi anche generare un elenco / tupla / stringa contenente i valori decimali o esadecimali del colore RGB, con un delimitatore chiaro, non numerico, ad es. , |Ecc.

Non è possibile generare la trasparenza.

Se il file non è di un solo colore, è necessario generare un valore errato che non lo è #000000e terminare senza stampare nulla su STDERR. Questo è così che non puoi semplicemente aprire il file e ottenere il valore RGB del primo pixel.

Regole

  • Il codice esadecimale deve essere emesso solo se il file è di un solo colore.
  • Il file sarà 500x500pixel
  • I pixel avranno tutti una trasparenza dello 0%.
  • Questo è quindi vince il codice più corto!

Esempi


7
Il file non essendo tutto a un colore sembra una complicazione inutile per me. E un valore falso in linguaggi fortemente tipizzati, ad esempio C #, può essere solo a bool. Per questo caso ritornerei a stringper il caso normale e boolper il caso non normale, racchiuso in un object. Va bene o posso restituire una stringa vuota o simile?
TheLethalCoder

5
Inoltre suggerisco di caricare le tue immagini su i.stack.imgur.com (il mio programma non è in grado di estrarre l'immagine da pasteboard)
user41805,

1
Abbiamo uno standard predefinito per l'input di immagini, puoi trovarlo sul nostro meta qui . Non è significativamente diverso da quello che hai, ma potresti voler collegarti ad esso invece di quello fornito.
Pavel,

6
@Ilikemydog Importa. Dire che l'output è "L'unico colore in quel file" porta i rispondenti ad assumere che l'immagine conterrà un singolo colore. Quindi le regole lo contraddicono. D'altra parte, sarebbe molto più chiaro se la sezione di output leggesse qualcosa del tipo "L'unico colore in quel file, o un valore errato diverso da ... se l'immagine contiene più di un colore". Oppure, come ha giustamente affermato xnor, è confuso quando il corpo della sfida dice una cosa, ma una parte successiva ne dice un'altra
Luis Mendo,

2
Supponiamo che tutti i file siano sempre file RGB a 3 canali (8 bit ciascuno)?
Polpo,

Risposte:


6

MATL , 15 12 byte

Yi6Bed~?2MYm

Testato con le immagini ".png" fornite nella sfida. Probabilmente funziona anche con altre estensioni. L'input può essere un nome file o un URL dell'immagine.

L'output è valori decimali R, G, B separati da spazi o la stringa vuota (che è falsa) se sono presenti più colori.

Esempio con il primo e l'ultimo caso di test:

inserisci qui la descrizione dell'immagine

Spiegazione

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

Questo ha il controllo per l'immagine falsa?
TheLethalCoder

1
@TheLethalCoder Risolto. Grazie per l'heads-up
Luis Mendo,

You may also take an image object or already encoded image instead.L'OP aggiornato potrebbe essere in grado di salvare byte ...
TheLethalCoder

@TheLethalCoder Grazie. Non credo che aiuti in questa risposta, a meno che non potessi inserire M×N×3direttamente l' array, il che probabilmente non è ciò che significa OP
Luis Mendo,

1
12 byte ?! Bene, santo inferno!
Shaggy,

4

Bash + core-utils + Imagemagick, 60

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

Emette il colore se c'è un colore e niente se c'è più di un colore.

  • convert $1 txt: legge il file di input e l'output come file di testo, in particolare in questo formato:
# Enumerazione pixel 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 -uk3ordina in modo univoco in base alla terza colonna. Questo output è assegnato a un arraya

  • ((${#a[@]}-9)) verifica se la matrice NON ha lunghezza 9

  • se la matrice NON ha lunghezza 9 (ovvero ha lunghezza 9), quindi emettere l'elemento 2 (basato su 0) che sarà il colore unico.


1
Oh mio Dio, è impressionante.
MD XF,

4

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

Controllando che tutti i pixel fossero identici, sono stati aggiunti molti byte. Fino a non essere molto più grande di quando stavo solo controllando il colore del primo pixel - contento di questo :)

Prende l'URL (assoluto, relativo, dati o qualsiasi cosa che può essere utilizzata come il srcdi un img) del file di immagine come input. Emette il colore RGB come una stringa separata da virgola o 0per falso. Testato con file PNG ma dovrebbe funzionare anche con JPG e 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

Provalo

Richiede l'aggiunta di una chiusura >sul canvaselemento per lavorare in un frammento. Poiché l'estrazione di immagini da fonti esterne provocherebbe la generazione di un errore, i seguenti prenderanno invece gli URL di dati Base-64 come input. Rimuovi il commento dall'ultima riga per testare colori diversi usando un'immagine composta dai 4 colori di prova.

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.-> Sei sicuro di poter prendere l'immagine come stringa codificata invece di caricarla da un file?
TheLethalCoder

1
@TheLethalCoder, No! : D E, ora che lo dici, posso vedere come posso salvare qualche byte :)
Shaggy,

You may also take an image object or already encoded image instead.L'OP aggiornato potrebbe essere in grado di salvare byte ...
TheLethalCoder

@TheLethalCoder, sono stato in grado di "data:image/png;base64,"+eliminare il mio codice prendendo invece l'input come URL.
Shaggy,

3

Python 2, 80 byte

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

PIL.Image ha una funzione getcolors che restituisce Nonese il numero di colori è maggiore del parametro e restituisce un istogramma dei colori in una [(pixels, (r,g,b,a)), ...]struttura.


You may also take an image object or already encoded image instead.L'OP aggiornato potrebbe essere in grado di salvare byte ...
TheLethalCoder

@TheLethalCoder Quindi dovrei assumere un'immagine già aperta e scrivere print i and i[0][1][:3]?
Gábor Fekete,

Suppongo che avresti bisogno di chiamare i colori per
TheLethalCoder

3

Mathematica, 55 51 byte

-4 grazie a CalculatorFeline

+0 per il refactoring in piena funzionalità.

Utilizzo dell'oggetto immagine Mathematica come input - Import["filename.png"].

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

Restituisce 0 se non tutto un colore. Emette il valore decimale del colore se solo uno.

Spiegazione:

                                 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<2ed Join@@è equivalente a ~Flatten~1in questo caso. (Unisciti a una pausa se l'elenco contiene delle non liste.)
CalculatorFeline

Per impostazione predefinita, è richiesta una funzione o un programma completo. Per l'utilizzo di un oggetto immagine già decodificato, credo che dovresti ancora fare qualcosa del genereIf[Length@#==1,#,0]&@Union[ImageData@#~Flatten~1]&
Julian Wolf,

Ho frainteso il commento del PO You may also take an image object or already encoded image instead.. Si aggiorna.
Ian Miller,

@CalculatorFeline Grazie per il suggerimento Join@@.
Ian Miller,

2

Java 8+, 331 165 119 byte

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);}

-molti byte grazie a @LethalCoder per avermi aggiornato su un cambio di regola che mi ha permesso di giocare a golf molto
-46 byte grazie a @KevinCruijssen e errore di battitura fisso


You may also take an image object or already encoded image instead.L'OP aggiornato potrebbe essere in grado di salvare byte ...
TheLethalCoder

@TheLethalCoder Oh perfetto. Grazie!
HyperNeutrino,

So che è stato un po ', ma alcune cose da golf (senza cambiare la versione 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);}. Modificando la versione Java su 8+, è anche possibile passare Object f(java.awt.image.BufferedImage i)a i->. Inoltre, penso che tu abbia fatto un refuso: non dovrebbe if(i.getRGB(k,l)!=i)essere !=jinvece?
Kevin Cruijssen,

@KevinCruijssen Grazie. E sì, penso di averlo fatto: P
HyperNeutrino,

1
@HyperNeutrino Hai dimenticato di cambiarlo in Java 8 (o versione successiva). ;)
Kevin Cruijssen,

1

Python 2 , 123 85 byte

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.L'OP aggiornato potrebbe essere in grado di salvare byte ...
TheLethalCoder

Mi aspetterei dall'importazione PIL * di salvare qualche byte (o, in alternativa, importare PIL e quindi c = PIL.Image) a meno che non stia trascurando qualcosa
Foon,

@Foon PILè un'eccezione alle importazioni, non si può fare from PIL import*PIL.
Rod

Grazie; non lo sapevo o almeno lo dimenticavo
Foon,

L'incoerenza è orribile :(
CalculatorFeline

1

C #, 163 128 125 byte

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;}

Salvato 3 byte grazie a @Kevin Cruijssen.

Se non abbiamo dovuto avere il controllo aggiuntivo per l'immagine con gli stessi colori, questo è solo 55 byte:

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

So che è passato un po 'di tempo, ma: 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 byte)
Kevin Cruijssen,

0

Mathematica, 112 byte

Immagine

i = Importa @ "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.L'OP aggiornato potrebbe essere in grado di salvare byte ...
TheLethalCoder

ok. Ho apportato alcune
modifiche

L'esagono minuscolo è accettabile?
user202729,

Most@PixelValue[i, {1, 1}, "Byte"]salverà alcuni byte.
user202729,

103 byte: If[Length@Tally[a=i~ImageData~"Byte"]<2,"#"<>StringPadLeft[Most@a[[1,1]]~IntegerString~16,2,"0"],False]- usa la tua funzione ImageData. Non sapevo che esistesse.
user202729,

0

Bash + ImageMagick, 100 byte

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

Testato con .png, dovrebbe funzionare anche con gli altri formati. L'output per un'immagine policromatica è semplicemente una stringa vuota.


È possibile eliminare le virgolette dagli identificatori di formato. Inoltre ((`identify -format %k $1`-1))||è più breve di i=$(expr `identify -format "%k" $1` = 1)&&.
Trauma digitale,

0

C, 224 205 byte

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]);}

Accetta una bitmap 500x500 come argomento della riga di comando. Stampa l'RGB del file, ad esempio 255,255,255, o 0se il file non è costante. Probabilmente si arresta in modo anomalo se non viene fornito alcun file.

Punti interessanti da notare:

  • Utilizza void*al posto di FILE*per evitare di includere<stdio.h>
  • Utilizza un semplice forciclo con i%3per determinare se tutti i byte sono uguali
  • Può essere molto golfato, ho golfato 50 byte mentre scrivevo questa risposta
  • BMP memorizza i colori come BGR in modo da leggere più o meno all'indietro

0

JavaScript + HTML, 143 + 23 = 166 byte

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>

Provalo:

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>

Meno 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 byte

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

Script di test meno golfato:

$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"
}
  • Nota 1 : espressione499..0*500 significa: ripetere 500 volte un intervallo da 499 a 0
  • Nota 2 : espressione $b|% G*l $_ $y è scorciatoia per$b.GetPixel($_,$y) . Questo trucco è utile con gofing, ma rallenta il codice.

Uscita con $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:

Uscita con $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:

Spiegazione:

  • lo script crea una matrice di ciascun colore di pixel.
  • lo script si applica gu(alias per Get-Unique ) all'array di colori.
  • se il risultato di huè un singolo elemento (la proprietà rankha valore solo per un array), quindi emette il valore decimale di R, G, B di questo elemento

0

Python 2 + OpenCV + NumPy: 66 caratteri

colors.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'))

Risultato:

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

18:15 ~/colors $ 

OpenCV è in grado di leggere un'immagine e restituirla come matrice N-dimensionale. NumPy viene utilizzato per testare il primo pixel rispetto agli altri e stampare i valori RGB o vuoto.


0

PHP, 88 byte

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

la funzione anonima accetta una risorsa immagine PHP indicizzata come parametro, assume il colore nel primo slot della palette, restituisce il codice colore o 0.

programma, 96 byte

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

prende il nome del file GIF dall'argomento, stampa il codice colore o nulla. Corri con php -r '<code>' <filename.gif>.

per immagini a colori reali, 113 112 byte

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

come sopra, ma richiede un'immagine a colori reali.

programma, 122 116 byte

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

come sopra, ma richiede un file PNG.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.