สีสันของสี


23

คุณจะได้รับค่า RGB ของสี งานของคุณง่ายมาก: เพื่อคำนวณค่าในคำจำกัดความที่ง่ายที่สุด

พูดว่าช่องที่มีค่าสูงสุดกลางและต่ำสุดคือ X, Y, Z (ซึ่งมีทั้งสีแดงสีเขียวหรือสีน้ำเงิน) และค่าของมันคือ x, y, z สีสันของสีนี้คือ (h (X) -h (Y)) * (1 + (xy) / (xz)) / 2 + h (Y) โดยที่:

h(red) = 0 (or 360 if one of X or Y is blue)
h(green) = 120
h(blue) = 240

อินพุตประกอบด้วย 3 จำนวนเต็มตั้งแต่ 0 ถึง 255 ซึ่งไม่เท่ากันทั้งหมดตามลำดับที่สอดคล้องกัน ผลลัพธ์สามารถลอยหรือจำนวนเต็มกลมทั้งขึ้นหรือลงซึ่งไม่จำเป็นต้องสอดคล้อง หากส่วนจำนวนเต็มของผลลัพธ์เป็น 0 หรือ 360 คุณสามารถพิมพ์อย่างใดอย่างหนึ่ง

คุณไม่สามารถเรียก builtins สำหรับการแปลงพื้นที่สีรวมถึงการแปลงโดยนัยเช่นขณะจัดการภาพ

นี่คือรหัสกอล์ฟ รหัสที่สั้นที่สุดชนะ

ตัวอย่าง

Input:  0 182 255
Output: 197 (or 198)

Input:  127 247 103
Output: 110

Input:  0 0 1
Output: 240

Input:  255 165 245
Output: 307 (or 306)

แก้ไข

คุณไม่ต้องทำตามสูตรที่แน่นอน แต่จะต้องให้ผลลัพธ์เดียวกับสูตรด้านบน ฉันต้องการที่จะเห็นคำตอบบางอย่างที่เล่นกอล์ฟสูตรเอง


เราควรแปลงจาก sRGB เป็นสเกลเชิงเส้นก่อนหรือไม่ ฉันคิดว่าเราควร แต่ไม่มีใครดูเหมือนจะมีจนถึง
John Dvorak

@JanDvorak งานคือการคำนวณสีในความหมายที่ง่าย ในกรณีนี้ "ง่ายที่สุด" หมายความว่าคุณควรถือว่าอินพุตอยู่ในระดับที่เหมาะสมอยู่แล้วและใช้สูตรที่ถูกต้องในคำถามหรืออะไรก็ตามที่ให้ผลลัพธ์เหมือนกัน
jimmy23013

แต่ ... 24 bpp มักจะหมายถึง sRGB มิฉะนั้นข้อมูลจำเพาะรูปแบบ (คุณ) ควรระบุเป็นอย่างอื่น
John Dvorak

@JanDvorak คุณควรใช้คำจำกัดความนี้สำหรับ RGB และสี
jimmy23013

9
จะต้องมีการกล่าว: huehuehue
TheDoctor

คำตอบ:


6

Pyth, 27 ไบต์

*60%+c-Ft.<QJxQKeSQ-KhSQyJ6

สาธิต. สายรัดทดสอบ

fomula นำมาจากวิกิพีเดีย

เป็นหลักขั้นตอนคือ:

  1. .<QJxQKeSQ: Roate ค่าที่ใหญ่ที่สุดที่ด้านหน้าของรายการ
  2. -Ft: นำส่วนต่างของค่าสองค่าอื่น ๆ
  3. -KhSQ: ลบค่าต่ำสุดจากค่าสูงสุด
  4. c: หาร 2 ด้วย 3
  5. + ... yJ เพิ่มดัชนีของค่าสูงสุดสองเท่าในรายการ (0 ถ้า R, 2 ถ้า G, 4 ถ้า B)
  6. % ... 6: Mod 6 เพื่อแก้ไขปัญหาเกี่ยวกับเนกาทีฟ
  7. *60: คูณด้วย 60 เพื่อแปลงเป็นองศาแล้วพิมพ์

9

C #, 188 210 206 197 191 ไบต์

int H(int r,int g,int b){int[]a={r,g,b};System.Array.Sort(a);int x=a[2],y=a[1],c=x==g?1:(x==b?2:(y==b?3:0)),d=y==g?1:(y==b?2:(x==b?3:0));return(int)((c-d)*120*(1+(x-y)*1D/(x-a[0]))/2+d*120);}

ขอบคุณ Sok ที่บันทึก 4 ไบต์และ SLuck49 สำหรับบันทึก 15!


ในขณะที่คุณใช้เพียงzครั้งเดียวในการคำนวณผลลัพธ์และคุณไม่ได้ใช้ในการคำนวณก่อนหน้านี้คุณจะใช้ตัวแปรและเปลี่ยนผลลัพธ์เป็นreturn(int)((c-d)*(1+(x-y)/(double)(x-a[0]))/2+d);ประหยัด 4 ไบต์
Sok

คุณสามารถแยก 120 จากcและการdมอบหมายและกลับมาเช่นนี้c=x==g?1:(x==b?2:(y==b?3:0)),d=y==g?1:(y==b?2:(x==b?3:0))แล้วreturn(int)((c-d)*120*(1+(x-y)/(double)(x-a[0]))/2+d*120);บันทึก 4 ไบต์
SLuck49

คุณต้องการนักแสดงด้วยdoubleหรือไม่ หากคุณคุณสามารถใช้สิ่งนี้แทน(x-a[0])*1Dเพื่อบันทึกอีก 5 ไบต์
SLuck49

@ SLuck49 ขอบคุณ! ใช่ฉันต้องการนักแสดงจริงๆมันให้ผลลัพธ์ที่ไม่ถูกต้อง แต่การ*1Dคูณนั้นเป็นกลอุบายที่ดี!
ProgramFOX

นอกจากนี้ (เพิ่งสังเกตเห็น) คุณสามารถวางการใช้ทั้งหมดเข้าด้วยกันโดยมีคุณสมบัติครบถ้วนSystem.Arrayสำหรับอีก 6 ไบต์
SLuck49

8

Pyth, 41 55 53 51 ไบต์

A.)JohN,VQ*L120?qeQhSQ3j312T+/*-HKeeJhc-GheJ-GhhJ2K

r,g,bการป้อนข้อมูลที่คาดว่าในรูปแบบ นี่คือคำอธิบาย:

                                                        Implicit: Q=eval(input()), evaluates to (r,g,b)
               ?qeQhSQ                                  Is b the smallest?
                      3j312T                            Choose [0,1,2] or [3,1,2] based on above
          *L120                                         Convert to [0,120,240] or [360,120,240]
       ,VQ                                              Pair -> [[r,0/360],[g,120],[b,240]]
   JohN                                                 Order by 1st element in each pair, store in J
A.)J                                                    Pop biggest from J, set G = x, H = h(X)
                                                        Output calculation:
                                       -GheJ                x - y
                                            -GhhJ           x - z
                                     hc                     Divide and increment
                                 KeeJ                       Set K = h(Y)
                              *-HK                          Multiply by (h(X) - h(Y))
                             /                   2          Integer division by 2
                            +                     K         Add h(Y)

บันทึกแล้ว 4 ไบต์ขอบคุณ @Jakube และ @isaacg


@ jimmy23013 แก้ไขขอบคุณสำหรับกรณีทดสอบพิเศษ
Sok

1
กอล์ฟสองสาม: m*120d-> *L120บันทึกeeJเป็นKอินไลน์เพื่อบันทึกไบต์อื่น
isaacg

@isaacg ฉันไม่ทราบว่าLโอเปอเรเตอร์สร้างช่วงโดยอัตโนมัติทุกวันเป็นวัน shcool ที่ดูเหมือน: o) ขอบคุณ!
Sok

8

Javascript (ES6), 145 115 108 100 97 90 ไบต์

ผลตอบแทนลอย กำหนดให้กับฟังก์ชันที่จะใช้

(r,g,b)=>([x,y,z]=[r,g,b].sort((a,b)=>b-a),m=x-z,(x-r?x-g?r-g+4*m:b-r+2*m:g-b+6*m)/m%6*60)

บันทึก 30 ไบต์ด้วยการฝังทุกอย่างไว้ในลำดับผู้ประกอบการที่หนึ่งและรอจนกว่าจะสิ้นสุดถึงมาตรฐานที่ 0-360

ขอบคุณ edc65, Vasu Adari และ ETHproductions สำหรับการบันทึกไบต์ที่มากขึ้น

JSFiddleพร้อมการทดสอบ ลองใน Firefox

หากการลบการประกาศฟังก์ชันh=ไม่ถูกต้องให้เพิ่ม 2 ไบต์


คุณสามารถลบ 'var' และบางไบต์
Vasu Adari

ES6Fiddle ต้องการประกาศ var ด้วยเหตุผลบางอย่างและฉันไม่ได้ตระหนักว่ามันไม่จำเป็นจนกว่าฉันจะลอง ES6 ใน firefox
DankMemes

1
คุณสามารถบันทึก 6 returnไบต์โดยการแทนที่ด้วยวงเล็บปีกกาวงเล็บอัฒภาคด้วยเครื่องหมายจุลภาคและลบ ฉันเชื่อว่าการลบการประกาศฟังก์ชั่น ( h=) นั้นถูกต้องตามกฎหมายเช่นกันซึ่งทำให้จำนวนทั้งหมดลดลงถึง 100
ETHproductions

นี่อาจจะเป็นสิ่งที่ครอบงำอยู่ (แต่แล้วก็ไม่ใช่นักกอล์ฟที่เก่งทั้งหมด?;)) แต่คุณสามารถประหยัดได้อีกสองไบต์ด้วยการกำจัดวงเล็บ%6)*60และคู่ของมันในอีกด้านหนึ่ง นอกจากนี้การใช้แรงเดรัจฉานในการเพิ่ม (แทนที่จะเพิ่ม 6 ตอนท้าย) จะช่วยประหยัดหนึ่งไบต์ในการตั้งค่าปัจจุบันของคุณ ก็จะกลายเป็น(((x==r?(g-b)/m:x==g?2+(b-r)/m:4+(r-g)/m)+6)%6)*60 (x==r?6+(g-b)/m:x==g?8+(b-r)/m:10+(r-g)/m)%6*60
ETHproductions

1
+1 สำหรับการจัดเรียงฉลาดมากนี่คือ 90 (หรือ 92)(r,g,b)=>([m,_,M]=[r,g,b].sort((a,b)=>a-b),C=M-m,(M-r?M-g?r-g+4*C:b-r+2*C:g-b+6*C)/C%6*60)
edc65

6

คู่, 65 60 50 ไบต์

แก้ไข: บันทึก 10 ไบต์ขอบคุณ pawel.boczarski

วิธีแก้ปัญหาโดยประมาณ ...

@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360)

ทดสอบการทำงาน

@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360)
ans([0   182   255])
ans =  196.14

@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360)
ans([127   247   103])
ans =  111.05

@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360)
ans([0   0   1])
ans =  240.00

@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360)
ans([255   165   245])
ans =  305.82

อ็อกเทฟ 107 ไบต์

โซลูชันดั้งเดิมของฉัน ...

รหัส:

function H=r(c) [b,i]=sort(c);h=60*[6*(i(1)~=3),2,4](i);H=(h(3)-h(2))*(1+(b(3)-b(2))/(b(3)-b(1)))/2+h(2);

อธิบาย:

function H=r(c)
   [b,i]=sort(c);
   h=60*[6*(i(1)~=3),2,4](i);
   H=(h(3)-h(2))*(1+(b(3)-b(2))/(b(3)-b(1)))/2+h(2);

ฟังก์ชันนี้ใช้เวกเตอร์ที่มีค่า R, G, B เป็นอินพุตcและเรียงลำดับอินพุตตามลำดับจากน้อยไปหามาก

  • b มีค่าที่เรียงลำดับ [z, y, x]
  • i มีระนาบ RGB ที่เชื่อมโยงกับแต่ละค่าใน b

เวกเตอร์hบรรจุด้วยค่า

  • 60*[6, 2, 4]= [360, 120, 240](แต่สั้นกว่า 3 ไบต์)
  • ยกเว้นว่าค่าต่ำสุดคือสีน้ำเงิน ( i(1) == 3) ซึ่งในกรณีนี้ค่าสีแรกจะกลายเป็นศูนย์
  • จากนั้นใช้(i)เพื่อจัดเรียงhลงใน[h(Z), h(Y), h(X)]การสั่งซื้อ

จากตรงนั้นมันเป็นการถอดความสูตรตรงๆ คุณสามารถทดลองใช้งานได้ที่นี่


คำแนะนำ: ใช้สัญกรณ์ฟังก์ชั่นที่ไม่ระบุชื่อเพื่อบีบไบต์เพิ่มเติม: @(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360)คือสิบไบต์สั้นกว่าคำจำกัดความที่มีfunctionคำหลัก
pawel.boczarski

@ pawel.boczarski ฉันสงสัยว่าฉันสามารถกำจัดส่วนหัวของฟังก์ชั่นได้ทั้งหมดหรือไม่ แต่ฉันไม่รู้ว่ามันถูกต้องหรือไม่ แต่ขอบคุณสำหรับเคล็ดลับ! : D
บีกเกอร์

@ pawel.boczarski มองย้อนกลับไปฉันยังต้องการr=ฟังก์ชั่นที่ไม่ระบุชื่อก่อนที่จะเรียกใช้ใช่ไหม
บีกเกอร์

มีโซลูชั่นมากมายที่โพสต์ฟังก์ชั่นที่ไม่ระบุชื่อ ยิ่งไปกว่านั้นคุณสามารถเรียกใช้ฟังก์ชันที่กำหนดไว้เช่นนี้(@(c)mod(atan2d(.866*c*[0;1;-1],c*[2;-1;-1]/2),360))([127 247 103])หรือให้เหตุผลว่าคุณสามารถใช้ansตัวแปรได้ทันทีหลังจากมีการกำหนดฟังก์ชันที่ไม่ระบุชื่อดังนั้นการมอบหมายนั้นไม่จำเป็นสำหรับการกำหนดฟังก์ชันให้สมบูรณ์ ในความท้าทายหนึ่งรายการ ( codegolf.stackexchange.com/questions/54945 ) ฟังก์ชันของไลบรารี Matlab ที่มีอยู่ได้รับการโพสต์เป็นโซลูชันแบบเต็ม
pawel.boczarski

@ pawel.boczarski ว้าวนั่น ... เพียงแค่ ... ความชั่วร้าย: DI ควรรู้จักหลุยส์ที่จะมีส่วนร่วม ฉันจะเปลี่ยนกลับเป็นรหัสต้นฉบับและใช้ansในตัวอย่าง ขอบคุณอีกครั้ง!
บีกเกอร์

5

Pyth, 55

ฉันรู้ว่าคำตอบของ @ Sok ชนะการระเบิดของฉัน แต่เมื่อฉันเสร็จของฉันหลังจากเขา / เธอโพสต์แล้วฉันคิดว่าฉันจะโพสต์ต่อไป นี่เป็นครั้งแรกที่ฉันใช้ Pyth ดังนั้นฉันแน่ใจว่าฉันทำผิดพลาดไปบ้าง

DlZK*120ZRKJSQFNJ=Y+YxQN)=kl@Y1+k/*-leYk+1c-eJ@J1-eJhJ2

r, g, bการป้อนข้อมูลที่คาดว่าจะ คุณสามารถทดลองใช้งานได้ที่นี่


ใช้งานไม่ได้ 255,165,245ไม่ทำงานสำหรับ
jimmy23013

5

PowerShell, 232 226 222 161 Bytes

ดูประวัติการแก้ไขสำหรับรุ่นก่อนหน้า

$z,$y,$x=($r,$g,$b=$args)|sort
$c=((2,(0,3)[$y-eq$b])[$x-ne$b],1)[$x-eq$g]
$d=((2,(0,3)[$x-eq$b])[$y-ne$b],1)[$y-eq$g]
(($c-$d)*120*(1+($x-$y)/($x-$z))/2+$d*120)

Hoo boy มาดูกันว่าฉันสามารถผ่านสิ่งนี้ได้ไหม ตั้งแต่\nนับเช่นเดียวกับ;ฉันออกจากตัวแบ่งบรรทัดเพื่อความชัดเจน

บรรทัดแรกจะเข้าเป็นสามและเก็บพวกเขาเป็น$args $r, $g, $bเราจะใช้ใน$bภายหลังเท่านั้น แต่เราต้องการทั้งสามอย่างเพื่อให้|sortงานเหมาะสม นี่$z, $y, $xเป็นอาร์กิวเมนต์อินพุตที่เล็กที่สุดถึงใหญ่ที่สุด

การตั้งค่าสองบรรทัดถัดไป$cและ$dโดยใช้การเรียก index-in-an-array หลายตัวเพื่อตั้งค่าตัวเลขอย่างเหมาะสม การทำงานจากด้านนอกหาก$xเป็น-equal ถึง$g(เช่นสีเขียวเป็นขนาดใหญ่ที่สุด) เราตั้งค่า$c=1... อื่นถ้า$xเป็น-n OT equal ไป$b(เช่นสีฟ้าไม่ได้ที่ใหญ่ที่สุด) $cอย่างใดอย่างหนึ่ง0หรือ3ขึ้นอยู่กับว่าสีฟ้าเป็นใหญ่เป็นอันดับสอง ... $c=2อื่น $dชุดตรรกะที่คล้ายกัน

จากนั้นเราคำนวณและพิมพ์ผลลัพธ์ด้วยสิ่งต่อไปนี้ซึ่งเป็นเพียงอัลกอริธึมจากการแข่งขันที่ท้าทายเล็กน้อย

(($c-$d)*120*(1+($x-$y)/($x-$z))/2+$d*120)

1
ฉันไม่รู้จัก PowerShell ดังนั้นแก้ไขให้ถูกต้องถ้าฉันผิด ... คุณไม่ได้ใช้$zเมื่อคำนวณ$cหรือ$dและคุณใช้เพียงครั้งเดียวในการคำนวณผลลัพธ์คุณจึงสามารถกำจัดได้$zทั้งหมดและแทนที่ด้วย$a[0]?
Sok

4

ทับทิม, 117 96 94 ไบต์

รหัส:

h=->r,g,b{z,y,x=[r,g,b].sort;v=x-z.to_f;({r=>(g-b)/v,g=>2+(b-r)/v,b=>4+(r-g)/v}[x]%6*60).to_i}
  • บันทึกแล้ว 21 ไบต์โดยการลบ()และใช้ตัวแปร r, g, b
  • ใช้มอดุลัส 6 เพื่อแปลงค่าลบและคูณด้วย 60 เพื่อแปลงเป็นองศาที่บันทึกไว้ 2 ไบต์

ตัวอย่าง:

irb(main):274:0> h.call 0,182,255
=> 197
irb(main):275:0> h.call 127,247,103
=> 110
irb(main):276:0> h.call 0,0,1
=> 240
irb(main):277:0> h.call 255,165,245
=> 306

3

SWI-Prolog, 133 ไบต์

a(L,H):-L=[R,G,B],max_list(L,X),min_list(L,Y),member(X:I:J:U,[R:G:B:0,G:B:R:2,B:R:G:4]),Z is 60*(U+(I-J)/(X-Y)),(Z<0,H is Z+360;H=Z).

ตัวอย่าง: a([255,165,245],Hue).ผลลัพธ์Hue = 306.666666666666 .

สิ่งนี้ใช้สูตรต่อไปนี้:

  • Max = max(R,G,B), Min = min(R,G,B).
  • ถ้าMax = R, U = 0. อื่นถ้า,Max = G อื่นU = 2U = 4
  • ถ้าMax = R, และI = G J = Bอื่นถ้าMax = G, และI = B J = Rอื่นและI = RJ = G
  • Z = U + (I - J)/(Max - Min)
  • Hueอย่างใดอย่างหนึ่งZหรือถ้าZ + 360Z < 0

ปัดเศษเป็นตัวเลือก
jimmy23013

@ jimmy23013 อัปเดตขอบคุณ
ทำให้เสียชีวิต

3

Perl 5, 138 132 119 ไบต์

รหัส:

($m,$c,$M)=sort@A=($R,$G,$B)=@ARGV;print 60*(6+$M>$m?($G>$c?$B-$R:$B>$c?$R-$G:$G-$B)/($M-$m)+($G>$c?2:$B>$c?4:0):0)%360

หมายเหตุ:

Perl แน่นอนไม่สามารถเอาชนะความท้าทายดังกล่าวได้ด้วยการเล่นกอล์ฟ Pyth'oresque แต่ฉันสงสัยว่านี่เป็นไปได้ที่จะทำด้วยขั้นตอนการคำนวณเพียง 1 ขั้นตอน ขอบคุณโมดูลัสที่ทำงานออกมาได้ดี :)

ทดสอบ:

$ perl hue.pl 0 182 255
197
$ perl hue.pl 127 247 103
110
$ perl hue.pl 0 0 1
240
$ perl hue.pl 255 165 245
307

เปรียบเทียบกับค่ากลางแทนค่าสูงสุดของการโกนบางไบต์ (== เปรียบเทียบกับ>)
LukStorms

1

C ++ 276 ไบต์

#include <iostream>
int H(int r,int g,int b){int m,n=120,o=240,l=r>g?r>b?g>b?m=r-b,o=n,n=-n,r-g:m=r-g,r-b:m=b-g,o+=n,n=-n,b-r:g>b?r>b?(m=g-b,o=0,g-r):m=g-r,n=-n,g-b:(m=b-r,o-=n,b-g);return (int)n*((float)l/m+1)/2+o;}int main(){int r,g,b;std::cin>>r>>g>>b;std::cout<<H(r,g,b);}

คำแนะนำ: คุณสามารถออกจากHฟังก์ชั่นเดียวในคำตอบในรหัสกอล์ฟฟังก์ชั่นแบบสแตนด์อโลนเป็นคำตอบที่ถูกต้องตามกฎหมายเทียบเท่ากับโปรแกรมเต็มรูปแบบ, วิเดเมตาอภิปราย: meta.codegolf.stackexchange.com/questions/2419/... สิ่งนี้จะทำให้คำตอบของคุณแข่งขันได้มากขึ้น (บันทึก 100 ไบต์ในกรณีของคุณ) คุณยังคงได้รับการสนับสนุนให้ออกจากโปรแกรม "เวอร์ชั่นเต็ม" ภายใต้โซลูชันเพื่อให้การทดสอบง่ายขึ้น
pawel.boczarski

กรณีทดสอบที่สอง127 247 103ผลตอบแทนถัวเฉลี่ยค่าไม่ถูกต้องแทน-120 110
pawel.boczarski

1

R, 125 ไบต์

คล้ายกับโซลูชันอ็อกเทฟของบีกเกอร์ เอาท์พุทจุดลอย

รหัส:

h=function(x){
  o=seq(3)[order(-x)];
  y=c(60*c(6*(o[3]!=3),2,4)[o],x[o]);
  return((y[1]-y[2])*(1+(y[4]-y[5])/(y[4]-y[6]))/2+y[2]);
}

ตัวอย่าง:

> h(c(0,182,255))
[1] 197.1765
> h(c(127,247,103))
[1] 110
> h(c(0,0,1))
[1] 240
> h(c(255,165,245))
[1] 306.6667

1

Python ขนาด 154 ไบต์

def h(c):r=c[:];c.sort();c=c[::-1];x,y,z=c;i,j=[120if n==r[1]else 240if n==r[2]else 0if z==r[2]else 360for n in[x,y]];print ((i-j)*(1+(x-y+0.)/(x-z))/2)+j

ยอมรับรายการค่า ไม่แน่ใจว่าสิ่งนี้สามารถพังทลายลงไปอีก นี่มัน ungolfed:

def hue(color):
 rgb=color[:]  # copy list
 color.sort()  # sort list
 color=color[::-1]  # reverse sort
 x,y,z=color   # pull out x,y,z

 # The line 
 #   i,j=[120if n==r[1]else 240if n==r[2]else 0if z==r[2]else 360for n in[x,y]]
 # is basically the following, twice, once for x/hx and the second time for y/hy

 if x==rgb[1]: # if x is green
  hx = 120
 else:
  if x==rgb[2]: # if x is blue
   hx = 240
  else:
   if z==rgb[2]: # if z is blue and x is red
    hx = 0
   else:       # if x is red and y is blue
    hx = 1

 print ((hx-hy)*(1+(x-y+0.)/(x-z))/2)+hy  # calculate, print

0

JavaScript 108

วิธีอื่น

function H(r,g,b){a=[r,g,b].sort(),M=a[2],c=M-a[0],h=M==r?(g-b)/c%6:M==g?(b-r)/c+2:(r-g)/c+4
return h*60|0;}

JavaScript 194

ใช้วิธีตัวอย่าง

Array.prototype.i=[].indexOf
function H(r,g,b,a){a=[r,g,b].sort(),i=[a.i(r),a.i(g),a.i(b)],x=[i[2]?360:0,120,240],hx=x[i.i(2)]|0,hy=x[i.i(1)]|0
return (hx-hy)*(1+(a[2]-a[1])/(a[2]-a[0]))/2+hy|0}

var input = document.getElementById("input").innerHTML;
var output = document.getElementById("output");
var html = "";

input.replace(/(\d+)\,(\d+)\,(\d+)/g, function(m, r, g, b) {
  html += H(r, g, b) + "\n";
});

output.innerHTML = html;
<pre id="input">
0,182,255
127,247,103
0,0,1
255,165,245
</pre>

<pre id="output">

</pre>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.