Цвет RGB int в hex

13

Учитывая три целых числа rgb, выведите шестнадцатеричное представление в виде строки.

Input:          Output:
72 61 139       #483D8B
75 0 130        #4B0082
0 255 127       #00FF7F

Самый короткий неортодоксальный код выигрывает

Quillion
источник
16
В нашем разделе часто задаваемых вопросов говорится, что все вопросы на этом сайте ... должны иметь объективный критерий первичного выигрыша, чтобы можно было безоговорочно решить, какая заявка должна выиграть. , Самое короткое - это объективно, а «самое неортодоксальное» - нет. Так же тег code-golf следует использовать только в том случае, если условием выигрыша является только самый короткий код; и тег code-challenge должен использоваться, только если тег code-golf не используется.
Питер Тейлор
и принять победителя раньше времени (в данном случае, даже не 24
часа
@PeterTaylor Извините, теперь я обязательно прочитаю инструкции :( Я думаю, вы правы, что неортодоксально очень расплывчато
Quillion

Ответы:

14

Рубин: 19 символов

$_=?#+"%02X"*3%$F

Образец прогона:

bash-4.1$ ruby -pae '$_=?#+"%02X"*3%$F' <<< '72 61 139'
#483D8B

bash-4.1$ ruby -pae '$_=?#+"%02X"*3%$F' <<< '75 0 130'
#4B0082

bash-4.1$ ruby -pae '$_=?#+"%02X"*3%$F' <<< '0 255 127'
#00FF7F
manatwork
источник
16

Рубин

Я собирался больше для "неортодоксальной" части. ;)

10;a=    gets.   split
.  map  {|       x|  #x
"%02X"  %(  x.   to_i)
}; $>   <<   ?#  <<  a[
00  ..   1+2].   join;

Шрифт (в моем веб-браузере) немного высокий, поэтому выглядит искаженным, но в Courier New он выглядит лучше:

образ

Образец прогона:

c:\a\ruby>rgb2hex
255 100 0
#FF6400
Дверная ручка
источник
Это гений!
Альберт Реншоу
6

к / к (3 знака)

Не совсем неортодоксальный, но довольно короткий

4h$

пример

q)4h$ 72 61 139
0x483d8b

Чтобы точно соответствовать формату вывода в вопросе, мы можем сделать (для 9 символов):

"#",/$4h$
skeevey
источник
1
В нем отсутствует знак фунта (#), требуемый для выходных данных примера в вопросе.
Изи
5

PowerShell: 71 52 51 41

Благодаря @manatwork за указание ForEach-Objectможно использовать вместо forцикла.
Спасибо @Joey за указание на то, что я мог бы использовать -joinвывод цикла вместо того, чтобы помещать его в переменные.

Гольф-код:

'#'+-join(1..3|%{"{0:X2}"-f+(read-host)})

Замечания:

Здесь нет проверки ошибок на наличие неверных входных данных. Сценарий с радостью примет 256, 4096 и 65536 в качестве входных данных, а затем выведет # 100100010000 (который, очевидно, не будет работать как RGB).

Ungolfed, с комментариями:

# Put a hashtag in front of the output.
'#'+

# Join the nested code into one string.
-join(

    # Pipe 1..3 to ForEach-Object to run a loop three times.
    1..3|%{

        # Take user input and format it as hex, with minimum two digits in output.
        "{0:X2}"-f+(read-host)
    }
)
Iszi
источник
Сделайте цикл, foreach($i in 1,2,3)чтобы уменьшить его до 68 символов.
manatwork
@ Manatwork Я не думаю, что это правильный синтаксис для foreachв PowerShell. (По крайней мере, я не смог заставить некоторые тестовые прогоны работать.) Однако, используя правильный синтаксис, встроенный псевдоним и другой ярлык PowerShell, который я недавно обнаружил, я думаю, что у меня есть кое-что лучше, бритье еще 12 символов от вашего предложения. (1..3)|%{...}(Вместо многоточия вставить оператор в скобках из существующего сценария.) Мне все еще нужно полностью проверить это в сценарии, но спасибо, что указали мне в этом направлении!
Изи
Не знаю, правильный ли это синтаксис или нет, но ссылка на SS64 foreachупоминает его, и он работает для меня. (
Понятия
@manatwork Это интересно. Я хотел бы покопаться и выяснить, что с этим не так (я получал "неожиданный токен в" ... "ошибках) в другой раз. Возможно, статья SS64 была написана для другой версии PowerShell - я не уверен. На данный момент я подтвердил, что (1..3)|%работает и довел сценарий до 56 символов. Я отредактирую это в ответе, и определенно благодарю вас за идею. Еще раз спасибо!
Изи
2
О, черт. Вы можете получить это до 41 с помощью -join: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)}).
Джои
4

Баш 22 21 символов

(Спасибо @manatwork за использование 1 символа \вместо двойных кавычек)

printf \#%02X%02X%02X 12 12 12 
#0C0C0C

или чтение STDIN в цикле: 48 символов:

while read f;do printf "#%02X%02X%02X\n" $f;done <<<$'72 61 139\n75 0 130\n0 255 127'
#483D8B
#4B0082
#00FF7F

Добавлено 2015-10-06: bash (более неортодоксальный метод) 84 83 символа

c=({0..9} {a..f}) d=\#;for b;do for a in / %;do d+=${c[$b$a 020]};done;done;echo $d

Я знаю, это может быть 82 символа, если 020где написано 16, но я предпочитаю это ... Или, может быть, d+=${c[$b$a 0x10]}это был первый пост.

hexcolor() {
    local a b c=({0..9} {a..f}) d=\#
    for b ;do
        for a in / % ;do
            d+=${c[$b$a 0x10]}
        done
    done
    echo $d
}
hexcolor 72 61 139
#483d8b
hexcolor 75 0 130
#4b0082
hexcolor 0 255 127
#00ff7f

Еще один подход

#!/bin/bash
browser=firefox   #  google-chrome iceweasel
url="data:text/html;charset=UTF-8,<html><head></head><body>"
url+="<script type='text/javascript'>
  function h(i){var h=i.toString(16);if(16>1*i)h='0'+h;
  return h};function C(r,g,b){return'\043'+h(r)+h(g)+h(b)};
  function m(){ var r=1.0*R.value; var g=1.0*G.value; var b=1.0*B.value;
   var fore='black';if(384>r+g+b)fore='white';var c=C(r,g,b);
   s.setAttribute('style','background:'+c+';color:'+fore+';');s.innerHTML=c};
  function w(e){console.log(e);var val=e.target.value;var q=1;if(e.shiftKey)
  q=15;if(e.detail){if(e.detail>0){q=0-q;}}else if(0>e.wheelDelta){q=0-q;};
  val=1*val+q;if(val>255)val=255;if(0>val)val=0;e.target.value=val;m(); };
  function k(e){console.log(e);var val=e.target.value;var q=1;if(e.shiftKey)q=
  15;if(e.keyCode==38){val=1*val+q;if(val>255)val=255;e.target.value=val;m();}
  else if(e.keyCode==40){val=1*val-q;if(0>val)val=0;e.target.value=val;m();}};
  function n(){R=document.getElementById('R');G=document.getElementById('G');
    B=document.getElementById('B');s=document.getElementById('s');
    R.addEventListener('DOMMouseScroll',w);R.addEventListener('mousewheel',w);
    G.addEventListener('DOMMouseScroll',w);G.addEventListener('mousewheel',w);
    B.addEventListener('DOMMouseScroll',w);B.addEventListener('mousewheel',w);
  m();};var R, G, B, s;window.onload=n;
  </script><style>div{display:inline-block;width:10em;}</style>
  <div id='s'>&nbsp;</div>"
input="%s:<input type='text' size='5' value='200'"
input+=" onKeyDown='k(event)' onChange='m()' id='%s' />"
for c in R G B ;do
    printf -v add "$input" $c $c
    url+="$add"
  done    
$browser "$url"

Это отобразит окно браузера с:

RGB int 2 hex Viewer Converter

Где вы могли бы вращать колесико мыши, чтобы изменить значения (с нажатой клавишей Shift для шага на 15) ...

Ф. Хаури
источник
На самом деле завершающий символ новой строки не был запрошен, и нужно только экранировать «#», так printf \#%02X%02X%02Xчто этого достаточно.
manatwork
Добавлен более неортодоксальный метод :
Ф. Хаури
Лол. Эта внутренняя петля действительно шокирующе неортодоксальна.
manatwork
@ Manatwork спасибо, я нахожу d+=${c[$b$a 0x10]}что-то сексуальное !
Ф. Хаури
1
... или, может быть d+=${c[$b$a 020]}, сделаю работу и хорошо выглядишь
Ф. Хаури
3

Perl, 31 символ

perl -nE 'say"#",map{unpack H2,chr}split'

Трудно сделать такую ​​короткую программу неортодоксальной, но я думаю, что это работает.

Хлебница
источник
Мне нравится этот ответ :) еще несколько, и я думаю, что я мог бы остановиться на этом, если ничего лучше не катается.
Quillion
Здорово! Просто unpackвопрос: можете ли вы сделать шестнадцатеричный верхний регистр, как в вопросе?
manatwork
@manatwork Я пытался найти способ сделать это внутри unpack, но безуспешно. Одним из способов является использование sprintfвместо unpack, но это длиннее и полностью ортодоксально. Другой способ - просто изменить строку в верхний регистр: map{uc unpack H2,chr}по цене трех символов.
хлебница
Спасибо, @breadbox. Эти хитрые маленькие packи unpackникогда не попадают в мой стиль кодирования. Так что это неортодоксально для меня достаточно.
manatwork
Неправильный счет. Это делает 30 символов!
Ф. Хаури
3

Action Script 3 | 43 персонажа

trace("#"+(72<<16|61<<139|b).toString(16));

Выход: #483D8B

Илья Газман
источник
Разве вы не можете оставить здесь много пустого пространства? Я не знаю Action Script, но они не выглядят необходимыми
Cruncher
@ Cruncher да извините, один из моих первых ответов здесь.
Илья Газман
2
Убейте точку с запятой в конце, чтобы сохранить символ
Doorknob
3

Perl 24 символа

perl -ne 'printf"#"."%02x"x3,split'
13 31 133
#0d1f85

Извините, это не так сексуально, как использование unpack, но короче!

Более неясная версия:

Но если вы действительно предпочитаете использовать unpack, то вы можете:

$==24;s/\d+[\n ]*/{$=-=8;($&<<$=).do{rand>.5?qw<+>[0]:"|"}}/eg;$_=
pack("N",eval($_.587.202.560));say$1,unpack("H6",$2)if/^(.)(.*)$/s

Для примера, это не укороченная версия, но она мне нравится! (Обратите внимание на использование randдля оценки этого :-)

perl -nE '
    $==24;s/\d+[\n ]*/{$=-=8;($&<<$=).
    do{rand>.5?qw<+>:"|"}}/eg;$_=pack(
    "N",eval($_.587.202.560) );say $1,
    unpack("H"."6",$2) if /^(.)(.*)$/s
  ' <<< $'72 61 139\n75 0 130\n0 255 127'
#483d8b
#4b0082
#00ff7f
Ф. Хаури
источник
3

> <> 103 60

"#"or>1[:82*%:}-82*,86*+:"9"v
    ;^?l ]o+*7)"9":+*68o+*7)<

Воспользовался потраченным впустую пробелом и перенес в него некоторый код

Запустить с помощью входов командной строки:

python fish.py generateHex.fish -v 255 36 72

вывод: "# FF2448"

Cruncher
источник
Предоставим объяснения по запросу. Если вы можете понять это, я бы предпочел не беспокоиться
Cruncher
2

Далее 62 персонажа

: D 0 <<# # # #> TYPE #>> ; 35 EMIT HEX SWAP ROT D D D DECIMAL
Даррен Стоун
источник
не работает для 1 1 1, который должен вывести # 010101
freak
Привет @ratchetfreak. Меня устраивает. Только что проверил с gforth. Давать ей 1 1 1выводы #010101. Любые другие значения 0-255 также работают. Какую среду или вперед вы используете?
Даррен Стоун
2

C (67 символов без основного шаблона)

int r,g,b;
scanf("%d %d %d",&r,&b,&g);
printf("#%06x",r<<16|g<<8|b);

стандартное использование printf & bit twiddler

чокнутый урод
источник
Подожди readf? Не должно ли это быть scanf?
хлебница
@breadbox ах да, я провел слишком много времени в D; в любом случае нет никакой разницы в количестве символов
странный урод
2

Dc: 35 32 символа

[#]n16o?ShShSh[Lhd16/n16%n]ddxxx

Образец прогона:

bash-4.1$ dc -e '[#]n16o?ShShSh[Lhd16/n16%n]ddxxx' <<< '72 61 139'
#483D8B

bash-4.1$ dc -e '[#]n16o?ShShSh[Lhd16/n16%n]ddxxx' <<< '75 0 130'
#4B0082

bash-4.1$ dc -e '[#]n16o?ShShSh[Lhd16/n16%n]ddxxx' <<< '0 255 127'
#00FF7F

Dc: 27 24 символа

(Но нужно вводить числа в отдельных строках.)

[#]n16o[?d16/n16%n]ddxxx

Образец прогона:

bash-4.1$ dc -e '[#]n16o[?d16/n16%n]ddxxx' <<< $'72\n61\n139'
#483D8B

bash-4.1$ dc -e '[#]n16o[?d16/n16%n]ddxxx' <<< $'75\n0\n130'
#4B0082

bash-4.1$ dc -e '[#]n16o[?d16/n16%n]ddxxx' <<< $'0\n255\n127'
#00FF7F
manatwork
источник
2
На dcэтом сайте недостаточно ответов.
хлебница
2

JavaScript, 89 символов

console.log('#' + ('00000' + eval('256*(256*(' + DEC.replace(/ /g, ')+')).toString(16)).slice(-6))

Обращенные 72 61 139к 256*(256*(72)+61)+139и Evals его.

Кейси Чу
источник
Хороший, но не в 3-м образце, опубликованном в вопросе.
manatwork
Ах, хороший звонок. Исправлена.
Кейси Чу
2
Используя eval('(('+DEC.replace(/ /g,'<<8)+'))вместо того, eval('256*(256*('+DEC.replace(/ /g,')+'))чтобы сохранить 5 символов!
Ф. Хаури
2

PowerShell, 45

'#'+-join(-split(read-host)|%{'{0:X2}'-f+$_})

Или, если это может быть использовано путем передачи данных, вы можете просто использовать

'#'+-join(-split"$input"|%{'{0:X2}'-f+$_})

что снижает его до 42 .

детеныш
источник
Хорошо сделано! Шоу мне еще многое предстоит узнать о гольфе!
Изи
О, ваша идея с переменными тоже была умной; никогда бы не приходил мне в голову. Так уж получилось, что он длиннее моего обычного фаворита: -splitи -join.
Джои
2

PowerShell 37

сэкономил один байт благодаря TimmyD

cat rgb2hex.ps1
$args|%{$o+="{0:X2}"-f[byte]$_};"#$o"
wc -c rgb2hex.ps1
38 rgb2hex.ps1
powershell -f .\rgb2hex.ps1 72 61 139
#483D8B
powershell -f .\rgb2hex.ps1 0 255 127
#00FF7F
blabb
источник
Вы можете сэкономить пару байтов, избавившись от того, что [byte]нам даны входные данные в виде целых чисел, и отредактировать ваш вывод так, чтобы "#$o"- это дает 31 байт для$args|%{$o+="{0:X2}"-f$_};"#$o"
AdmBorkBork
@TimmyD не знаю, работает ли удаление [byte] правильно во всех версиях в версии, в которой я тестировал (iirc 2.0 в xp) без [byte], оно не было конкатенацией как шестнадцатеричное, а как целые, то есть 72 61 139 было # 7261139 не # 483d8b «# $ o» внутри кавычек не является строковым литералом, но оцениваемая строка приятно знать, спасибо, что комментарии по поводу преобразования в шестнадцатеричные будут оценены
blabb
Очевидно, это разница между PowerShell v2 и v3 - должно быть, что соответствующая версия .NET обрабатывает шестнадцатеричное преобразование, но я не могу найти документацию по нему.
AdmBorkBork
2

R, 16 байт

Вот и все. Используйте встроенный.

rgb(r,g,b,m=255)
Дж.
источник
1

C 67 67 символов (65 символов без основного)

main(){int a,b,c;scanf("%d%d%d",&a,&b,&c);printf("#%02X%02X%02X",a,b,c);}

Скучная C программа - очень православная.

Ян Джеймс
источник
не работает с ab или c меньше 16
чокнутый урод
Изменено% X на% 02X.
Ян Джеймс
1

Python 2.7 (80 символов)

x=lambda y: ("0"+hex(int(y))[2:])[-2:]
print "#"+''.join(map(x,input().split()))

Я ищу лучший способ обработки однозначных шестнадцатеричных значений. Есть идеи?

Уилл Коггинс
источник
Может быть, использовать формат строки? «% 02x» - это то, что сделали все остальные.
JQBLZ
1

Befunge-98, 45 персонажей

Блеф, дублированный код. Ну что ж. Просто прямая реализация преобразования оснований.

"#",v
7*+,>#@&:97+/"0"+:"9"`7*+,97+%"0"+:"9"`

Пробный прогон

% cfunge tohex.98 <<<'72 61 139'
#483D8B
% cfunge tohex.98
#75 0 130
4800820 255 127
00FF7F

(Примечание: печатает «#» перед чтением ввода - задача не запрещает этого; при наличии трех чисел на стандартном выводе он выводит правильный вывод на стандартном выводе. Он также не беспокоит переводы строк, и, как вы можете видеть, это не не добавляйте '#' правильно при запуске "в интерактивном режиме".)

Светляк
источник
1

Game Maker Language, 175 (ошибка в позиции 81)

Запрашивает от 3 до 9 цифр RGB. Возвращает шестнадцатеричное с шестнадцатеричным знаком GML,$

d=get_string('','')if(d=='')e=""else e="00"h="0123456789ABCDEF"while(d!=''){b=d&255i=string_char_at(h,byte div 16+1)l=string_char_at(h,byte mod 16+1)e+=i+l;d=d>>8}return '$'+e

Сделайте это сценарием. Кроме того, скомпилируйте с неинициализированными переменными, обработанными как 0.

Источник

Timtech
источник
1

Гема, 93 персонажа

\B=@set{x;0123456789abcdef}\#
<D>=@substring{@div{$1;16};1;$x}@substring{@mod{$1;16};1;$x}
?=

Образец прогона:

bash-4.3$ gema '\B=@set{x;0123456789abcdef}\#;<D>=@substring{@div{$1;16};1;$x}@substring{@mod{$1;16};1;$x};?=' <<< '0 255 127'
#00ff7f
manatwork
источник
1

Бурлск, 12 байтов (10 байтов в нижнем регистре)

Если допускается также нижний регистр, то 10 байтов:

psb6\['#+]

Использование:

blsq ) "72 61 139"psb6\['#+]
"#483d8b"

Если вам отчаянно нужны заглавные буквы, добавьте ZZ:

blsq ) "72 61 139"psb6\['#+]ZZ
"#483D8B"

Если вы не получили целые числа, как в строке, то используйте:

blsq ) {72 61 139}b6\['#+]
"#483d8b"

Объяснение:

ps -- parse string
b6 -- to hex
\[ -- concat
'#+] -- prepend #

Попробуйте онлайн здесь .

Бонус:

Чтобы преобразовать его обратно, используйте это:

blsq ) "#483d8b"[-2cob6
{72 61 139}
mroman
источник
1

Powershell, 28 байт

'#{0:X2}{1:X2}{2:X2}'-f$args

Тестовый скрипт:

$f = {

"#{0:X2}{1:X2}{2:X2}"-f$args
}

@(
    ,('#483D8B',72, 61, 139)
    ,('#4B0082',75,  0, 130)
    ,('#00FF7F',0 ,255, 127)
) | % {
    $e,$a = $_
    $r = &$f @a
    "$($r-eq$e): $r"
}

Выход:

True: #483D8B
True: #4B0082
True: #00FF7F
Mazzy
источник
0

Python3,3 @ 60 символов

print("#"+3*"%.2X"%tuple(int(n) for n in input().split())) 

Не смог устоять

[dan@danbook:code_golf/int_to_hex]$ python3.3 int_to_hex.py
176 11 30
#B00B1E
danmcardle
источник
0

Clojure 76 символов

Это может быть поздно, для полноты картины:

(defn hexy [r g b] (reduce str (cons "#" (map #(format "%02X" %) [r g b]))))

Пример звонков:

(hexy 0 255 127)
"#00FF7F"
Рысь Луна
источник
0

Mathematica, 40 символов

f = StringJoin["#", IntegerString[#, 16, 2]] &

rgbs = {{72, 61, 139}, {75, 0, 130}, {0, 255, 127}}

f /@ rgbs // Column

# 483d8b

# 4b0082

# 00ff7f

Крис Дегнен
источник
0

Common Lisp, 39 символов

(format()"#~@{~2,'0x~}"#1=(read)#1##1#)

Прочитайте три целых числа, верните строку.

CoreDump
источник
0

Javascript ES6, 63 байта

h=>'#'+h.split` `.map(x=>(x<16?0:'')+(x*1).toString(16)).join``
Mama Fun Roll
источник
По совпадению, я закончил тем, что написал почти то же самое, что и ты, прежде чем увидел твой. Очень хорошо =) Они достаточно близки, чтобы я не стал публиковать мои, но вы можете сэкономить несколько байтов на вашем отображении с этим:x=>(x<16?0:'')+x.toString(16)
Mwr247
1
Кроме того, нет необходимости включать r=в начале. Он по-прежнему считается как функция, даже как анонимная функция, поскольку вы можете вызывать ее, не назначая ничего.
Mwr247
Упс. Имеется ввиду, что карта: x=>(x<16?0:'')+(x*1).toString(16)Ваша и моя первая там в настоящее время дают неправильные значения дляx>9 .
Mwr247
В настоящее время возвращается #7261139вместо #483D8Bпервого теста.
Деннис
0

Python 2, 40 байт

s='#';exec's+="%02X"%input();'*3;print s

Читает ввод из трех отдельных строк. Злоупотребленияexec и умножение строк.

Пример использования:

$ python2 rgbint.py
72
61
139
#483D8B

$ python2 rgbint.py
75
0
130
#4B0082

$ python2 rgbint.py
0
255
127
#00FF7F
jqblz
источник
0

Питон (55 символов)

'#'+''.join([hex(int(i))[2:].upper() for i in input()])
Друв Рамани
источник