Учитывая три целых числа rgb, выведите шестнадцатеричное представление в виде строки.
Input: Output:
72 61 139 #483D8B
75 0 130 #4B0082
0 255 127 #00FF7F
Самый короткий неортодоксальный код выигрывает
Учитывая три целых числа rgb, выведите шестнадцатеричное представление в виде строки.
Input: Output:
72 61 139 #483D8B
75 0 130 #4B0082
0 255 127 #00FF7F
Самый короткий неортодоксальный код выигрывает
Ответы:
Я собирался больше для "неортодоксальной" части. ;)
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
Не совсем неортодоксальный, но довольно короткий
4h$
пример
q)4h$ 72 61 139
0x483d8b
Чтобы точно соответствовать формату вывода в вопросе, мы можем сделать (для 9 символов):
"#",/$4h$
Благодаря @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)
}
)
foreach($i in 1,2,3)чтобы уменьшить его до 68 символов.
foreachв PowerShell. (По крайней мере, я не смог заставить некоторые тестовые прогоны работать.) Однако, используя правильный синтаксис, встроенный псевдоним и другой ярлык PowerShell, который я недавно обнаружил, я думаю, что у меня есть кое-что лучше, бритье еще 12 символов от вашего предложения. (1..3)|%{...}(Вместо многоточия вставить оператор в скобках из существующего сценария.) Мне все еще нужно полностью проверить это в сценарии, но спасибо, что указали мне в этом направлении!
(1..3)|%работает и довел сценарий до 56 символов. Я отредактирую это в ответе, и определенно благодарю вас за идею. Еще раз спасибо!
-join: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)}).
(Спасибо @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
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'> </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"
Это отобразит окно браузера с:

Где вы могли бы вращать колесико мыши, чтобы изменить значения (с нажатой клавишей Shift для шага на 15) ...
printf \#%02X%02X%02Xчто этого достаточно.
d+=${c[$b$a 0x10]}что-то сексуальное !
d+=${c[$b$a 020]}, сделаю работу и хорошо выглядишь
perl -nE 'say"#",map{unpack H2,chr}split'
Трудно сделать такую короткую программу неортодоксальной, но я думаю, что это работает.
unpackвопрос: можете ли вы сделать шестнадцатеричный верхний регистр, как в вопросе?
unpack, но безуспешно. Одним из способов является использование sprintfвместо unpack, но это длиннее и полностью ортодоксально. Другой способ - просто изменить строку в верхний регистр: map{uc unpack H2,chr}по цене трех символов.
packи unpackникогда не попадают в мой стиль кодирования. Так что это неортодоксально для меня достаточно.
trace("#"+(72<<16|61<<139|b).toString(16));
Выход: #483D8B
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
"#"or>1[:82*%:}-82*,86*+:"9"v
;^?l ]o+*7)"9":+*68o+*7)<
Воспользовался потраченным впустую пробелом и перенес в него некоторый код
Запустить с помощью входов командной строки:
python fish.py generateHex.fish -v 255 36 72
вывод: "# FF2448"
: D 0 <<# # # #> TYPE #>> ; 35 EMIT HEX SWAP ROT D D D DECIMAL
1 1 1выводы #010101. Любые другие значения 0-255 также работают. Какую среду или вперед вы используете?
int r,g,b;
scanf("%d %d %d",&r,&b,&g);
printf("#%06x",r<<16|g<<8|b);
стандартное использование printf & bit twiddler
readf? Не должно ли это быть scanf?
[#]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
(Но нужно вводить числа в отдельных строках.)
[#]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
dcэтом сайте недостаточно ответов.
JavaScript, 89 символов
console.log('#' + ('00000' + eval('256*(256*(' + DEC.replace(/ /g, ')+')).toString(16)).slice(-6))
Обращенные 72 61 139к 256*(256*(72)+61)+139и Evals его.
eval('(('+DEC.replace(/ /g,'<<8)+'))вместо того, eval('256*(256*('+DEC.replace(/ /g,')+'))чтобы сохранить 5 символов!
'#'+-join(-split(read-host)|%{'{0:X2}'-f+$_})
Или, если это может быть использовано путем передачи данных, вы можете просто использовать
'#'+-join(-split"$input"|%{'{0:X2}'-f+$_})
что снижает его до 42 .
-splitи -join.
сэкономил один байт благодаря 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
[byte]нам даны входные данные в виде целых чисел, и отредактировать ваш вывод так, чтобы "#$o"- это дает 31 байт для$args|%{$o+="{0:X2}"-f$_};"#$o"
main(){int a,b,c;scanf("%d%d%d",&a,&b,&c);printf("#%02X%02X%02X",a,b,c);}
Скучная C программа - очень православная.
x=lambda y: ("0"+hex(int(y))[2:])[-2:]
print "#"+''.join(map(x,input().split()))
Я ищу лучший способ обработки однозначных шестнадцатеричных значений. Есть идеи?
Блеф, дублированный код. Ну что ж. Просто прямая реализация преобразования оснований.
"#",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
(Примечание: печатает «#» перед чтением ввода - задача не запрещает этого; при наличии трех чисел на стандартном выводе он выводит правильный вывод на стандартном выводе. Он также не беспокоит переводы строк, и, как вы можете видеть, это не не добавляйте '#' правильно при запуске "в интерактивном режиме".)
Запрашивает от 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.
Если допускается также нижний регистр, то 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}
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
f = StringJoin["#", IntegerString[#, 16, 2]] &
rgbs = {{72, 61, 139}, {75, 0, 130}, {0, 255, 127}}
f /@ rgbs // Column
# 483d8b
# 4b0082
# 00ff7f
h=>'#'+h.split` `.map(x=>(x<16?0:'')+(x*1).toString(16)).join``
x=>(x<16?0:'')+x.toString(16)
r=в начале. Он по-прежнему считается как функция, даже как анонимная функция, поскольку вы можете вызывать ее, не назначая ничего.
x=>(x<16?0:'')+(x*1).toString(16)Ваша и моя первая там в настоящее время дают неправильные значения дляx>9 .
#7261139вместо #483D8Bпервого теста.
'#'+''.join([hex(int(i))[2:].upper() for i in input()])