Колір RGB від шестигранної


13

З урахуванням трьох цілих чисел rgb, виведіть шістнадцяткове подання у вигляді рядка.

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

Виграє найкоротший самий неортодоксальний код


16
Наш FAQ задає, що всі запитання на цьому веб-сайті ... повинні мати об'єктивний первинний критерій виграшу, щоб можна було безперечно вирішити, який запис має виграти. . Найкоротший - об'єктивний, але "найбільш неортодоксальний" - ні. Також тег коду-гольфу слід використовувати лише в тому випадку, якщо умова виграшу - це лише найкоротший код; і тег коду-виклику слід використовувати лише в тому випадку, якщо тег код-гольф відсутній.
Пітер Тейлор

і прийміть переможця раніше, ніж певний час (в цьому випадку не було навіть 24 години) відштовхує на подальший внесок ...
woliveirajr

@PeterTaylor Вибачте, я обов'язково прочитаю вказівки відтепер :( Я думаю, ви маєте рацію, неортодоксальний - це дуже розпливчасто
Quillion

Відповіді:


14

Ruby: 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

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

q / k (3 символи)

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

4h$

Приклад

q)4h$ 72 61 139
0x483d8b

Щоб точно відповідати вихідному формату у питанні, ми можемо зробити (для 9 знаків):

"#",/$4h$

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

Безголовка, з коментарями:

# 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 символів.
манатура

@manatwork Я не думаю, що це правильний синтаксис для foreachPowerShell. (Принаймні, мені не вдалося отримати кілька тестових циклів для роботи.) Однак, використовуючи правильний синтаксис, вбудований псевдонім та інший ярлик PowerShell, який я нещодавно виявив, я думаю, що у мене щось краще, гоління ще 12 символів від вашої пропозиції. (1..3)|%{...}(Вставте скобочку із наявного сценарію замість еліпсиса.) Мені все ж потрібно повністю перевірити це в сценарії, але дякую, що вказали на мене в цьому напрямку!
Іссі

Не маю уявлення, належний це синтаксис чи ні, але посилання на SS64 foreachзгадує про це, і це працює для мене. (Поняття про версію. Поняття не має. Той, що поставляється з Windows 7.)
манатура

@manatwork Це цікаво. Я хотів би розкопатись і з’ясувати, що не так у цьому (я отримував "несподіваний жетон" у "..." помилках) в інший раз. Можливо, стаття SS64 була написана для іншої версії PowerShell - я не впевнений. На даний момент я підтвердив, що це (1..3)|%працює і зводить сценарій до 56 символів. Я відредагую це у відповідь і обов'язково подякую вам за ідею. Знову дякую!
Іссі

2
Ой, даг. Ви можете отримати це до 41 за допомогою -join: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)}).
Joey

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

Додано 06.10.2015: 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 шестигранний переглядач перетворювача

Де ви могли закатати колесо миші для зміни значень (при цьому клавіша Shift утримується для кроку на 15) ...


Насправді закінчувальний новий рядок не запитували, і лише "#" потребує виходу, тому printf \#%02X%02X%02Xдостатньо.
манатура

Додано ще неортодоксальний метод :
Ф. Хаурі

Лол. Ця внутрішня петля справді шокуюче неортодоксальна.
манатство

@manatwork дякую, я знаходжу d+=${c[$b$a 0x10]}щось сексуальне !
Ф. Хаурі

1
... або, можливо d+=${c[$b$a 020]}, зроблять роботу і виглядатимуть приємно
Ф. Хаурі

3

Perl, 31 символ

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

Важко зробити таку коротку програму неортодоксальною, але я думаю, що це працює.


Мені подобається ця відповідь :) ще кілька, і я думаю, що я можу вирішити це, якщо нічого кращого не обернеться.
Квільйон

Класно! Лише unpackпитання: чи можете ви зробити шістнадцятковий a..f верхній регістр, як у запитанні?
манатура

@manatwork Я намагався знайти спосіб зробити це всередині unpack, але не пощастило. Один із способів - використовувати sprintfзамість цього unpack, але це довше і повністю ортодоксально. Інший спосіб - просто змінити рядок у верхній регістр: map{uc unpack H2,chr}вартістю трьох символів.
хлібопічка

Дякую, @breadbox. Ці хитрі маленькі packі unpackніколи не потрапляють у мій стиль кодування. Тож досить неортодоксально для мене.
манатура

Неправильний підрахунок. Це складає 30 чар!
Ф. Хаурі

3

Сценарій дій 3 | 43 символи

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

Вихід: #483D8B


Ви не можете тут скинути багато білого простору? Я не знаю сценарію дій, але вони не здаються потрібними
Cruncher

@Cruncher Так, вибачте, одна з моїх перших відповідей тут.
Ілля Газман

2
Убийте крапку з комою в кінці, щоб зберегти чарочку
Дорнобрук

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

2

По-четверте, 62 символи

: D 0 <<# # # #> TYPE #>> ; 35 EMIT HEX SWAP ROT D D D DECIMAL

не працює для 1 1 1, який повинен вивести # 010101
храповик виродка

Привіт @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 та біт-твітлерів


Зачекайте 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

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 його.


Хороший, але не вдається на третьому зразку, розміщеному у запитанні.
манатура

Ах, гарний дзвінок. Виправлено.
Кейсі Чу

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

корпус 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

Ви можете зберегти пару байтів, позбавившись від того, [byte]як нам подано введення цілими числами, і відредагуйте ваш вихід, щоб бути "#$o"- що дає 31 байт для$args|%{$o+="{0:X2}"-f$_};"#$o"
AdmBorkBork

@TimmyD не знаю, чи видалення [байта] працює правильно у всіх версіях у версії, в якій я тестував (iirc 2.0 в xp) без [байт], це не було поєднанням як шістнадцятковий, але як ints, тобто 72 61 139 було # 7261139 не # 483d8b Внутрішні котирування "# $ o" - це не буквальний рядок, але оцінено рядок, приємно знати,
дякують

Мабуть, різниця між PowerShell v2 і v3 - повинна бути дещо в тому, як відповідна версія .NET обробляє шістнадцятковий переклад, але я не можу знайти документацію на нього.
AdmBorkBork

2

R, 16 байт

Це воно. Використовуйте вбудований.

rgb(r,g,b,m=255)


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 символів

Bleh, дубльований код. Що ж, добре. Просто пряма реалізація конверсії радіусів.

"#",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

(Примітка: перед зчитуванням введення друкується символ "#" - завдання не забороняє цього; з урахуванням трьох цифр на stdin він створює правильний вихід у stdout. Він також не турбується з новими рядками, і як ви бачите, це не робить 't не додавати' # 'належним чином під час запуску "інтерактивно".)


1

Мова виробника ігор, 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.

Джерело


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

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}

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

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

0

Clojure 76 персонажів

Це може бути пізно, заради повноти:

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

Приклад дзвінків:

(hexy 0 255 127)
"#00FF7F"

0

Математика, 40 символів

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

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

f /@ rgbs // Column

# 483d8b

# 4b0082

# 00ff7f


0

Лист звичайний, 39 символів

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

Прочитайте три цілих числа, поверніть рядок.


0

Javascript ES6, 63 байти

h=>'#'+h.split` `.map(x=>(x<16?0:'')+(x*1).toString(16)).join``

Випадково я закінчив писати майже те саме, що і ви, перш ніж я побачив вашу. Дуже приємно =) Вони досить близькі, що я не x=>(x<16?0:'')+x.toString(16)
розміщу

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

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