これは何色ですか?


9

入力としてファイル名を使用するプログラムをゴルフし、ファイルの色を出力する必要があります。

ファイルにはこれらの拡張子のいずれかが含まれますが、プログラムでサポートする必要があるのは1つだけです。答えのどれを言ってください。

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

そして今、クラシックなレイアウトに。

入力

上記の拡張子のいずれかが付いたファイル名。

代わりに、画像オブジェクトまたは既にエンコードされた画像を使用することもできます。

出力

そのファイル内の唯一の色は、オプションのリーディング付きの6桁の16進コードで、#たとえば#000000黒です。

RGBカラーの10進数または16進数の値を含むリスト/タプル/文字列を、数値 , |などの明確な区切り文字などで出力することもできます。

透明度は出力できません。

ファイルがすべて1色でない場合は、偽ではない偽の値を出力し、何も印刷#000000に終了する必要があります。これは、単にファイルを開いて最初のピクセルのRGB値を取得できないようにするためです。STDERR

ルール

  • 16進コードは、ファイルがすべて1色の場合にのみ出力する必要があります。
  • ファイルは500x500ピクセルになります
  • ピクセルの透明度はすべて0%です。
  • これはので、最短のコードが勝ちます!


7
ファイルがすべて1色ではないことは、私にとって不必要な複雑さのように思えます。強く型付けされた言語(C#など)の誤った値は、のみboolです。この場合string、通常の場合と通常boolではない場合にをラップしてを返しobjectます。これは問題ありませんか、それとも空の文字列などを返すことができますか?
TheLethalCoder

5
また、画像をi.stack.imgur.comにアップロードすることをお勧めします(私のプログラムはペーストボードから画像を取得できません)
user41805

1
画像入力のデフォルトの標準があります。こちらのメタ確認できます。それはあなたが持っているものと大きな違いはありませんが、あなたが提供したものの代わりにそれにリンクしたいかもしれません。
Pavel

6
@Ilikemydogそれは重要です。出力が「そのファイルの唯一の色」であるとすると、回答者は画像に単一の色が含まれると想定します。その後、ルールはそれと矛盾します。一方、出力セクションが「そのファイルの唯一の色、または画像に複数の色が含まれている場合は...とは異なる偽の値」のようなものを読んだ方がはるかに明確になります。または、XNORように適切にそれを置く、挑戦の体が一つのことが、後の部分は別の言う言うとき混乱だ
ルイスMendo

2
すべてのファイルが常に3チャネル(各8ビット)のRGBファイルであると想定する必要がありますか?
タコ

回答:


6

MATL15 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解決しました。ヘッドアップをありがとう
ルイスメンド

You may also take an image object or already encoded image instead.更新されたOPはバイトを保存できる可能性があります...
TheLethalCoder

@TheLethalCoderありがとう。M×N×3配列を直接入力できない場合を除き、この答えには役立たないと思います。これは、おそらくOPが意味するものではありません
Luis Mendo

1
12バイト?!まあ、聖地獄!
シャギー

4

Bash + core-utils + Imagemagick、60

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

色が1つの場合は色を出力し、複数の色がある場合は何も出力しません。

  • 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これを3番目の列で一意に並べ替えます。この出力は配列に割り当てられていますa

  • ((${#a[@]}-9)) 配列の長さが9でないかどうかをテストします

  • 配列の長さが9でない場合(つまり、長さが9の場合)、出力要素2(0ベース)は一意の色になります。


1
ああ、それは印象的です。
MD XF 2017年

4

JavaScript(ES6)+ HTML、315 289 243 218 217 215 211 210 208バイト

すべてのピクセルが同一であることを確認すると、多くのバイトが追加されました。最初のピクセルの色をチェックしていたときよりも大きくなっていませんが、満足しています:)

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.更新されたOPはバイトを保存できる可能性があります...
TheLethalCoder

@TheLethalCoder、"data:image/png;base64,"+代わりに入力をURLとして取得することで、コードを削除できました。
シャギー

3

Python 2、80バイト

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

PIL.Imageにはgetcolors関数がありNone、色の数がパラメーターより大きい場合に返され、[(pixels, (r,g,b,a)), ...]構造内の色のヒストグラムを返します。


You may also take an image object or already encoded image instead.更新されたOPはバイトを保存できる可能性があります...
TheLethalCoder

@TheLethalCoderでは、すでに開いている画像を想定して、単に書き込む必要がありprint i and i[0][1][:3]ますか?
ガーボルFekete

色の呼び出しが必要になると思います
TheLethalCoder

3

Mathematica、55 51バイト

-4 CalculatorFelineのおかげで

+0は、完全な機能にリファクタリングします。

Mathematica画像オブジェクトを入力として使用する- Import["filename.png"]

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

1色ではない場合は0を返します。色の10進数値を1つだけ出力します。

説明:

                                 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<2そして、この場合Join@@と同等~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

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

-多くのゴルフを可能にするルール変更で私を更新してくれた@LethalCoderのおかげで多くのバイト-
@ KevinCruijssenと修正されたタイプミスのおかげで-46バイト


You may also take an image object or already encoded image instead.更新されたOPはバイトを保存できる可能性があります...
TheLethalCoder

@TheLethalCoderああ完璧。ありがとう!
HyperNeutrino 2017年

久しぶりのことですが、ゴルフ(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、2018年

@KevinCruijssenありがとう。そして、ええ、私はそうしたと思います:P
HyperNeutrino

1
@HyperNeutrino Java 8(またはそれ以上)に変更するのを忘れました。;)
Kevin Cruijssen、2018年

1

パイソン2123の 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.更新されたOPはバイトを保存できる可能性があります...
TheLethalCoder

私は何かを見落とさない限り、PILインポート*で数バイトを節約することを期待します(または、PILをインポートしてからc = PIL.Imageをインポートします)
Foon

@Foon PILはインポートの例外であり、実行することはできませfrom PIL import*PIL.
Rod

ありがとう。それを忘れてしまったということか、少なくとも、知りませんでした
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;}(-3バイト)
Kevin Cruijssen、2018年

0

Mathematica、112バイト

画像

i = Import @ "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はバイトを保存できる可能性があります...
TheLethalCoder

OK。私はいくつかの変更を加えました。
ありがとう

小文字の16進数は受け入れられますか?
user202729

Most@PixelValue[i, {1, 1}, "Byte"]いくつかのバイトを節約します。
user202729

103バイト:If[Length@Tally[a=i~ImageData~"Byte"]<2,"#"<>StringPadLeft[Most@a[[1,1]]~IntegerString~16,2,"0"],False]-ImageData関数を使用します。それが存在することを知りませんでした。
user202729

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)&&
デジタルトラウマ

0

C、224 205バイト

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,2550ファイルが定数でない場合。ファイルが提供されない場合、おそらくひどくクラッシュします。

注意すべき興味深い点:

  • 含むことを避けるためvoid*の場所での使用FILE*<stdio.h>
  • で単純なforループを使用して、i%3すべてのバイトが同じかどうかを判断します
  • 非常にゴルフができる、私はこの答えを書いている間に50バイトゴルフしました
  • BMPは色をBGRとして保存するため、逆方向の読み取りが多かれ少なかれ

0

JavaScript + 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:

説明:

  • スクリプトは、各ピクセルカラーの配列を作成します。
  • スクリプトは色の配列に適用されますguGet-Uniqueのエイリアス)。
  • の結果が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.