Jaki to kolor?


9

Musisz zagrać w golfa w programie, który pobierze nazwę pliku jako dane wejściowe i musisz podać kolor pliku.

Plik będzie miał jedno z tych rozszerzeń, ale Twój program musi tylko je obsługiwać. Powiedz, który z nich w odpowiedzi.

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

A teraz do klasycznego układu.

Wejście

Nazwa pliku z jednym z powyższych rozszerzeń.

Zamiast tego możesz również wziąć obiekt obrazu lub już zakodowany obraz.

Wynik

Jedynym kolorem w tym pliku jako sześciocyfrowy kod szesnastkowy z opcjonalnym wiodącym #np. #000000Jest czarny.

Możesz również wypisać listę / krotkę / łańcuch zawierający wartości dziesiętne lub szesnastkowe koloru RGB, z wyraźnym, nienumerycznym separatorem, np. , |Itp.

Nie możesz wydrukować przezroczystości.

Jeśli plik nie ma tylko jednego koloru, musisz wygenerować wartość fałszowania, która nie jest, #000000i zakończyć bez drukowania niczego STDERR. Jest tak, że nie można po prostu otworzyć pliku i uzyskać wartości RGB pierwszego piksela.

Zasady

  • Kod szesnastkowy musi być wyprowadzony tylko wtedy, gdy plik ma tylko jeden kolor.
  • Plik będzie miał 500x500piksele
  • Wszystkie piksele będą miały 0% przezroczystości.
  • To jest więc najkrótszy kod wygrywa!

Przykłady


7
Plik, który nie jest w jednym kolorze, wydaje mi się niepotrzebną komplikacją. A wartością falsey w silnie typowanych językach, np. C #, może być tylko a bool. W tym przypadku zwracałbym a stringdla sprawy normalnej i booldla sprawy niestandardowej, owiniętej w object. Czy to dobrze, czy mogę zwrócić pusty ciąg znaków lub podobny?
TheLethalCoder

5
Sugeruję również przesłanie twoich zdjęć na i.stack.imgur.com (mój program nie może pobrać obrazu z kartonu)
user41805

2
@Phoenix O to jednak pytam, czy jest w porządku, ponieważ nie jest to wartość falsey w języku C # i prawdopodobnie w innych silnie pisanych językach.
TheLethalCoder

6
@Ilikemydog To ma znaczenie. Powiedzenie, że wyjście to „Jedyny kolor w tym pliku”, powoduje, że autorzy odpowiadają, że obraz będzie zawierał jeden kolor. Zatem reguły są temu sprzeczne. Z drugiej strony byłoby znacznie wyraźniej, gdyby sekcja wyjściowa brzmiała: „Jedyny kolor w tym pliku lub wartość fałszowania inna niż… jeśli obraz zawiera więcej niż jeden kolor”. Lub, jak to trafnie ujął Xnor, jest mylące, gdy ciało wyzwania mówi jedną rzecz, ale późniejsza część mówi inną
Luis Mendo

2
Czy mamy zakładać, że wszystkie pliki będą zawsze 3-kanałowymi (po 8 bitów) plikami RGB?
Ośmiornica

Odpowiedzi:


6

MATL , 15 12 bajtów

Yi6Bed~?2MYm

Testowany z obrazami „.png” podanymi w wyzwaniu. Prawdopodobnie działa również z innymi rozszerzeniami. Dane wejściowe mogą być nazwą pliku lub adresem URL obrazu.

Dane wyjściowe to wartości dziesiętne R, G, B oddzielone spacjami lub pusty ciąg znaków (co jest fałszem), jeśli występuje więcej niż jeden kolor.

Przykład z pierwszym i ostatnim przypadkiem testowym:

wprowadź opis zdjęcia tutaj

Wyjaśnienie

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

Czy to ma wpływ na zdjęcie falsey?
TheLethalCoder

1
@TheLethalCoder Solved. Dzięki za heads-up
Luis Mendo

You may also take an image object or already encoded image instead.Zaktualizowano OP może być w stanie zapisać bajty ...
TheLethalCoder

@TheLethalCoder Thanks. Nie sądzę, żeby to pomogło w tej odpowiedzi, chyba że mógłbym M×N×3bezpośrednio wprowadzić tablicę, co prawdopodobnie nie oznacza tego, co OP
Luis Mendo

1
12 bajtów ?! Piekło!
Kudłaty

4

Bash + core-utils + Imagemagick, 60

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

Wyprowadza kolor, jeśli jest jeden kolor i nic, jeśli jest więcej niż jeden kolor.

  • convert $1 txt: odczytuje plik wejściowy i dane wyjściowe jako plik tekstowy, szczególnie w tym formacie:
# ImageMagick wyliczenie pikseli: 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 -uk3jednoznacznie sortuje to według trzeciej kolumny. To wyjście jest przypisane do tablicya

  • ((${#a[@]}-9)) sprawdza, czy tablica NIE ma długości 9

  • jeśli tablica NIE ma długości 9 (tzn. ma długość 9), to element wyjściowy 2 (oparty na 0) będzie unikalnym kolorem.


1
Och, to imponujące.
MD XF

4

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

Sprawdzanie, czy wszystkie piksele były identyczne, dodawało dużo bajtów. Do tego stopnia, że ​​nie jest dużo większy niż wtedy, gdy sprawdzałem tylko kolor pierwszego piksela - z tego zadowolony :)

Pobiera na wejściu adres URL (bezwzględny, względny, dane lub cokolwiek, co może być użyte jako srcan img) pliku obrazu. Wyświetla kolor RGB jako ciąg oddzielony przecinkami lub 0falsey. Testowany z plikami PNG, ale powinien również działać z JPG i 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

Spróbuj

Wymaga dodania zamknięcia >na canvaselemencie, aby działał w Snippet. Ponieważ pobieranie obrazów ze źródeł zewnętrznych spowodowałoby zgłoszenie błędu, poniższe dane zamiast tego przyjmą adresy URL danych Base-64 jako dane wejściowe. Odkomentuj ostatnią linię do testowania różnych kolorów, używając obrazu składającego się z 4 kolorów testowych.

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.-> Jesteś pewien, że możesz wziąć obraz jako zakodowany ciąg zamiast ładować z pliku?
TheLethalCoder

1
@TheLethalCoder, Nie! : D A teraz, kiedy to mówisz, widzę, jak mogę zaoszczędzić kilka bajtów :)
Kudłaty

You may also take an image object or already encoded image instead.Zaktualizowano OP może być w stanie zapisać bajty ...
TheLethalCoder

@TheLethalCoder, mogłem "data:image/png;base64,"+wyciąć kod, przyjmując dane wejściowe jako adres URL.
Kudłaty

3

Python 2, 80 bajtów

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

PIL.Image ma funkcję getcolors, która zwraca, Nonejeśli liczba kolorów jest większa niż parametr, i zwraca histogram kolorów w [(pixels, (r,g,b,a)), ...]strukturze.


You may also take an image object or already encoded image instead.Zaktualizowano OP może być w stanie zapisać bajty ...
TheLethalCoder

@TheLethalCoder Więc powinienem założyć już otwarty obraz i po prostu pisać print i and i[0][1][:3]?
Gábor Fekete

Zakładam, że potrzebujesz połączenia z kolorami
TheLethalCoder

3

Mathematica, 55 51 bajtów

-4 dzięki CalculatorFeline

+0 za refaktoryzację do pełnej funkcji.

Wykorzystanie obiektu obrazu Mathematica jako danych wejściowych - Import["filename.png"].

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

Zwraca 0, jeśli nie wszystkie w jednym kolorze. Zwraca wartość dziesiętną koloru, jeśli tylko jeden.

Wyjaśnienie:

                                 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<2i Join@@jest równoważne ~Flatten~1w tym przypadku. (Przyłącz się, jeśli lista zawiera jakieś nielista.)
CalculatorFeline

Domyślnie wymagana jest pełna funkcja lub program. Aby użyć już zdekodowanego obiektu obrazu, uważam, że nadal musisz zrobić coś takiegoIf[Length@#==1,#,0]&@Union[ImageData@#~Flatten~1]&
Julian Wolf

Źle zinterpretowałem komentarz PO You may also take an image object or already encoded image instead.. Zaktualizuję.
Ian Miller

@CalculatorFeline Dzięki za podpowiedź na temat Join@@.
Ian Miller

2

Java 8+, 331 165 119 bajtów

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

-duże bajty dzięki @LethalCoder za aktualizację mnie w sprawie zmiany reguły, która pozwoliła na dużo gry w golfa
-46 bajtów dzięki @KevinCruijssen i poprawiona literówka


You may also take an image object or already encoded image instead.Zaktualizowano OP może być w stanie zapisać bajty ...
TheLethalCoder

@TheLethalCoder Oh perfect. Dzięki!
HyperNeutrino

Wiem, że to było trochę czasu, ale niektóre rzeczy do golfa (bez zmiany w wersji 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);}. Zmieniając wersję Java na 8+, możesz także zmienić Object f(java.awt.image.BufferedImage i)na i->. Myślę też, że popełniłeś literówkę: nie powinno if(i.getRGB(k,l)!=i)być !=jzamiast tego?
Kevin Cruijssen

@KevinCruijssen Thanks. I tak, myślę, że to zrobiłem: P
HyperNeutrino,

1
@HyperNeutrino Zapomniałeś zmienić na Java 8 (lub nowszy). ;)
Kevin Cruijssen

1

Python 2 , 123 85 bajtów

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.Zaktualizowano OP może być w stanie zapisać bajty ...
TheLethalCoder

Oczekuję, że z importu PIL * zaoszczędzi kilka bajtów (lub alternatywnie, zaimportuje PIL, a następnie c = PIL.Image), chyba że coś przeoczę
Foon

@Foon PILjest wyjątkiem importu, nie można zrobić from PIL import*aniPIL.
Rod

Dzięki; nie wiedziałem o tym lub przynajmniej o tym zapomniałem
Foon

Niespójność jest okropna :(
CalculatorFeline

1

C #, 163 128 125 bajtów

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

Zaoszczędź 3 bajty dzięki @Kevin Cruijssen.

Jeśli nie musieliśmy dodatkowo sprawdzać, czy obraz ma te same kolory, to tylko 55 bajtów:

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

Wiem, że minęło trochę czasu, ale: 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 bajty)
Kevin Cruijssen

0

Mathematica, 112 bajtów

wizerunek

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.Zaktualizowano OP może być w stanie zapisać bajty ...
TheLethalCoder

ok.
Dokonałem

Czy dopuszczalne jest użycie heksów małych liter
user202729

Most@PixelValue[i, {1, 1}, "Byte"]zapisze niektóre bajty.
user202729

103 bajty: If[Length@Tally[a=i~ImageData~"Byte"]<2,"#"<>StringPadLeft[Most@a[[1,1]]~IntegerString~16,2,"0"],False]- użyj funkcji ImageData. Nie wiedziałem, że istnieje.
user202729

0

Bash + ImageMagick, 100 bajtów

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

Testowany z .png, powinien również działać z innymi formatami. Wyjściem dla obrazu polichromatycznego jest po prostu pusty ciąg.


Możesz usunąć cytaty z specyfikatorów formatu. ((`identify -format %k $1`-1))||Jest także krótszy niż i=$(expr `identify -format "%k" $1` = 1)&&.
Cyfrowa trauma

0

C, 224 205 bajtów

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

Pobiera bitmapę 500 x 500 jako argument wiersza polecenia. Drukuje RGB pliku, np. 255,255,255Lub0 jeśli plik nie jest stały. Prawdopodobnie ulega awarii, jeśli nie podano pliku.

Ciekawe punkty do zapamiętania:

  • Zastosowania void*w miejscu, którego FILE*należy unikać, w tym<stdio.h>
  • Używa prostej forpętli z, i%3aby ustalić, czy wszystkie bajty są takie same
  • Można bardzo grać w golfa, napisałem odpowiedź na 50 bajtów
  • BMP przechowuje kolory jako BGR, więc mniej więcej czyta wstecz

0

JavaScript + HTML, 143 + 23 = 166 bajtów

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>

Spróbuj:

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>

Mniej golfa:

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 bajtów

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

Skrypt testu mniej golfowego:

$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"
}
  • Uwaga 1 : wyrażenie 499..0*500oznacza: powtórz 500 razy zakres od 499 do 0
  • Uwaga 2 : ekspresja $b|% G*l $_ $y jest skrót dla $b.GetPixel($_,$y). Ta sztuczka jest przydatna przy gofingu, ale spowalnia kod.

Wyjście z $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:

Wyjście z $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:

Wyjaśnienie:

  • skrypt tworzy tablicę każdego koloru piksela.
  • skrypt ma zastosowanie gu(alias Get-Unique ) do tablicy kolorów.
  • jeśli wynikiem hujest pojedynczy element (właściwość rankma wartość tylko dla tablicy), wówczas wypisz wartość dziesiętną R, G, B tego elementu

0

Python 2 + OpenCV + NumPy: 66 znaków

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

Wynik:

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

18:15 ~/colors $ 

OpenCV jest w stanie odczytać obraz i zwrócić go jako macierz N-wymiarową. NumPy służy do testowania pierwszego piksela względem innych i drukowania wartości RGB lub pustego.


0

PHP, 88 bajtów

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

funkcja anonimowa przyjmuje indeksowany zasób obrazu PHP jako parametr, przyjmuje kolor w pierwszym polu palety, zwraca kod koloru lub 0.

program, 96 bajtów

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

pobiera nazwę pliku GIF z argumentu, drukuje kod koloru lub nic. Uruchom z php -r '<code>' <filename.gif>.

dla prawdziwych kolorowych obrazów, 113 112 bajtów

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

jak wyżej, ale wymaga prawdziwego kolorowego obrazu.

program, 122 116 bajtów

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

jak wyżej, ale wymaga pliku PNG.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.