¿Que color es este?

9

Debes jugar un programa de golf que tomará un nombre de archivo como entrada y debes mostrar de qué color es el archivo.

El archivo tendrá cualquiera de estas extensiones, pero su programa solo necesita admitir una. Por favor diga cuál en su respuesta.

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

Y ahora al diseño clásico.

Entrada

Un nombre de archivo con una de las extensiones anteriores.

También puede tomar un objeto de imagen o una imagen ya codificada en su lugar.

Salida

El único color en ese archivo como código hexadecimal de 6 dígitos con un encabezado opcional,# por ejemplo, #000000es negro.

También puede generar una lista / tupla / cadena que contenga los valores decimales o hexadecimales del color RGB, con un delimitador claro, no numérico, por ejemplo, , |etc.

No puede generar la transparencia.

Si el archivo no es de un solo color, debe generar un valor falso que no lo sea #000000y finalizar sin imprimir nada STDERR. Esto es para que no pueda simplemente abrir el archivo y obtener el valor RGB del primer píxel.

Reglas

  • El código hexadecimal solo se debe generar si el archivo es de un solo color.
  • El archivo será 500x500píxeles
  • Todos los píxeles tendrán 0% de transparencia.
  • Este es el código más corto gana!

Ejemplos

caird coinheringaahing
fuente
77
Todo el archivo no es de un solo color me parece una complicación innecesaria. Y un valor falsey en lenguajes fuertemente tipados, por ejemplo, C #, solo puede ser a bool. Para este caso, devolvería un stringpara el caso normal y boolpara el caso no normal, envuelto en un object. ¿Está bien o puedo devolver una cadena vacía o similar?
TheLethalCoder
55
También sugiero cargar sus imágenes en i.stack.imgur.com (mi programa no puede quitar la imagen del cartón)
user41805
1
Tenemos un estándar predeterminado para la entrada de imágenes, puede encontrarlo en nuestro meta aquí . No es significativamente diferente de lo que tiene, pero es posible que desee vincularlo en lugar del que le proporcionó.
Pavel
66
@Ilikemydog Sí importa. Decir que la salida es "El único color en ese archivo" hace que los respondedores asuman que la imagen contendrá un solo color. Entonces las reglas contradicen eso. Por otro lado, sería mucho más claro si la sección de salida dijera algo como "El único color en ese archivo, o un valor falso diferente de ... si la imagen contiene más de un color". O, como dijo Xnor tan acertadamente, es confuso cuando el cuerpo del desafío dice una cosa, pero una parte posterior dice otra
Luis Mendo
2
¿Debemos suponer que todos los archivos serán siempre archivos RGB de 3 canales (8 bits cada uno)?
Pulpo

Respuestas:

6

MATL , 15 12 bytes

Yi6Bed~?2MYm

Probado con las imágenes ".png" dadas en el desafío. Probablemente también funcione con otras extensiones. La entrada puede ser un nombre de archivo o una URL de la imagen.

La salida es valores decimales R, G, B separados por espacios, o la cadena vacía (que es falsa) si hay más de un color.

Ejemplo con el primer y último caso de prueba:

ingrese la descripción de la imagen aquí

Explicación

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
fuente
¿Tiene esto el cheque de la imagen falsey?
TheLethalCoder
1
@TheLethalCoder Resuelto. Gracias por el aviso
Luis Mendo
You may also take an image object or already encoded image instead.El OP actualizado podría guardar bytes ...
TheLethalCoder
@TheLethalCoder Gracias. No creo que ayude en esta respuesta, a menos que pueda ingresar la M×N×3matriz directamente, lo que probablemente no sea lo que significa el OP
Luis Mendo
1
¿12 bytes? Bueno, santo infierno!
Shaggy
4

Bash + core-utils + Imagemagick, 60

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

Emite el color si hay un color y nada si hay más de un color.

  • convert $1 txt: lee el archivo de entrada y las salidas como un archivo de texto, específicamente en este formato:
# ImageMagick enumeración de píxeles: 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 -uk3clasifica esto de manera única por la tercera columna. Esta salida se asigna a una matriz.a

  • ((${#a[@]}-9)) prueba si la matriz NO tiene longitud 9

  • si la matriz NO tiene una longitud 9 (es decir, tiene una longitud 9), entonces el elemento de salida 2 (basado en 0) será el color único.

Trauma digital
fuente
1
Oh, eso es impresionante.
MD XF
4

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

Al comprobar que todos los píxeles eran idénticos, se agregaron muchos bytes. A fin de cuentas, no es mucho más grande que cuando solo estaba revisando el color del primer píxel, feliz con eso :)

Toma la URL (absoluta, relativa, datos o cualquier cosa que pueda usarse como la srcde un img) del archivo de imagen como entrada. Emite el color RGB como una cadena separada por comas o 0para falsey. Probado con archivos PNG, pero también debería funcionar con JPG y 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

Intentalo

Requiere la adición de un cierre >en el canvaselemento para poder trabajar en un Fragmento. Como extraer imágenes de fuentes externas provocaría un error, lo siguiente tomará URL de datos Base-64 como entrada. Elimine el comentario de la última línea para probar diferentes colores usando una imagen que consta de los 4 colores de prueba.

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>

Lanudo
fuente
A filename with one of the above extensions.-> ¿Seguro que puede tomar la imagen como una cadena codificada en lugar de cargarla desde un archivo?
TheLethalCoder
1
@TheLethalCoder, ¡No! : D Y, ahora que lo dices, puedo ver cómo puedo guardar algunos bytes :)
Shaggy
You may also take an image object or already encoded image instead.El OP actualizado podría guardar bytes ...
TheLethalCoder
@TheLethalCoder, pude cortar "data:image/png;base64,"+mi código tomando la entrada como una 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 tiene una función getcolors que devuelve Nonesi el número de colores es mayor que el parámetro y devuelve un histograma de los colores en una [(pixels, (r,g,b,a)), ...]estructura.

Gábor Fekete
fuente
You may also take an image object or already encoded image instead.El OP actualizado podría guardar bytes ...
TheLethalCoder
@TheLethalCoder ¿Entonces debería asumir una imagen ya abierta y simplemente escribir print i and i[0][1][:3]?
Gábor Fekete
Asumiría
3

Mathematica, 55 51 Bytes

-4 gracias a CalculatorFeline

+0 para refactorizar en función completa.

Usando el objeto de imagen de Mathematica como entrada - Import["filename.png"].

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

Devuelve 0 si no todos un color. Emite el valor decimal del color si es solo uno.

Explicación:

                                 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
fuente
a==1== a<2y Join@@es equivalente a ~Flatten~1en este caso. (Únase a los descansos si la lista contiene no listas)
CalculatorFeline
Por defecto, se requiere una función o programa completo. Para usar un objeto de imagen ya decodificado, creo que aún necesitarías hacer algo comoIf[Length@#==1,#,0]&@Union[ImageData@#~Flatten~1]&
Julian Wolf
Interpreté mal el comentario del OP You may also take an image object or already encoded image instead.. Actualizará.
Ian Miller
@CalculatorFeline Gracias por una pista 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);}

-muchos bytes gracias a @LethalCoder por actualizarme en un cambio de regla que permitió mucho golf
-46 bytes gracias a @KevinCruijssen y error tipográfico fijo

Hiperneutrino
fuente
You may also take an image object or already encoded image instead.El OP actualizado podría guardar bytes ...
TheLethalCoder
@TheLethalCoder Oh, perfecto. ¡Gracias!
HyperNeutrino
Sé que ha pasado un tiempo, pero algunas cosas desde un campo (sin cambiar la versión de 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);}. Al cambiar la versión de Java a 8+, también puede cambiar Object f(java.awt.image.BufferedImage i)a i->. Además, creo que has cometido un error tipográfico: ¿no debería if(i.getRGB(k,l)!=i)serlo !=j?
Kevin Cruijssen
@KevinCruijssen Gracias. Y sí, creo que sí: P
HyperNeutrino
1
@HyperNeutrino Olvidó cambiarlo a Java 8 (o superior). ;)
Kevin Cruijssen
1

Python 2 , 123 85 bytes

from PIL import Image
c=Image.open(input()).getdata()
print len(set(c))<2and c[0][:3]
varilla
fuente
You may also take an image object or already encoded image instead.El OP actualizado podría guardar bytes ...
TheLethalCoder
Esperaría de PIL import * guardar algunos bytes (o alternativamente, importar PIL y luego c = PIL.Image) a menos que esté pasando por alto algo
Foon
@Foon PILes una excepción a las importaciones, no se puede hacer from PIL import*niPIL.
Rod
Gracias; no lo sabía o al menos lo olvidé
Foon
La inconsistencia es horrible :(
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 gracias a @Kevin Cruijssen.

Si no tuviéramos que tener la verificación adicional para que la imagen tenga los mismos colores, esto es solo 55 bytes:

b=>{var c=b.GetPixel(0,0);return c.R+" "+c.G+" "+c.B;};
TheLethalCoder
fuente
Sé que ha pasado un tiempo, pero: 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

imagen

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

If[Length@DominantColors@i==1,"#"<>StringPadLeft[IntegerString[Most@PixelValue[i,{1,1},"Byte"],16],2,"0"],False]
J42161217
fuente
You may also take an image object or already encoded image instead.El OP actualizado podría guardar bytes ...
TheLethalCoder
Okay. Hice algunos cambios
Gracias
¿Es aceptable el hexadecimal en minúsculas?
user202729
Most@PixelValue[i, {1, 1}, "Byte"]ahorrará algunos bytes.
user202729
103 bytes: If[Length@Tally[a=i~ImageData~"Byte"]<2,"#"<>StringPadLeft[Most@a[[1,1]]~IntegerString~16,2,"0"],False]- usa tu función ImageData. No sabía que existía.
user202729
0

Bash + ImageMagick, 100 bytes

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

Probado con .png, también debería funcionar con los otros formatos. La salida para una imagen policromática es simplemente una cadena vacía.

3141
fuente
Puede descartar las comillas alrededor de los especificadores de formato. También ((`identify -format %k $1`-1))||es más corto que i=$(expr `identify -format "%k" $1` = 1)&&.
Trauma digital
0

C, 224205 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 un mapa de bits de 500x500 como argumento de línea de comandos. Imprime el RGB del archivo, por ejemplo 255,255,255, o 0si el archivo no es constante. Probablemente se bloquea mal si no se proporciona ningún archivo.

Puntos interesantes a tener en cuenta:

  • Usos void*en lugar de FILE*evitar incluir<stdio.h>
  • Utiliza un forbucle simple i%3para determinar si todos los bytes son iguales
  • Puede jugar mucho golf, jugué 50 bytes mientras escribía esta respuesta
  • BMP almacena los colores como BGR para que lea más / menos al revés
MD XF
fuente
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>

Intentalo:

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 golfizado:

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
fuente
0

PowerShell, 79 bytes

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

Menos guión de prueba de 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"
}
  • Nota 1 : expresión 499..0*500significa: repetir 500 veces un rango desde 499 hasta 0
  • Nota 2 : la expresión $b|% G*l $_ $y es un acceso directo para $b.GetPixel($_,$y). Este truco es útil con gofing, pero ralentiza el código.

Salida 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:

Salida 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:

Explicación:

  • El script crea una matriz de cada color de píxel.
  • se aplica el script gu(alias para Get-Unique ) a la matriz de color.
  • si el resultado de hues un elemento único (la propiedad ranktiene valor solo para una matriz), entonces genera un valor decimal de R, G, B de este elemento
mazzy
fuente
0

Python 2 + OpenCV + NumPy: 66 caracteres

colores.py

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

prueba.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 $ 

OpenCV puede leer una imagen y devolverla como una matriz N-dimensional. NumPy se usa para probar el primer píxel contra los demás e imprimir los valores RGB o en blanco.

dana
fuente
0

PHP, 88 bytes

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

La función anónima toma un recurso de imagen PHP indexada como parámetro, asume el color en la primera ranura de la paleta, devuelve el código de color o 0.

programa, 96 bytes

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

toma el nombre del archivo GIF del argumento, imprime el código de color o nada. Corre conphp -r '<code>' <filename.gif> .

para imágenes en color verdadero, 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 arriba, pero requiere una imagen en color verdadero.

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 arriba, pero requiere un archivo PNG.

Tito
fuente