Que cor é esta?

9

Você deve jogar um programa que terá como entrada um nome de arquivo e deverá exibir a cor do arquivo.

O arquivo terá qualquer uma dessas extensões, mas seu programa precisa apenas suportar uma. Diga qual deles em sua resposta.

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

E agora para o layout clássico.

Entrada

Um nome de arquivo com uma das extensões acima.

Você também pode pegar um objeto de imagem ou uma imagem já codificada.

Resultado

A única cor no arquivo como um código hexadecimal de 6 dígitos com um opcional líder #por exemplo, #000000é preto.

Você também pode enviar uma lista / tupla / string contendo os valores decimais ou hexadecimais da cor RGB, com um delimitador claro e não numérico, por exemplo, , |etc.

Você pode não exibir a transparência.

Se o arquivo não tiver apenas uma cor, você deverá gerar um valor falso #000000e não terminar, sem imprimir nada STDERR. Isso é para que você não possa simplesmente abrir o arquivo e obter o valor RGB do primeiro pixel.

Regras

  • O código hexadecimal precisa ser gerado apenas se o arquivo tiver uma cor.
  • O arquivo será 500x500pixels
  • Todos os pixels terão 0% de transparência.
  • Isso é então o código mais curto vence!

Exemplos

caird coinheringaahing
fonte
7
O arquivo não sendo de uma cor só me parece uma complicação desnecessária. E um valor de falsey em idiomas fortemente tipados, por exemplo, C #, só pode ser a bool. Nesse caso, eu retornaria um stringpara o caso normal e boolpara o caso não normal, envolto em um object. Isso está bom ou posso retornar uma string vazia ou similar?
TheLethalCoder
5
Também sugiro o upload de suas imagens para i.stack.imgur.com (meu programa não é possível obter a imagem fora de papelão)
user41805
11
Temos um padrão padrão para entrada de imagem, você pode encontrá-lo em nossa meta aqui . Não é significativamente diferente do que você possui, mas convém vincular a ele em vez do fornecido.
Pavel
6
@Ilikemydog Isso importa. Dizer que a saída é "A única cor nesse arquivo" leva os respondentes a supor que a imagem conterá uma única cor. Então as regras contradizem isso. Por outro lado, seria muito mais claro se a seção de saída tivesse algo como "A única cor nesse arquivo ou um valor falso falso diferente de ... se a imagem contiver mais de uma cor". Ou, como xnor colocou de maneira tão apropriada, é confuso quando o corpo do desafio diz uma coisa, mas uma parte posterior diz outra
Luis Mendo
2
Devemos assumir que todos os arquivos serão sempre arquivos RGB de 3 canais (8 bits cada)?
Octopus

Respostas:

6

MATL , 15 12 bytes

Yi6Bed~?2MYm

Testado com as imagens ".png" apresentadas no desafio. Provavelmente também funciona com outras extensões. A entrada pode ser um nome de arquivo ou um URL da imagem.

A saída é valores decimais R, G, B separados por espaços ou a sequência vazia (que é falsa) se houver mais de uma cor.

Exemplo com o primeiro e o último casos de teste:

insira a descrição da imagem aqui

Explicação

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
Luis Mendo
fonte
Isso tem a verificação da imagem falsey?
TheLethalCoder
11
@TheLethalCoder Solved. Obrigado pelo alerta
Luis Mendo
You may also take an image object or already encoded image instead.OP atualizado pode ser capaz de salvar bytes ...
TheLethalCoder 26/17/17
@TheLethalCoder Thanks. Eu não acho que ele ajuda a esta resposta, a menos que eu poderia introduzir a M×N×3variedade diretamente, o que provavelmente não é o que os meios OP
Luis Mendo
11
12 bytes ?! Bem, inferno!
Shaggy
4

Bash + core-utils + Imagemagick, 60

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

Produz a cor se houver uma cor e nada se houver mais de uma cor.

  • convert $1 txt: lê o arquivo de entrada e sai como um arquivo de texto, especificamente neste formato:
# ImageMagick pixel enumeração: 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 -uk3classifica isso exclusivamente pela terceira coluna. Esta saída é atribuída a uma matriza

  • ((${#a[@]}-9)) testa se a matriz NÃO possui comprimento 9

  • se a matriz NÃO tiver comprimento 9 (ou seja, comprimento 9), em seguida, o elemento de saída 2 (baseado em 0) será a cor exclusiva.

Trauma Digital
fonte
11
Oh meu Deus, isso é impressionante.
MD XF
4

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

A verificação de que todos os pixels eram idênticos adicionou muitos bytes. Por não ser muito maior do que quando eu estava apenas verificando a cor do primeiro pixel - feliz com isso :)

Toma como URL a entrada (absoluta, relativa, dados ou qualquer coisa que possa ser usada como a srcde img) do arquivo de imagem. Emite a cor RGB como uma sequência separada por vírgula ou 0para falsey. Testado com arquivos PNG, mas também deve funcionar com 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

Tente

Requer a adição de um fechamento >no canvaselemento para trabalhar em um Snippet. Como extrair imagens de fontes externas causaria um erro, o seguinte levaria os URLs de dados da Base-64 como entrada. Remova o comentário da última linha para testar cores diferentes usando uma imagem composta pelas 4 cores de teste.

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>

Shaggy
fonte
A filename with one of the above extensions.-> Tem certeza de que pode levar a imagem como uma string codificada em vez de carregar de um arquivo?
TheLethalCoder
11
@TheLethalCoder, Não! : D E, agora que você diz isso, eu posso ver como eu posso salvar alguns bytes :)
Shaggy
You may also take an image object or already encoded image instead.OP atualizado pode ser capaz de salvar bytes ...
TheLethalCoder 26/17/17
@TheLethalCoder, eu pude extrair "data:image/png;base64,"+meu código usando a entrada como uma URL.
Shaggy
3

Python 2, 80 bytes

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

PIL.Image possui uma função getcolors que retorna Nonese o número de cores for maior que o parâmetro e retorna um histograma das cores em uma [(pixels, (r,g,b,a)), ...]estrutura.

Gábor Fekete
fonte
You may also take an image object or already encoded image instead.OP atualizado pode ser capaz de salvar bytes ...
TheLethalCoder 26/17/17
@TheLethalCoder Então, devo assumir uma imagem já aberta e apenas escrever print i and i[0][1][:3]?
Gábor Fekete
Eu diria que você precisaria a chamada cores get a
TheLethalCoder
3

Mathematica, 55 51 bytes

-4 graças a CalculatorFeline

+0 para refatorar para a função completa.

Usando o objeto de imagem do Mathematica como entrada - Import["filename.png"].

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

Retorna 0 se não todas com uma cor. Emite o valor decimal da cor, se for apenas um.

Explicação:

                                 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
Ian Miller
fonte
a==1== a<2e Join@@é equivalente a ~Flatten~1neste caso. (Join breaks se a lista contiver alguma não-lista.)
CalculatorFeline
Por padrão, é necessária uma função ou programa completo. Para usar um objeto de imagem já decodificado, eu acredito que você ainda precisa fazer algo comoIf[Length@#==1,#,0]&@Union[ImageData@#~Flatten~1]&
Julian Lobo
Interpretei mal o comentário do OP You may also take an image object or already encoded image instead.. Atualizará.
Ian Miller
@CalculatorFeline Obrigado pela dica sobre Join@@.
Ian Miller
2

Java 8+, 331 165 119 bytes

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

-muitos bytes graças a @LethalCoder por me atualizar em uma alteração de regra que permitia muito golfe
-46 bytes graças a @KevinCruijssen e erro de digitação fixo

HyperNeutrino
fonte
You may also take an image object or already encoded image instead.OP atualizado pode ser capaz de salvar bytes ...
TheLethalCoder 26/17/17
@TheLethalCoder Oh perfeito. Obrigado!
HyperNeutrino
Eu sei que tem sido um tempo, mas algumas coisas para golf (sem alterar a versão 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);}. Alterando a versão do Java para 8+, você também pode alterar Object f(java.awt.image.BufferedImage i)para i->. Além disso, acho que você cometeu um erro de digitação: não deveria if(i.getRGB(k,l)!=i)ser !=j?
Kevin Cruijssen 25/10
@KevinCruijssen Thanks. E sim, acho que sim: P
HyperNeutrino
11
@HyperNeutrino Você esqueceu de alterá-lo para Java 8 (ou superior). ;)
Kevin Cruijssen 25/10
1

Python 2 , 123 85 bytes

from PIL import Image
c=Image.open(input()).getdata()
print len(set(c))<2and c[0][:3]
Cajado
fonte
You may also take an image object or already encoded image instead.OP atualizado pode ser capaz de salvar bytes ...
TheLethalCoder 26/17/17
Eu esperaria de PIL import * para economizar alguns bytes (ou, alternativamente, PIL importação e, em seguida, c = PIL.Image) a menos que eu estou com vista algo
Foon
O @Foon PILé uma exceção às importações, você não pode fazer from PIL import*nem #PIL.
Rod Rod
Obrigado; não sabia que ou pelo menos esqueceu
Foon
A inconsistência é horrível :(
CalculatorFeline
1

C #, 163 128 125 bytes

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

Guardado 3 bytes graças a @Kevin Cruijssen.

Se não precisássemos fazer uma verificação adicional para a imagem ter as mesmas cores, são apenas 55 bytes:

b=>{var c=b.GetPixel(0,0);return c.R+" "+c.G+" "+c.B;};
TheLethalCoder
fonte
Eu sei que tem sido um tempo, mas: 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 bytes)
Kevin Cruijssen
0

Mathematica, 112 bytes

imagem

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

If[Length@DominantColors@i==1,"#"<>StringPadLeft[IntegerString[Most@PixelValue[i,{1,1},"Byte"],16],2,"0"],False]
J42161217
fonte
You may also take an image object or already encoded image instead.OP atualizado pode ser capaz de salvar bytes ...
TheLethalCoder 26/17/17
Está bem. Fiz algumas changes.thanks
J42161217
O hexágono em minúsculas é aceitável?
User202729
Most@PixelValue[i, {1, 1}, "Byte"]irá salvar alguns bytes.
User202729
103 bytes: If[Length@Tally[a=i~ImageData~"Byte"]<2,"#"<>StringPadLeft[Most@a[[1,1]]~IntegerString~16,2,"0"],False]- use sua função ImageData. Não sabia que existia.
User202729
0

Bash + ImageMagick, 100 bytes

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

Testado com .png, também deve funcionar com os outros formatos. A saída para uma imagem policromática é simplesmente uma sequência vazia.

3141
fonte
Você pode soltar as aspas em torno dos especificadores de formato. Também ((`identify -format %k $1`-1))||é mais curto que i=$(expr `identify -format "%k" $1` = 1)&&.
Digital Trauma
0

C, 224 205 bytes

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

Toma um bitmap de 500 x 500 como um argumento de linha de comando. Imprime o RGB do arquivo, por exemplo 255,255,255, ou 0se o arquivo não for constante. Provavelmente trava mal se nenhum arquivo for fornecido.

Pontos interessantes a serem observados:

  • Usos void*no lugar de FILE*para evitar incluir<stdio.h>
  • Usa um forloop simples i%3para determinar se todos os bytes são iguais
  • Pode ser muito golfista, joguei 50 bytes enquanto escrevia esta resposta
  • O BMP armazena as cores como BGR, de modo que mais / menos lê para trás
MD XF
fonte
0

JavaScript + HTML, 143 + 23 = 166 bytes

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>

Tente:

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>

Menos golfe:

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)
}
darrylyeo
fonte
0

PowerShell, 79 bytes

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

Script de teste com menos golfe:

$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 : expressão 499..0*500significa: repita 500 vezes um intervalo de 499 a 0
  • Nota 2 : a expressão $b|% G*l $_ $y é um atalho para $b.GetPixel($_,$y). Esse truque é útil com o gofing, mas reduz a velocidade do código.

Saída com $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:

Saída com $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:

Explicação:

  • o script cria uma matriz de cada cor de pixel.
  • o script se aplica gu(alias para Get-Unique ) à matriz de cores.
  • se o resultado de hufor um único elemento (a propriedade rankpossui valor apenas para uma matriz), emita o valor decimal de R, G, B deste elemento
confuso
fonte
0

Python 2 + OpenCV + NumPy: 66 caracteres

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

Resultado:

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

18:15 ~/colors $ 

O OpenCV é capaz de ler uma imagem e devolvê-la como uma matriz N-dimensional. O NumPy é usado para testar o primeiro pixel em relação aos outros e imprimir os valores RGB ou em branco.

dana
fonte
0

PHP, 88 bytes

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

A função anônima usa como parâmetro um recurso de imagem PHP indexado, assume cores no primeiro slot da paleta, retorna código de cores ou 0.

programa, 96 bytes

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

retira o nome do arquivo GIF do argumento, imprime código de cores ou nada. Corra com php -r '<code>' <filename.gif>.

para imagens em cores verdadeiras, 113 112 bytes

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

como acima, mas requer uma imagem em cores reais.

programa, 122 116 bytes

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

como acima, mas requer arquivo PNG.

Titus
fonte