이게 무슨 색이야?


9

파일 이름을 입력으로 사용하는 프로그램을 골프화해야하며 파일의 색상을 출력해야합니다.

파일에는 이러한 확장자 중 하나가 있지만 프로그램은 하나만 지원하면됩니다. 답에서 어느 것을 말하십시오.

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

그리고 이제 고전적인 레이아웃으로.

입력

위 확장자 중 하나를 가진 파일 이름.

이미지 객체 또는 이미 인코딩 된 이미지를 대신 사용할 수도 있습니다.

산출

있는 6 자리 16 진수 코드로 해당 파일에있는 유일한 색상 선택 최고의 #예는 #000000검은 색입니다.

RGB 색상의 10 진수 또는 16 진수 값을 포함하는 목록 / 튜플 / 문자열을 명확하고 숫자가 아닌 구분 기호 , |등으로 출력 할 수도 있습니다.

투명도를 출력하지 못할 수 있습니다.

파일이 모두 한 가지 색상이 아닌 경우 잘못된 값을 출력하고에 인쇄 하지 않고#000000 종료 해야 합니다. 이것은 단순히 파일을 열고 첫 번째 픽셀의 RGB 값을 얻을 수 없도록하기위한 것입니다.STDERR

규칙

  • 파일이 모두 하나의 색상 인 경우 16 진 코드 만 출력하면됩니다.
  • 파일은 500x500픽셀입니다
  • 픽셀의 투명도는 모두 0 %입니다.
  • 이것은 가장 짧은 코드가 승리합니다!


7
파일이 모두 단색이 아닌 파일은 나에게 불필요한 합병증처럼 보입니다. 그리고 강력하게 형식화 된 언어로 falsey 값은, 예를 들어, C #, 만 될 수 있습니다 bool. 이 경우 string일반 케이스와 일반 bool이 아닌 경우에 대해로 감싸 인을 반환 합니다 object. 이것은 괜찮습니까? 아니면 빈 문자열이나 비슷한 것을 반환 할 수 있습니까?
TheLethalCoder

5
또한 i.stack.imgur.com에 이미지를 업로드하는 것이 좋습니다 (내 프로그램은 보드에서 이미지를 가져올 수 없음)
user41805

1
이미지 입력에 대한 기본 표준이 있으며 여기 메타 에서 찾을 수 있습니다 . 그것은 당신이 가진 것과 크게 다르지 않지만, 제공된 것 대신에 링크하고 싶을 수도 있습니다.
Pavel

6
@Ilikemydog 그것은 중요하다. 출력이 "해당 파일의 유일한 색상"이라고하면 응답자가 이미지에 단일 색상이 포함된다고 가정합니다. 그런 다음 규칙이 모순됩니다. 반면에 출력 섹션에 "해당 파일의 유일한 색상 또는 이미지에 둘 이상의 색상이 포함 된 경우와 다른 잘못된 값"과 같은 내용이 표시되면 훨씬 명확 해집니다. XNOR 그렇게 적절하게 넣어 또는, 도전의 몸이 한 가지라고하지만, 나중에 부분은 다른 말할 때 그것은 혼란
루이스 Mendo

2
모든 파일이 항상 3 채널 (각 8 비트) RGB 파일이라고 가정해야합니까?
Octopus

답변:


6

MATL , 15 12 바이트

Yi6Bed~?2MYm

도전에 주어진 ".png"이미지로 테스트했습니다. 아마 다른 확장과도 작동합니다. 입력은 이미지의 파일 이름 또는 URL 일 수 있습니다.

출력은 공백으로 구분 된 R, G, B 10 진수 값이거나 둘 이상의 색상이있는 경우 빈 문자열 (가짜 임)입니다.

첫 번째 및 마지막 테스트 사례가있는 예 :

여기에 이미지 설명을 입력하십시오

설명

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

이것은 잘못된 이미지를 확인합니까?
TheLethalCoder

1
@TheLethalCoder가 해결되었습니다. 고마워
Luis Mendo

You may also take an image object or already encoded image instead.업데이트 영업 이익은 ... 바이트를 저장할 수 있습니다
TheLethalCoder

@TheLethalCoder 감사합니다. M×N×3배열을 직접 입력 할 수 없다면 OP가 의미하는 것이 아닐 수도 있습니다.
Luis Mendo

1
12 바이트?! 음, 지옥!
얽히고 설킨 Shake

4

배쉬 + 코어 유틸리티 + Imagemagick, 60

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

하나의 색상이 있으면 색상을 출력하고 하나 이상의 색상이 있으면 색상을 출력합니다.

  • convert $1 txt: 입력 파일을 읽고 특히 다음 형식으로 텍스트 파일로 출력합니다.
# 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 -uk3세 번째 열을 기준으로 고유하게 정렬합니다. 이 출력은 배열에 할당됩니다a

  • ((${#a[@]}-9)) 배열의 길이가 9가 아닌지 테스트

  • 배열에 길이 9가없는 경우 (즉, 길이 9가있는 경우) 고유 한 색상이되는 출력 요소 2 (0 기반)입니다.


1
오, 정말 인상적입니다.
MD XF

4

자바 스크립트 (ES6) + HTML, 315 289 243 218 217 215 211 210 208 바이트

모든 픽셀이 동일한 지 확인하면 많은 바이트가 추가되었습니다 . 첫 번째 픽셀의 색상을 확인했을 때보 다 크게 커지지 않았습니다.

(는 AS 사용될 수 절대 대하여, 데이터 또는 어떤 URL을 취하고 srcimg입력으로 이미지 파일을). RGB 색상을 쉼표로 구분 된 문자열로 또는 0거짓 으로 출력합니다 . PNG 파일로 테스트되었지만 JPG & 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

시도 해봐

스 니펫에서 작동 >하려면 canvas요소를 추가해야합니다 . 외부 소스에서 이미지를 가져 오면 오류가 발생하므로 다음은 Base-64 데이터 URL을 입력으로 사용합니다. 4 가지 색상으로 구성된 이미지를 사용하여 다른 색상을 테스트하려면 마지막 줄의 주석 처리를 제거하십시오.

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.-> 파일에서로드하는 대신 이미지를 인코딩 된 문자열로 가져올 수 있습니까?
TheLethalCoder

1
@TheLethalCoder, 아니! : D 그리고, 이제 말했듯이, 몇 바이트를 절약 할 수있는 방법을 볼 수 있습니다 :)
Shaggy

You may also take an image object or already encoded image instead.업데이트 영업 이익은 ... 바이트를 저장할 수 있습니다
TheLethalCoder

@ TheLethalCoder, "data:image/png;base64,"+대신 URL로 입력하여 코드 를 잘라낼 수있었습니다 .
Shaggy

3

파이썬 2, 80 바이트

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

PIL.Image에는 None색상 수가 매개 변수보다 큰 경우 반환하고 [(pixels, (r,g,b,a)), ...]구조 에서 색상의 히스토그램 을 반환하는 getcolors 함수가 있습니다.


You may also take an image object or already encoded image instead.업데이트 영업 이익은 ... 바이트를 저장할 수 있습니다
TheLethalCoder

@TheLethalCoder 그렇다면 이미 열린 이미지를 가정하고 작성 print i and i[0][1][:3]해야합니까?
Gábor Fekete

나는 당신이 색상을 얻을 필요가 있다고 가정합니다
TheLethalCoder

3

매스 매 티카, 55 51 바이트

CalculatorFeline 덕분에 -4

전체 기능으로 리팩토링하는 경우 +0

Mathematica 이미지 객체를 입력으로 사용- Import["filename.png"].

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

하나의 색상이 아닌 경우 0을 반환합니다. 하나의 색상 인 경우 10 진수 값을 출력합니다.

설명:

                                 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<2Join@@같습니다 ~Flatten~1. (목록에 비 목록이 포함되어 있으면 가입이 중단됩니다.)
CalculatorFeline

기본적으로 전체 기능 또는 프로그램이 필요합니다. 이미 디코딩 된 이미지 객체를 사용하려면 여전히 다음과 같은 작업을 수행해야한다고 생각합니다.If[Length@#==1,#,0]&@Union[ImageData@#~Flatten~1]&
Julian Wolf

OP의 의견을 잘못 해석했습니다 You may also take an image object or already encoded image instead.. 업데이트됩니다.
Ian Miller

@CalculatorFeline에 대한 힌트를 주셔서 감사합니다 Join@@.
Ian Miller

2

자바 8 이상, 331 165 119 바이트

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


@KevinCruijssen 및 고정 오타 덕분에 많은 골프를 허용 한 규칙 변경으로 나를 업데이트 한 @LethalCoder 덕분에 많은 바이트


You may also take an image object or already encoded image instead.업데이트 영업 이익은 ... 바이트를 저장할 수 있습니다
TheLethalCoder

@TheLethalCoder 아 완벽합니다. 감사!
HyperNeutrino

나는 그것이 오래되었다는 것을 알고 있지만 (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);}. Java 버전을 8+로 변경 Object f(java.awt.image.BufferedImage i)하면로 변경할 수도 있습니다 i->. 당신이 오타를했습니다 또한, 나는 생각 : 안 if(i.getRGB(k,l)!=i)!=j대신?
Kevin Cruijssen

@KevinCruijssen 감사합니다. 그리고 그래, 내가 한 것 같아 : P
HyperNeutrino

1
@HyperNeutrino Java 8 이상으로 변경하는 것을 잊었습니다. ;)
Kevin Cruijssen

1

파이썬 2 , 123 85 바이트

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.업데이트 영업 이익은 ... 바이트를 저장할 수 있습니다
TheLethalCoder

나는 몇 바이트 (또는 대안 적으로, 수입 PIL 다음 = PIL.Image C)를 저장 * PIL 수입에서 기대할 수있는 뭔가가 내려다 보이는거야하지 않는 한

@Foon는 PIL수입에 예외는, 당신이 할 수 from PIL import*없으며PIL.
로드

감사; 몰랐거나 잊었다
Foon

불일치가 끔찍하다 :(
CalculatorFeline

1

C #을 163 128 125 바이트

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

@Kevin Cruijssen 덕분에 3 바이트를 절약했습니다.

동일한 색상의 이미지를 추가로 확인할 필요가없는 경우 이것은 55 바이트입니다.

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

나는 그것이 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;}
오래

0

수학, 112 바이트

영상

i = 가져 오기 @ "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.업데이트 영업 이익은 ... 바이트를 저장할 수 있습니다
TheLethalCoder

확인. 좀 changes.thanks 만든
J42161217을

소문자 16 진수가 허용됩니까?
user202729 2016 년

Most@PixelValue[i, {1, 1}, "Byte"]바이트를 절약 할 수 있습니다.
user202729 2016 년

103 바이트 : If[Length@Tally[a=i~ImageData~"Byte"]<2,"#"<>StringPadLeft[Most@a[[1,1]]~IntegerString~16,2,"0"],False]-ImageData 함수를 사용하십시오. 존재하지 않았다.
user202729 2016 년

0

Bash + ImageMagick, 100 바이트

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

.png로 테스트했으며 다른 형식에서도 작동합니다. 다색 이미지의 출력은 단순히 빈 문자열입니다.


형식 지정자 주위에서 따옴표를 삭제할 수 있습니다. 또한 ((`identify -format %k $1`-1))||보다 짧습니다 i=$(expr `identify -format "%k" $1` = 1)&&.
Digital Trauma

0

C, 224205 바이트

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

500x500 비트 맵을 명령 줄 인수로 사용합니다. 파일의 RGB를 인쇄합니다 (예 : 255,255,255또는 0파일이 일정하지 않은 경우). 파일이 제공되지 않으면 제대로 작동하지 않을 수 있습니다.

흥미로운 점 :

  • 용도 void*의 장소에 FILE*포함 피하기 위해<stdio.h>
  • for와 함께 간단한 루프를 사용하여 i%3모든 바이트가 동일한 지 확인
  • 수 있습니다 매우 이 답변을 쓰는 동안 golfed, 나는 50 바이트를 golfed
  • BMP는 색상을 BGR로 저장하므로 뒤로 / 거꾸로 읽을 수 있습니다

0

자바 스크립트 + HTML, 143 + 23 = 166 바이트

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>

시도 해봐:

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>

덜 골프 :

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 바이트

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

덜 골프 테스트 스크립트 :

$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"
}
  • 참고 1 : 표현의 499..0*500의미 : 499에서 0까지 500의 범위를 반복
  • 참고 2 : 표현 $b|% G*l $_ $y 은 바로 가기 입니다 $b.GetPixel($_,$y). 이 트릭은 gofing에 유용하지만 코드 속도가 느려집니다.

로 출력 $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:

로 출력 $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:

설명:

  • 스크립트는 각 픽셀 색상의 배열을 만듭니다.
  • 스크립트는 색상 배열에 ( Get-Unique의gu 별칭) 적용 합니다.
  • 의 결과 hu가 단일 요소 인 경우 (속성 rank에는 배열 값만 있음)이 요소의 R, G, B 10 진수를 출력합니다.

0

Python 2 + OpenCV + NumPy : 66 자

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

결과:

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

18:15 ~/colors $ 

OpenCV는 이미지를 읽고 N 차원 배열로 반환 할 수 있습니다. NumPy는 다른 픽셀과 비교하여 첫 번째 픽셀을 테스트하고 RGB 값을 인쇄하거나 비 웁니다.


0

PHP, 88 바이트

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

익명 함수는 색인화 된 PHP 이미지 리소스를 매개 변수로 사용하고 첫 번째 팔레트 슬롯의 색상을 가정하고 색상 코드 또는 0을 반환합니다.

프로그램, 96 바이트

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

인수에서 GIF 파일 이름을 가져와 색상 코드를 인쇄하거나 아무것도 인쇄하지 않습니다. 로 실행하십시오 php -r '<code>' <filename.gif>.

트루 컬러 이미지의 경우 113112 바이트

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

위와 같지만 트루 컬러 이미지가 필요합니다.

프로그램 (122) 116 바이트

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

위와 같지만 PNG 파일이 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.