Что это за цвет?


9

Вы должны сыграть в гольф программу, которая будет принимать имя файла в качестве ввода, и вы должны вывести, какого цвета файл.

Файл будет иметь любое из этих расширений, но ваша программа должна поддерживать только одно. Пожалуйста, скажите, какой в ​​вашем ответе.

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

А теперь к классическому макету.

вход

Имя файла с одним из вышеуказанных расширений.

Вы также можете взять объект изображения или уже закодированное изображение.

Вывод

Единственный цвет в этом файле в виде 6-значного шестнадцатеричного кода с необязательным начальным символом, #например #000000, черный.

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

Вы не можете выводить прозрачность.

Если файл не весь один цвет, вы должны вывести ложное значение, которое не совпадает, #000000и прекратить работу, ничего не печатая STDERR. Это так, что вы не можете просто открыть файл и получить значение RGB первого пикселя.

правила

  • Шестнадцатеричный код необходимо выводить только в том случае, если файл имеет один цвет.
  • Файл будет в 500x500пикселях
  • Все пиксели будут иметь прозрачность 0%.
  • Это так выигрывает самый короткий код!

Примеры


7
Файл, не являющийся одним цветом, кажется мне ненужным осложнением. И значение Falsey в строго типизированных языках, например C #, может быть только a bool. Для этого случая я бы возвращал a stringдля нормального случая и boolдля ненормального случая, завернутый в object. Это нормально, или я могу вернуть пустую строку или подобное?
TheLethalCoder

5
Также я предлагаю загрузить ваши изображения на i.stack.imgur.com (моя программа не может получить изображение с монтажной
панели

1
У нас есть стандарт по умолчанию для ввода изображений, вы можете найти его в нашей мета здесь . Это не сильно отличается от того, что у вас есть, но вы можете добавить ссылку на него вместо предоставленного.
Павел

6
@Ilikemydog Это имеет значение. Выходные данные «Единственный цвет в этом файле» заставляют респондентов предположить, что изображение будет содержать один цвет. Тогда правила противоречат этому. С другой стороны, было бы намного понятнее, если бы секция вывода читала что-то вроде «Единственный цвет в этом файле или ложное значение, отличное от ..., если изображение содержит более одного цвета». Или, как метко выразился xnor, сбивает с толку, когда основная часть испытания говорит одно, а более поздняя часть говорит другое
Луис Мендо

2
Должны ли мы предполагать, что все файлы всегда будут 3-канальными (по 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массив напрямую, что, вероятно, не то, что означает OP
Луис Мендо

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]?
Габор Фекете

Я предполагаю, что вам понадобится вызов get colors
TheLethalCoder

3

Mathematica, 55 51 байт

-4 благодаря CalculatorFeline

+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вместо этого?
Кевин Круйссен

@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.
Род

Спасибо; не знал , что по крайней мере , забыл
Фун

Несоответствие ужасно :(
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;}

Сохранено 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 байта)
Кевин Круйссен

0

Mathematica, 112 байт

образ

я = Импорт @ "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

Хорошо. Я сделал некоторые изменения.
Спасибо

Допустим ли строчный гекс
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,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). Этот трюк полезен для 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:

Объяснение:

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

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

для изображений истинного цвета, 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.