สีเสริม


26

เมื่อได้รับอินพุตของสีใน#rrggbbรูปแบบเลขฐานสิบหกให้ส่งออกส่วนประกอบของ RGB ในรูปแบบเดียวกัน

ระบบ RGB สมบูรณ์ R 2 G 2 B 2ของสีใด ๆ R 1 G 1 B 1ถูกกำหนดให้เป็นสีกับ R 2มูลค่า255 - R 1 , บี2มูลค่า255 - B 1และจี2มูลค่า255 - G 1

เลขฐานสิบหกอาจเป็นตัวพิมพ์ใหญ่ (# FFAA20) หรือตัวพิมพ์เล็ก (# ffaa20) กรณีของอินพุตและเอาต์พุตไม่จำเป็นต้องสอดคล้องกัน (ดังนั้นคุณอาจใช้อินพุตเป็นตัวพิมพ์เล็ก แต่เอาต์พุตเป็นตัวพิมพ์ใหญ่และในทางกลับกัน)

เนื่องจากนี่คือรหัสที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ

กรณีทดสอบ (โปรดทราบว่าตั้งแต่ให้โปรแกรม / ฟังก์ชั่นของคุณเองผลลัพธ์ของมันจะส่งผลให้อินพุตดั้งเดิม (มัน ไม่เกี่ยวข้อง ) กรณีทดสอบควรทำงานได้ทั้งสองทิศทาง):

In/Out   Out/In
----------------
#ffffff  #000000
#abcdef  #543210
#badcab  #452354
#133742  #ecc8bd
#a1b2c3  #5e4d3c
#7f7f80  #80807f

2
ฉันขอโทษ แต่ sRGB ไม่ทำงานเช่นนั้น คุณควรแปลงเป็นช่องว่างเชิงเส้นก่อนซึ่งไม่มีรหัส
John Dvorak

2
@JanDvorak โอ้ดี สถานะของความท้าทายจะสะท้อนถึงความไม่รู้ของฉันเนื่องจากฉันไม่สามารถเปลี่ยนแปลงได้ในขณะนี้ : P
Doorknob

การเฉลี่ยค่าสองค่าใน sRGB อาจเป็นความท้าทายที่เหมาะสม sRGB = RGB ^ 0.45 ในช่วงส่วนใหญ่ แต่เป็นเส้นตรงใกล้ด้านล่างของช่วง
John Dvorak

คำตอบ:


17

Pyth, 9 8 ไบต์

ขอบคุณ @isaacg สำหรับ -1 ไบต์!

sXz.HM16

ลบค่าสีบางจาก 255 เทียบเท่ากับการลบแต่ละตัวเลขฐานสิบหกจาก 15 Say จำนวนเป็น16a + B แล้วค่าของจำนวนที่สร้างขึ้นโดยการลบตัวเลขจาก 15 เป็น16 (15-A) + (15-B) = 255 - (16a + B)

sXz.HM16     implicit: z=input()
      16      
   .HM        map hex representation over range
   .HM16     '0123456789abcdef'
  z           the input string
 X            Translate characters in x1 present in x2 to reversed x2
              that is, '0' becomes f, '1' becomes 'e', and so on.
              The initial '#' is unchanged.
s             That produced a list, so join into a string by reducing +

ลองมันนี่ ชุดทดสอบ


คำตอบที่ดี! ฉันยืมความคิดของคุณใน'0123456789abcdef'การแปลงเป็น hex (แทนdec2hexฟังก์ชั่น)
Luis Mendo

ฉันคิดว่าลิงก์ของคุณไม่ถูกต้อง ( คัดลอกวาง FTW. )
PurkkaKoodari

@ Pietu1998 อ๊ะ ฉันจะแก้ไข
lirtosiast

Uไม่จำเป็น - Mมันเต็มไปโดยปริยายโดย
isaacg

6

เรติน่า13 13ไบต์

T`w`G-A9-0

มีสามส่วนในรหัสคั่นด้วย backticks ( `): Tระบุโหมดตัวถอดเสียงซึ่งจะแทนที่อักขระแต่ละตัวในส่วนที่สองด้วยอักขระที่สอดคล้องกันในส่วนที่สาม

wเป็นเช่นเดียวกับ regex แบบดั้งเดิม\wหรือซึ่งจะขยายไปยัง_0-9A-Za-z_0123456789ABCDEFGH...

ส่วนที่สองนั้นถูกขยายออกไปGFEDCBA9876543210เนื่องจากความสามารถที่ดีของ Retina ในการขยายแบบย้อนกลับ วางสิ่งเหล่านี้ไว้บนสุดของกันและกันและเราจะได้:

_0123456789ABCDEFGH...
GFEDCBA987654321000...
 ^^^^^^^^^^^^^^^^

โปรดทราบว่าอักขระตัวสุดท้าย0ถูกทำซ้ำเพื่อให้พอดีกับความยาวของสตริงที่ยาวกว่า แต่เราสนใจเฉพาะอักขระฐานสิบหกที่แสดงโดยคาเร็ต

ขอบคุณ Martin Büttnerที่แนะนำวิธีการนี้

ลองชุดทดสอบออนไลน์


4

Marbelous, 41 ไบต์

00@0
\\]]\/
-W/\@0
-W
~~
<A+700
+O//]]
+O

ล่ามออนไลน์ที่นี่ อินพุตควรเป็นตัวพิมพ์ใหญ่

คำอธิบาย

00และ]]ที่ด้านล่างจะเรียกตัวอักษรตัวแรก (คน#) และมันก็จะลดลงไปด้านล่างและจะออกมาก่อนสิ่งอื่นใด

3 บรรทัดแรกคือลูปเพื่อดึงข้อมูลอักขระที่เหลือทั้งหมด

ก่อนอื่นเราต้องแปลงอักขระฐานสิบหกเป็น 0-15 โดยทำx -= 48, x -= x > 9 ? 7 : 0(ตั้งแต่'A' - '9'8)

เพื่อหาสิ่งเติมเต็มเราก็ต้องแปลงทุกหลักเพื่อx 15-xนี้จะเทียบเท่ากับ (ค่า 8 (~x)+16 = ~(x-16)บิต)

x += x > 9 ? 7 : 0, x += 48สุดท้ายเราต้องแปลงตัวเลขเหล่านี้กลับเข้ามาในตัวเลขฐานสิบหกโดยการทำ

x -= 48, x -= x > 9 ? 7 : 0, x = ~(x - 16), x += x > 9 ? 7 : 0, x += 48ดังนั้นตอนนี้เรามี

โปรดทราบว่าหากเราลบนิพจน์ด้วยตัวดำเนินการแบบไตรภาคแรกจากนั้นตัวเลขหลักA- Fจะส่งผลให้ x เป็นลบหลังจากการปฏิเสธ

ดังนั้นเราจึงสามารถเปลี่ยนการแสดงออกก่อนหน้านี้: ซึ่งจะมีค่าเท่ากับx -= 48, x -= 16, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48x -= 64, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48

โค้ดด้านบนเป็นเพียงการนำนิพจน์สุดท้ายมาใช้ -Wเป็นx -= 32และเป็น+O x += 24ตั้งแต่ Marbelous ใช้ไม่ได้ลงนามเลขคณิต 8 บิตในสภาพที่<Aครอบคลุมทั้งกรณีของและx > 9x < 0


คุณสร้าง Marbelous หรือไม่?
Rɪᴋᴇʀ

@RikerW Marbelous ถูกสร้างขึ้น / โป่งพองออกมาโดยผู้ใช้ PPCG หลายคนรวมทั้งตัวเอง: ดูที่นี่
es1024

ถูก ขอบคุณสำหรับการให้ฉันรู้ว่า.
Rɪᴋᴇʀ

4

JavaScript ES6, 61 ไบต์66 68 48 53 64

บันทึกได้ไม่กี่ไบต์ด้วย @ CᴏɴᴏʀO'Bʀɪᴇɴ, @NinjaBearMonkey และ @nderscore

s=>"#"+(1e5+(8**8+~('0x'+s.slice(1))).toString(16)).slice(-6)

ใช้ประโยชน์จากการหล่อแบบอัตโนมัติ การแก้ไขค่าศูนย์ฆ่าจำนวนไบต์


ใช้eval(`0x${s.slice(1)}`)แทนparseInt
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴความยาวเท่ากันหรือไม่
PurkkaKoodari

@ CᴏɴᴏʀO'Bʀɪᴇɴขอบคุณฉันใช้- แทน eval ซึ่งบันทึกได้มากขึ้นไบต์
Downgoat

โอ้ลืมเกี่ยวกับการหล่อประเภทอัตโนมัติ: D
Conor O'Brien

#FFFFFFลองกับการป้อนข้อมูล #0ผลตอบแทน
Conor O'Brien

4

JavaScript ES6, 63 58 52 49 ไบต์

c=>c.replace(/\w/g,x=>(15-`0x${x}`).toString(16))

ขอบคุณขีดล่างสำหรับการบันทึก 11 ไบต์!


-5 ไบต์:c=>"#"+[...c].map(x=>"fedcba9876543210"[+('0x'+x)]).join``
ขีดล่าง

@ เหนือแน่นอนคิดเกี่ยวกับมันแล้ว :) ขอบคุณ กำลังจะใช้มัน แต่กับ "eval"
nicael

1
อาฉันมีอีกหนึ่ง -6:c=>c.replace(/\w/g,x=>"fedcba9876543210"[+('0x'+x)])
ขีด


3

Julia, 74 49 ไบต์

h->"#"join([hex(15-parse(Int,i,16))for i=h[2:7]])

ค่อนข้างนานในขณะนี้ แต่เป็นการเริ่มต้น นี่คือฟังก์ชั่นแลมบ์ดาที่ยอมรับสตริงและส่งคืนสตริง เอาต์พุตจะเป็นตัวพิมพ์เล็ก แต่อินพุตสามารถเป็นได้ทั้ง

ในฐานะที่เป็นโทมัสตั้งข้อสังเกตลบแต่ละองค์ประกอบสี 2 หลักจาก 255 เทียบเท่ากับการลบแต่ละหลักของแต่ละบุคคลในการป้อนข้อมูลเลขฐานสิบหกจาก 15. วนลูปกับสายป้อนไม่รวมชั้นนำของ#เราแปลงที่ 15 - หลักแยกวิเคราะห์เป็นเลขฐานสิบหก เราเข้าร่วมทั้งหมดเหล่านี้แล้วตะปูบน#และเรียกมันว่าดี


3

Japtap , 35 32 22 20 16 15 ไบต์

¡Y?(F-XnG)sG :X

คำอธิบาย:

¡                 //Take input and map (shortcut to "Um@"). Input should in the form of "#123456"
 Y?               //if Y is not 0, then return (F-XnG)sG, otherwise last step...
    F-XnG           //Subtract X, converted from hexadecimal (G is 16) to decimal, from 15
          sG        //convert decimal to hexadecimal
             :X   //...otherwise return X unchanged (happens only with #, the first char)

ทำได้ดีนี่! ฉันเห็นเมื่อคืนนี้และพูดกับตัวเองว่า "พรุ่งนี้ฉันจะช่วยลงสนาม" แต่ตอนนี้คุณเล่นกอล์ฟมันเกินกว่าที่ฉันคิดไว้แล้ว :)
ETHproductions

2

Perl, 30 ไบต์

รวม +1 สำหรับ -p

s/\w/sprintf"%x",15&~hex$&/eg

การใช้งาน: หรือecho #000000 | perl -p file.pl
echo #000000 | perl -pe 's/\w/sprintf"%x",15&~hex$&/eg'


2

MATL , 21 ไบต์

35,5Y216,j6L)!16ZA-)h

สิ่งนี้ใช้รีลีสภาษา / คอมไพเลอร์6.0.0ซึ่งเร็วกว่าความท้าทาย

ตัวเลขที่ป้อนควรเป็นตัวพิมพ์ใหญ่

ตัวอย่าง

สิ่งนี้ถูกดำเนินการในระดับแปดเสียง:

>> matl
 > 35,5Y216,j6L)!16ZA-)h
 >
> #FFAA20
#0055DF

แก้ไข (12 มิถุนายน 2559)

รหัสขณะนี้คุณสามารถพยายามออนไลน์ เครื่องหมายจุลภาคจะต้องถูกแทนที่ด้วยช่องว่างและ6Lตาม4Lเพื่อให้สอดคล้องกับการเปลี่ยนแปลงในภาษา

คำอธิบาย

35,             % number literal: ASCII code of '#'
5Y2             % '0123456789ABCDEF'
16,             % number literal
j               % input string
6L)             % remove first element
!               % transpose
16ZA            % convert from hex to dec
-               % subtract from 16
)               % index into '0123456789ABCDEF' to convert back to hex
h               % prepend 35, which gets automatically converted into '#'

1

Pyth, 20 19 ไบต์

1 ไบต์ขอบคุณที่XNOR

%"#%06x"-t^8 8itz16

ลองออนไลน์ ชุดทดสอบ

คำอธิบาย

  • z คืออินพุต
  • tz ลบ #
  • itz16 แยกวิเคราะห์เป็นเลขฐานสิบหก
  • t^8 8คำนวณ 8 8 - 1
  • -t^8 8itz16คำนวณ 8 8 - 1 - อินพุต
  • %"#%06x"-t^2 24itz16 จัดรูปแบบลงในสตริงเลขฐานสิบหก 6 ตัวที่มีเบาะรองศูนย์ #

แล้ว 8 ^ 8 สำหรับ 2 ^ 24 ล่ะ?
xnor

1

Haskell, 85 ไบต์

การส่งครั้งแรกของฉันมันอาจจะยาวที่สุด (85 ไบต์) แต่เดี๋ยวก่อนคุณต้องเริ่มต้นที่ไหนสักแห่ง ใน Haskell:

import Numeric;f=('#':).concatMap((flip showHex)"".(15-).fst.head.readHex.(:[])).tail

มันใช้การลบแบบเดียวกันจาก 15 เคล็ดลับที่ฉันเห็นคนอื่นใช้

ฉันยังลองใช้ printf พร้อมกับเคล็ดลับอื่น ๆ (ลบ 8 ^ 8 - 1) และทำงานใน ghci แต่ด้วยเหตุผลบางอย่างมันไม่ได้รวบรวม:

g=printf "#%06x" .(8^8-1-).fst.head.readHex.tail

หากใครบางคนสามารถทำให้งานนี้เป็นสิ่งที่ดี


ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและรหัสกอล์ฟ นี่เป็นคำตอบที่ดีมาก (ดีกว่าที่ฉันจะทำได้ใน Haskell!) อย่างไรก็ตามมีรูปแบบคำตอบทั่วไปสำหรับความท้าทายของโค้ดกอล์ฟ ฉันจะแก้ไขให้คุณ คุณสามารถยอมรับหรือปฏิเสธการแก้ไข
wizzwizz4

@usernameตอบความคิดเห็นของผู้ใช้คนอื่นประเภท
wizzwizz4

@ wizzwizz4 ขอบคุณมากสำหรับความช่วยเหลือของคุณ
lpapez

เมื่อใดก็ได้! คุณต้องการที่จะไปที่ความท้าทายของฉัน? วิเคราะห์เก้าอี้และสตริงแผนที่ของคุณไปยัง Hilbert Curveเป็นรายการโปรดของฉันแม้ว่าเส้นโค้งของ Hilbert นั้นยากจริงๆ
wizzwizz4

@ wizzwizz4 แน่นอนฉันจะเห็นสิ่งที่ฉันสามารถทำได้
lpapez

1

Mathematica, 69 60 ไบต์

"#"<>IntegerString[8^8-#~StringDrop~1~FromDigits~16-1,16,6]&

เป็นการประมวลผลสายอักขระที่ฆ่าฉันที่นี่อีกครั้ง


1

C, 94 ไบต์

t(char*b){for(int i;i=*b;++b)*b=i>96&i<103?150-i:i>64&i<71|i>47&i<54?118-i:i>53&i<58?111-i:i;}

ฟังก์ชั่นใช้เวลาในอาร์เรย์ถ่านส่งคืนค่าผกผัน สร้างตัวอักษรตัวพิมพ์ใหญ่สำหรับการตอบกลับ รหัสจะพลิกตัวอักขระฐานสิบหก ASCII แต่ละตัวไปเป็นค่าผกผันถ้ามันถูกต้อง


คุณสามารถประหยัดพื้นที่ได้ด้วยการประกาศไปทั่วโลกiก่อนฟังก์ชั่น:i;
เลียม

1

ch 2, 18 ตัวอักษร / 34 ไบต์

ïē/\w⌿,↪(ḏ-`ᶍ⦃$}”ⓧ

Try it here (Firefox only).

ใช้รุ่นที่สร้างขึ้นหลังจากการท้าทาย

คำอธิบาย

ïē/\w⌿,↪(ḏ-`ᶍ⦃$}”ⓧ // implicit: ï=input, ḏ=15
ïē/\w⌿,             // replace all alphanumeric chars in ï with:
       ↪(ḏ-`ᶍ⦃$}”ⓧ // (15 - char's decimal form) converted to hex
                    // implicit output

โซลูชันที่ไม่สามารถแข่งขันได้ 15 ตัวอักษร / 29 ไบต์

ïē/\w⌿,↪(ḏ-`ᶍ⦃$}”ⓧ

ใช้การทับศัพท์


คุณสามารถเพิ่มเวอร์ชันที่แข่งขันได้เช่นกันเพื่อให้เราเห็นว่าภาษามีความแตกต่างกันอย่างไร
lirtosiast

แน่ใจ ดูการแก้ไขใหม่
Mama Fun Roll

ใช้สัญลักษณ์ APL ได้ดี
lirtosiast

/gอิอิสัญลักษณ์ที่เป็นหนึ่งที่ทำให้ความรู้สึกมากที่สุดสำหรับ
Mama Fun Roll

1

Python 96

x=input()
print("#")
for i in range(3):
    print(hex(255-int(x[(1+2*i)]+x[(2+2*i)],16))[2:4])

กอล์ฟรหัสแรกโปรดให้ความคิดเห็น :)


คุณได้รับอนุญาตให้ต้องการอินพุตเป็น"quotes"btw ดังนั้นใช้input()งานได้ คุณไม่จำเป็นต้องขึ้นบรรทัดใหม่และเยื้องบนสำหรับลูปและrangeทำงานได้ดี นอกจากนี้ยังมีช่องว่างสองสามที่คุณสามารถลบได้
Rɪᴋᴇʀ

int("ff", 16)255สามารถถูกแทนที่ด้วยเพียง
Doorknob

คุณต้องการวงเล็บในวงเล็บหลังแต่ละ x หรือไม่?
บลู

0

CJam, 16 ไบต์

qA,'G,65>+s_W%er

นี่ค่อนข้างนานเนื่องจาก CJam จัดการกับการเปลี่ยนแปลงพื้นฐานแตกต่างกันดังนั้นจึงสั้นกว่าที่จะทำการทับศัพท์ ดูคำตอบ Retinaของฉันสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการถอดเสียง

ลองออนไลน์

คำอธิบาย

q      e# Get the input
A,     e# Push [0 1 ... 8 9]
'G,65> e# Push "ABCDEF"
+s     e# Combine and convert to string
_W%    e# Make a copy and reverse it
er     e# Replace each character in the first string with
       e# the corresponding character in the second

0

Python 3, 44 ไบต์

เดิมผมใช้แล้ว256^3 16^6จากนั้นฉันก็เห็น Pietu1998 8^8และตอนนี้วิธีนี้ใช้แทน

"#{:06x}".format(8**8-1-int(input()[1:],16))


0

Bash + tr, 35 ไบต์

tr 0-9A-Fa-f fedcba9876543210543210

เอาต์พุตจะเป็นตัวพิมพ์เล็กเสมอ

น่าเสียดายที่ "tr" ไม่ได้อยู่ในช่วงเรียงกลับกันดังนั้นฉันต้องสะกดมันออกมา


0

C, 147 ไบต์

void p(char s[]){char c[3];int i=1;printf("#");while(i<6){strncpy(c,s+i++,2);i++;int x=255-strtol(c,NULL,16);x<10?printf("0%x",x):printf("%x",x);}}

ใช้ strtol เพื่อแปลงจากสตริงฐานสิบหกเป็น int แล้วลบจำนวนจาก 255 เพื่อให้ได้คำชมเหมือนโพสต์ต้นฉบับ อย่างไรก็ตามฉันสงสัยว่ามีวิธีการส่งผ่านช่วงของอักขระจาก s ถึง strtol หรือไม่ดังนั้นฉันไม่ต้องเสียเวลาในการคัดลอกไบต์ไปยังสตริงใหม่


ฉันไม่คิดว่าคอมไพเลอร์มักจะบังคับใช้การคืนค่าฟังก์ชันและค่าเริ่มต้นเป็น int ดังนั้นคุณอาจจะละเว้นvoidประเภทการส่งคืนหรือไม่
เลียม


0

sed, 48 ไบต์

y/0123456789ABCDEFabcdef/fedcba9876543210543210/

หรือ 36 ไบต์หากคุณต้องการรองรับเคสเดียว


คุณไม่จำเป็นต้องรองรับทั้งตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
Martin Ender

@ MartinBüttnerคำถามดูเหมือนว่าต้องการการสนับสนุนสำหรับทั้งสองกรณีในอินพุต แต่ไม่ใช่ในเอาต์พุต เช่นเดียวกับโซลูชัน bash + tr ของฉันโซลูชันนี้รองรับทั้งอินพุต แต่เขียนเอาต์พุตตัวพิมพ์เล็กเท่านั้น
Glenn Randers-Pehrson

คุณได้รับ0รหัสพิเศษของคุณระหว่าง9และA(นับจำนวนไบต์ถูกต้องแม้ว่าจะต้องเป็นข้อผิดพลาดในการคัดลอก)
ฮอบส์

คำถามบอกว่าคุณสามารถเลือกได้ว่าจะให้อินพุทและเอาท์พุทของคุณคืออะไร
lirtosiast

0

PowerShell ขนาด 48 ไบต์

param($a)"#{0:x6}"-f(16MB-1-("0x"+$a.Trim('#')))

จำเป็นต้องป้อนข้อมูลผ่านทางparam($a)เป็นสตริงคั่นด้วย'หรือ"เนื่องจากC:\Tools\Scripts\Golfing> .\complementary-colors #a1b2c3ในบรรทัดคำสั่ง PowerShell จะถือว่า#a1b2c3เป็นความคิดเห็นและละเว้นอย่างย่อ

จากซ้ายไปขวาจัด"#{0:x6}"-f(...)รูปแบบการคำนวณผลลัพธ์ของเรากลับเป็นเลขฐานสิบหกพร้อมรับประกัน 6 ตัวอักษร (ไปยังบัญชีสำหรับอินพุต#ffffff) ภายใน parens 0xffffffเราลบจำนวนการป้อนข้อมูลของเราจาก เราทำเช่นนี้โดยใช้ประโยชน์จากความจริงที่ว่า PowerShell แยกวิเคราะห์เลขฐานสิบหกในรูปแบบเพื่อให้เราสร้างจำนวนฐานสิบหกรูปแบบที่เหมาะสมจากหมายเลขป้อนข้อมูลของเรา0xNNN $a(หมายเหตุเรียงต่อกันที่บวก.Trim()จะสั้นกว่า.Replace()ที่นี่โดยหนึ่งไบต์.) นอกจากนี้เรายังใช้ประโยชน์จากMBผู้ประกอบการเอกผ่าน16MB-1การสร้างแทน167772150xffffff


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