Якого кольору це?


9

Ви повинні гольфувати програму, яка буде приймати ім'я файлу як вхідне, і ви повинні вивести, якого кольору файл.

У файлі буде будь-яке з цих розширень, але ваша програма повинна підтримувати лише одне. Скажіть, будь ласка, який у своїй відповіді.

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

А тепер до класичної верстки.

Вхідні дані

Ім'я файлу з одним із перелічених вище розширень.

Ви також можете замість цього взяти об’єкт зображення або вже закодоване зображення.

Вихідні дані

Єдиний колір у цьому файлі у вигляді шестизначного шістнадцяткового коду із додатковим провідним, #наприклад #000000, чорним.

Ви також можете вивести список / кортеж / рядок, що містить десяткові або шістнадцяткові значення кольору RGB, з чітким нечисловим роздільником, наприклад, , |тощо

Ви не можете вивести прозорість.

Якщо файл не є одним кольором, потрібно вивести помилкове значення, яке не є #000000і закінчується не надрукуючи нічого STDERR. Це так, що ви не можете просто відкрити файл і отримати значення RGB першого пікселя.

Правила

  • Шістнадцятковий код потрібно виводити лише в тому випадку, якщо файл має один колір.
  • Файл буде 500x500 пікселями
  • Усі пікселі матимуть прозорість 0%.
  • Це є так виграє найкоротший код!

Приклади


7
Файл, який не є одним кольором, просто здається мені зайвим ускладненням. І значення фальси в сильно набраних мовах, наприклад, C #, може бути лише a bool. У цьому випадку я повертаю а stringдля звичайного випадку, а boolдля ненормативного випадку, загорнутого у object. Це добре, чи я можу повернути порожній рядок чи подібне?
TheLethalCoder

5
Також пропоную завантажити свої зображення на i.stack.imgur.com (моя програма не може зняти зображення з картону)
user41805

2
@Phoenix Це те, про що я запитую, чи добре, оскільки це не значення фальси в C # та, ймовірно, інших сильно набраних мовах.
TheLethalCoder

6
@Ilikemydog Це має значення. Скажімо, що результат є "Єдиним кольором у цьому файлі", спонукає відповідачів припускати, що зображення буде містити один колір. Тоді правила суперечать цьому. З іншого боку, було б набагато зрозуміліше, якби у вихідному розділі було прочитано щось на кшталт "Єдиний колір у цьому файлі чи фальшиве значення, відмінне від ... якщо зображення містить більше одного кольору". Або, як так влучно висловлюється xnor, це заплутано, коли тіло виклику говорить одне, а пізніша частина говорить інше
Луїс Мендо

2
Чи варто вважати, що всі файли завжди будуть триканальними (8 біт у кожному) RGB-файлами?
Восьминіг

Відповіді:


6

MATL , 15 12 байт

Yi6Bed~?2MYm

Тестується із зображеннями ".png", поданими у виклику. Можливо, це працює і з іншими розширеннями. Введенням може бути ім'я файлу або URL-адреса зображення.

Вихід - R, G, B десяткових значень, розділених пробілами, або порожній рядок (який є помилковим), якщо є більше одного кольору.

Приклад з першим і останнім тестовими випадками:

введіть тут опис зображення

Пояснення

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масив безпосередньо, що, мабуть, не означає, що означає ОП
Луїс Мендо

1
12 байт ?! Ну, святе пекло!
Кудлатий

4

Bash + core-utils + 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

JavaScript (ES6) + HTML, 315 289 243 218 217 215 211 210 208 байт

Перевірка того, що всі пікселі однакові, додала багато байтів. Це було не набагато більше, ніж коли я тільки перевіряв колір першого пікселя - задоволений цим :)

URL-адреса (абсолютна, відносна, дані або все, що можна використовувати як srcзображення img) бере в якості вхідного даних. Виводить колір 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елемент, щоб працювати у фрагменті. Оскільки витягування зображень із зовнішніх джерел може призвести до видалення помилок, натомість наступні URL-адреси будуть взяті як вхідні дані Base-64. Відмініть останній рядок для тестування різних кольорів, використовуючи зображення, що складається з 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]?
Габор Фекете

Я припускаю, що вам знадобиться дзвінок отримати кольори
TheLethalCoder

3

Математика, 55 51 байт

-4 завдяки калькуляторуFeline

+0 для рефакторингу на повноцінну функцію.

Використання об'єкта зображення Mathematica як вхідного - Import["filename.png"].

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

Повертає 0, якщо не всі одного кольору. Виводить десяткове значення кольору, якщо лише одне.

Пояснення:

                                 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]&
Джуліан Вольф

Я неправильно трактував коментар ОП You may also take an image object or already encoded image instead.. Буде оновлено.
Ян Міллер

@CalculatorFeline Дякую за підказку про Join@@.
Ян Міллер

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 за те, що він оновив мене щодо зміни правил, що дозволило зробити багато гольфу
-46 байт завдяки @KevinCruijssen та виправленому помилкові помилки


You may also take an image object or already encoded image instead.Оновлений OP може бути в змозі зберегти байти ...
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 (або вище). ;)
Кевін Круїссен

1

Python 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.Оновлений OP може бути в змозі зберегти байти ...
TheLethalCoder

Я б очікувати від PIL імпорту * заощадити кілька байт (або як альтернативи, імпорт PIL , а потім з = PIL.Image) якщо я не з видом на що - то
Фун

@Foon PIL- виняток з імпорту, ви не можете зробити from PIL import*ніPIL.
Rod

Дякую; не знав цього чи принаймні забув
Foon

Невідповідність жахлива :(
КалькуляторFeline

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

Збережено 3 байти завдяки @Kevin Cruijssen.

Якщо нам не потрібно було додатково перевіряти, чи є зображення однакових кольорів, це лише 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

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.Оновлений OP може бути в змозі зберегти байти ...
TheLethalCoder

добре. Я вніс кілька змін.
Дякую

Чи прийнятний шістнадцятковий шестигранник?
користувач202729

Most@PixelValue[i, {1, 1}, "Byte"]збереже кілька байт.
користувач202729

103 байти: If[Length@Tally[a=i~ImageData~"Byte"]<2,"#"<>StringPadLeft[Most@a[[1,1]]~IntegerString~16,2,"0"],False]- використовуйте функцію ImageData. Не знав, що існує.
користувач202729

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,255, або0 якщо файл не є постійним. Можливо, погано виходить з ладу, якщо файл не надається.

Цікаві моменти, які слід зазначити:

  • Використовує 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означає: повторити 500 разів у діапазоні від 499 до 0
  • Примітка 2 : вираз $b|% G*l $_ $y є ярликом для $b.GetPixel($_,$y). Цей трюк корисний при гоффінгу, але він уповільнює код.

Вихід з $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:

Пояснення:

  • сценарій створює масив кожного кольору пікселів.
  • сценарій застосовується gu(псевдонім для Get-Unique ) до кольорового масиву.
  • якщо результат hu- один елемент (властивість rankмає значення лише для масиву), тоді виводиться десяткове значення R, G, B цього елемента

0

Python 2 + OpenCV + NumPy: 66 символів

color.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>.

для справжніх кольорових зображень, 113 112 байт

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.