Bu ne renk?


9

Bir dosya adını giriş olarak alacak bir program golf oynamak ve dosya ne renk çıktı gerekir.

Dosya bu uzantılardan herhangi birine sahip olacak, ancak programınızın yalnızca birini desteklemesi gerekiyor. Lütfen cevabınızda hangisi olduğunu söyleyin.

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

Ve şimdi klasik düzene.

Giriş

Yukarıdaki uzantılardan birine sahip bir dosya adı.

Bunun yerine bir görüntü nesnesi veya önceden kodlanmış bir görüntü de alabilirsiniz.

Çıktı

Bir ile 6 haneli bir altıgen kodu olarak bu dosyada tek renk isteğe bağlı lider #örneğin #000000siyahtır.

Bunlardan bağımsız çıkış RGB renk onluk veya onaltılık değerlerini içeren bir liste / tuple / dizesi, berrak, sayısal olmayan sınırlayıcı örn , |vb

Şeffaflığın çıktısını alamazsınız.

Dosya hepsi tek bir renk değilse, çıkış olmayan bir falsy değeri gerekir #000000ve sonlandırmak olmadan bir şey baskı STDERR. Böylece dosyayı açıp ilk pikselin RGB değerini elde edemezsiniz.

kurallar

  • Onaltılık kodun yalnızca dosyanın tümü bir renk olması durumunda çıktılanması gerekir.
  • Dosya 500x500piksel olacak
  • Piksellerin tümü% 0 şeffaflığa sahip olacak.
  • Bu en kısa kod kazanır!

Örnekler


7
Dosya tek bir renk değil, bana gereksiz bir komplikasyon gibi geliyor. Ve kuvvetle yazılan dillerde, örneğin C # gibi bir falsey değeri yalnızca a olabilir bool. Bu durumda stringnormal durum için ve normal boololmayan durum için bir object. Bu iyi mi yoksa boş bir dize veya benzeri bir şey döndürebilir miyim?
TheLethalCoder

5
Ayrıca resimlerinizi i.stack.imgur.com'a yüklemenizi öneririm (programım kartondaki görüntüyü alamıyor)
user41805

2
@Phoenix Sorduğum şey bu, C # ve muhtemelen diğer güçlü yazılan dillerdeki bir falsey değeri olmadığı için sorun değil.
TheLethalCoder

6
@Ilikemydog Önemli. Çıktının "Bu dosyadaki tek renk" olduğunu söylemek, yanıt verenlerin görüntünün tek bir renk içereceğini varsaymasına neden olur. Sonra kurallar bununla çelişir. Öte yandan, çıktı bölümü "Bu dosyadaki tek renk veya görüntü birden fazla renk içeriyorsa ... den farklı bir falsy değeri" gibi bir şey okursa çok daha açık olur. Veya xnor'ın uygun şekilde ifade ettiği gibi, meydan okuma gövdesi bir şey söylediğinde, ancak daha sonraki bir bölüm başka bir şey söylediğinde kafa karıştırıcı
Luis Mendo

2
Tüm dosyaların her zaman 3 kanallı (her biri 8 bit) RGB dosyaları olacağını varsayabilir miyiz?
Ahtapot

Yanıtlar:


6

MATL , 15 12 bayt

Yi6Bed~?2MYm

Meydan okumada verilen ".png" görüntüleri ile test edildi. Muhtemelen diğer uzantılarla da çalışır. Girdi, bir dosya adı veya resmin URL'si olabilir.

Çıktı, boşluklarla ayrılmış R, G, B ondalık değerleri veya birden fazla renk varsa boş dizedir (falsy).

İlk ve son test senaryolarına örnek:

resim açıklamasını buraya girin

açıklama

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

Bunun falsey görüntüsü için kontrolü var mı?
TheLethalCoder

1
@TheLethalCoder Çözüldü. Heads up için teşekkürler
Luis Mendo

You may also take an image object or already encoded image instead.Güncellenen OP bayt kaydedebilir ...
TheLethalCoder

@TheLethalCoder Teşekkürler. M×N×3Diziyi doğrudan giremediğim sürece bu cevapta yardımcı olduğunu sanmıyorum , muhtemelen OP'nin anlamı bu değil
Luis Mendo

1
12 bayt ?! Şey, kutsal cehennem!
Shaggy

4

Bash + maça-gereçler + Imagemagick, 60

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

Bir renk varsa rengi verir ve birden fazla renk varsa hiçbir şey vermez.

  • convert $1 txt: girdi dosyasını okur ve çıktıları bir metin dosyası olarak, özellikle bu biçimde:
# ImageMagick piksel sayımı: 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 -uk3Bunu üçüncü sütuna göre benzersiz bir şekilde sıralar. Bu çıktı bir diziye atandıa

  • ((${#a[@]}-9)) dizinin uzunluğu 9 olup olmadığını test eder

  • dizi 9 uzunluğu OLMADIĞINDA (yani uzunluk 9 ise), o zaman benzersiz renk olacak çıkış elemanı 2 (0 tabanlı).


1
Ah benim, bu çok etkileyici.
MD XF

4

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

Tüm piksellerin aynı olduğunu kontrol etmek, çok sayıda bayt ekledi . Sadece ilk pikselin rengini kontrol ettiğimden çok daha büyük değil - bundan memnunum :)

Görüntü dosyasının URL'sini (mutlak, göreli, veri veya srcan olarak kullanılabilecek herhangi bir şey img) giriş olarak alır. RGB rengini virgülle ayrılmış bir dize olarak veya 0falsey için çıktılar . PNG dosyaları ile test edilmiştir ancak JPG ve GIF ile de çalışmalıdır.

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

Dene

Snippet'te çalışmak >için canvasöğeye bir kapanış eklenmesini gerektirir . Görüntüleri harici kaynaklardan almak bir hatanın atılmasına neden olacağından, aşağıdakiler bunun yerine Base-64 veri URL'lerini girdi olarak alır. 4 test renginden oluşan bir görüntü kullanarak farklı renkleri test etmek için son satırı açın.

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.-> Görüntüyü bir dosyadan yüklemek yerine kodlanmış bir dize olarak alabileceğinizden emin misiniz?
TheLethalCoder

1
@TheLethalCoder, Hayır! : D Ve şimdi söylediğinize göre, nasıl birkaç bayt tasarruf edebileceğimi görebiliyorum :)
Shaggy

You may also take an image object or already encoded image instead.Güncellenen OP bayt kaydedebilir ...
TheLethalCoder

@TheLethalCoder, "data:image/png;base64,"+yerine URL olarak girdi alarak kodumu kesmek mümkün oldu .
Shaggy

3

Python 2, 80 bayt

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

PIL.Image, Nonerenk sayısı parametreden büyükse döndüren ve bir [(pixels, (r,g,b,a)), ...]yapıdaki renklerin histogramını döndüren getcolors işlevine sahiptir .


You may also take an image object or already encoded image instead.Güncellenen OP bayt kaydedebilir ...
TheLethalCoder

@TheLethalCoder O zaman zaten açık bir görüntü varsayalım ve sadece yazmalıyım print i and i[0][1][:3]?
Gábor Fekete

Renkleri çağırmak için ihtiyacınız olacağını varsayardım
TheLethalCoder

3

Mathematica, 55 51 Bayt

-4 sayesinde CalculatorFeline

Tam işleve yeniden düzenleme için +0.

Mathematica görüntü nesnesini girdi olarak kullanma - Import["filename.png"].

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

Tek renk değilse 0 döndürür. Yalnızca bir tane varsa rengin ondalık değerini verir.

Açıklama:

                                 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<2ve bu durumda Join@@eşdeğerdir ~Flatten~1. (Listede herhangi bir liste içermiyorsa aralara katılın.)
CalculatorFeline

Varsayılan olarak, tam işlev veya program gerekir. Zaten kodu çözülmüş bir görüntü nesnesini kullanmak için hala böyle bir şey yapmanız gerekeceğine inanıyorumIf[Length@#==1,#,0]&@Union[ImageData@#~Flatten~1]&
Julian Wolf

OP'nin yorumunu yanlış yorumladım You may also take an image object or already encoded image instead.. Güncellenecek.
Ian Miller

@CalculatorFeline Hakkında ipucu için teşekkürler Join@@.
Ian Miller

2

Java 8+, 331 165 119 bayt

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

-Birçok golf için izin veren bir kural değişikliğinde beni güncellediği
için @LethalCoder sayesinde çok bayt-@KevinCruijssen ve sabit yazım hatası sayesinde 46 bayt


You may also take an image object or already encoded image instead.Güncellenen OP bayt kaydedebilir ...
TheLethalCoder

Ah, mükemmel. Teşekkürler!
HyperNeutrino

Bunun bir süre oldu biliyorum ama (Java 7 sürümünü değiştirmeden) golf gereken bazı noktalar: 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);}. 8+ Java versiyonunu değiştirerek, aynı zamanda değiştirebilir Object f(java.awt.image.BufferedImage i)için i->. Yazım hatası yaptık Ayrıca, ben düşünüyorum: olmamalıdır if(i.getRGB(k,l)!=i)olmak !=jyerine?
Kevin Cruijssen

@KevinCruijssen Teşekkürler. Ve evet, sanırım yaptım: P
HyperNeutrino

1
@HyperNeutrino Java 8 (veya üstü) olarak değiştirmeyi unuttunuz. ;)
Kevin Cruijssen

1

Python 2 , 123 85 bayt

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.Güncellenen OP bayt kaydedebilir ...
TheLethalCoder

Ben bir şey göz ardı sürece PIL ithalat * birkaç bayt (veya alternatif olarak, PIL ve sonra c = PIL.Image) kaydetmek için beklenir
Foon

@Foon PIL, ithalat için bir istisnadır, from PIL import*ne yapamazsınız ne dePIL.
Rod

Teşekkürler; bilmiyordum ya da en azından unuttum
Foon

Tutarsızlık korkunç :(
CalculatorFeline

1

C #, 163 128 125 bayt

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 sayesinde 3 bayt tasarruf edildi.

Görüntünün aynı renkler için ek kontrolüne sahip olmamız gerekmiyorsa, bu sadece 55 bayttır:

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

Bir süredir olduğunu biliyorum, ama: 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 bayt)
Kevin Cruijssen

0

Mathematica, 112 bayt

görüntü

i Al = @ "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.Güncellenen OP bayt kaydedebilir ...
TheLethalCoder

tamam. Bazı değişiklikler yaptım.
Teşekkürler

Küçük harf hex kabul edilebilir mi?
user202729

Most@PixelValue[i, {1, 1}, "Byte"]bazı bayt tasarruf edecek.
user202729

103 bayt: If[Length@Tally[a=i~ImageData~"Byte"]<2,"#"<>StringPadLeft[Most@a[[1,1]]~IntegerString~16,2,"0"],False]- ImageData işlevinizi kullanın. Bunun var olduğunu bilmiyordum.
user202729

0

Bash + ImageMagick, 100 bayt

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

.Png ile test edilmiş, diğer formatlarla da çalışmalıdır. Çok renkli bir görüntünün çıktısı boş bir dizedir.


Tırnakları format belirteçlerinin çevresinden bırakabilirsiniz. Ayrıca ((`identify -format %k $1`-1))||daha kısadır i=$(expr `identify -format "%k" $1` = 1)&&.
Dijital Travma

0

C 224205 bayt

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

Komut satırı argümanı olarak 500x500 bitmap alır. Dosyanın RGB'sini yazdırır, örn. 255,255,255, Veya0 dosya sabit değilse. Herhangi bir dosya sağlanmazsa büyük olasılıkla kilitleniyor.

Dikkat edilmesi gereken ilginç noktalar:

  • Kullanımları void*FILE*Kaçınılması gereken yerde<stdio.h>
  • Basit kullanır fori%3Tüm baytların aynı olup olmadığını belirlemek için ile döngü
  • Olabilir çok bu cevabı yazarken golfed, ben 50 bayt golfed
  • BMP renkleri BGR olarak depolar, böylece daha fazla / daha az geriye doğru okur

0

JavaScript + HTML, 143 + 23 = 166 bayt

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>

Dene:

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>

Daha az 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 bayt

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

Daha az golf test senaryosu:

$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"
}
  • Not 1 : ifade şu 499..0*500anlama gelir: 499 ile 0 arasında bir aralığı 500 kez tekrarlayın
  • Not 2 : ifade $b|% G*l $_ $y kısayol olduğu için $b.GetPixel($_,$y). Bu hile, gofing ile yararlıdır, ancak kodu yavaşlatır.

Çıktı $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:

Çıktı $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:

Açıklama:

  • komut dosyası her piksel renginden bir dizi oluşturur.
  • komut dosyası geçerlidir gu( Get-Unique için takma ad renk dizisine ).
  • sonucu hutek bir öğeyse (özelliğin rankyalnızca bir dizi için değeri varsa), bu öğenin R, G, B ondalık değerini çıktılayın

0

Python 2 + OpenCV + NumPy: 66 karakter

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

Sonuç:

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

18:15 ~/colors $ 

OpenCV bir görüntüyü okuyabilir ve bir N-boyutlu dizi olarak döndürebilir. NumPy, ilk pikseli diğerlerine karşı test etmek ve RGB değerlerini yazdırmak veya boş bırakmak için kullanılır.


0

PHP, 88 bayt

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

anonim işlevi dizinlenmiş bir PHP görüntü kaynağını parametre olarak alır, ilk palet yuvasında renk olduğunu varsayar, renk kodunu veya 0 değerini döndürür.

program, 96 bayt

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

GIF dosya adını argümandan alır, renk kodu yazdırır veya hiçbir şey yazdırmaz. Şununla koş:php -r '<code>' <filename.gif> .

Gerçek renkli görüntüler için 113 112 bayt

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

yukarıdaki gibi, ancak gerçek renkli görüntü gerektirir.

program, 122 116 bayt

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

yukarıdaki gibi, ancak PNG dosyası gerektirir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.