Màu bổ sung


26

Đưa ra một đầu vào của một màu ở #rrggbbđịnh dạng hex, xuất ra bổ sung RGB của nó ở cùng định dạng.

RGB bổ sung R 2 G 2 B 2 của bất kỳ màu nào R 1 G 1 B 1 được định nghĩa là màu có giá trị R 2 255 - R 1 , B 2 giá trị 255 - B 1 và giá trị G 2 255 - G 1 .

Các chữ số hex có thể là chữ hoa (# FFAA20) hoặc chữ thường (# ffaa20). Trường hợp đầu vào và đầu ra không nhất quán (vì vậy bạn có thể lấy đầu vào bằng chữ thường nhưng đầu ra bằng chữ hoa và ngược lại).

Vì đây là , mã ngắn nhất tính bằng byte sẽ thắng.

Trường hợp thử nghiệm (lưu ý rằng kể từ khi đưa ra chương trình của bạn / chức năng đầu ra riêng của mình nên kết quả trong các đầu vào gốc (nó là involutory ), các trường hợp thử nghiệm nên làm việc theo cả hai hướng):

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

2
Tôi xin lỗi, nhưng sRGB không hoạt động theo cách đó. Trước tiên, bạn nên chuyển đổi sang không gian tuyến tính, mã hex không có trong.
John Dvorak

2
@JanDvorak ơi. Trạng thái của thử thách sẽ phản ánh sự thiếu hiểu biết của tôi, sau đó, vì tôi không thể thực sự thay đổi nó ngay bây giờ. : P
Doorknob

Tuy nhiên, việc tính trung bình hai giá trị trong sRGB có thể là một thách thức riêng biệt. sRGB = RGB ^ 0,45 trên hầu hết phạm vi, nhưng tuyến tính ở gần cuối phạm vi.
John Dvorak

Câu trả lời:


17

Bình thường, 9 8 byte

Cảm ơn @isaacg cho -1 byte!

sXz.HM16

Trừ đi một giá trị của một màu nhất định từ 255 tương đương với việc trừ từng chữ số thập lục phân của nó từ 15. Giả sử một số là 16a + b . Khi đó giá trị của số được tạo bằng cách trừ các chữ số của nó từ 15 là 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 +

Hãy thử nó ở đây . Bộ thử nghiệm.


Câu trả lời tốt đẹp! Tôi đã mượn ý tưởng của bạn về việc sử dụng '0123456789abcdef'để chuyển đổi sang hex (thay vì dec2hexchức năng)
Luis Mendo

Tôi nghĩ rằng liên kết của bạn là không chính xác. ( Sao chép-dán FTW. )
PurkkaKoodari

@ Pietu1998 Rất tiếc; Tôi sẽ sửa chữa nó.
lirtosiast

Điều Unày là không cần thiết - nó hoàn toàn được lấp đầy bởi M.
isaacg

6

Võng mạc, 13 10 byte

T`w`G-A9-0

Mã có ba phần, được phân tách bằng backticks ( `): Tchỉ định chế độ chuyển ngữ, thay thế mỗi ký tự trong phần thứ hai bằng ký tự tương ứng trong phần thứ ba.

wlà giống như regex truyền thống \w, hoặc _0-9A-Za-z, được mở rộng thành _0123456789ABCDEFGH....

Phần thứ hai được mở rộng GFEDCBA9876543210, nhờ khả năng tiện lợi của Retina để mở rộng theo thứ tự ngược lại. Đặt chúng lên nhau và chúng ta nhận được:

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

Lưu ý rằng ký tự cuối cùng 0, được lặp lại để phù hợp với độ dài của chuỗi dài hơn, nhưng chúng tôi chỉ quan tâm đến các ký tự thập lục phân, được hiển thị bằng dấu mũ.

Cảm ơn Martin Büttner đã gợi ý cách tiếp cận này.

Hãy thử bộ thử nghiệm trực tuyến.


4

Tuyệt vời, 41 byte

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

Phiên dịch trực tuyến tại đây. Đầu vào phải được viết hoa.

Giải trình

Cái 00]]ở dưới cùng sẽ lấy ký tự đầu tiên (cái #) và nó sẽ rơi xuống đáy và được xuất ra trước bất cứ thứ gì khác.

3 dòng đầu tiên là một vòng lặp để tìm nạp tất cả các ký tự còn lại.

Đầu tiên chúng ta cần chuyển đổi các ký tự chữ số hex thành 0-15, bằng cách thực hiện x -= 48, x -= x > 9 ? 7 : 0(kể từ 'A' - '9'8).

Để tìm phần bù, chúng ta chỉ cần chuyển đổi mọi chữ số xthành 15-x. Điều này tương đương với (đối với các giá trị 8 bit) (~x)+16 = ~(x-16).

Cuối cùng, chúng ta phải chuyển đổi các số này thành các chữ số hex, bằng cách thực hiện x += x > 9 ? 7 : 0, x += 48.

Vì vậy, bây giờ chúng tôi có x -= 48, x -= x > 9 ? 7 : 0, x = ~(x - 16), x += x > 9 ? 7 : 0, x += 48.

Lưu ý rằng nếu chúng ta loại bỏ biểu thức với toán tử ternary đầu tiên, thì các chữ số đầu vào A- Fsẽ dẫn đến một x âm sau khi phủ định.

Do đó, chúng ta có thể thay đổi biểu thức trước đó thành : x -= 48, x -= 16, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48, bằng x -= 64, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48.

Các mã trên chỉ là một thực hiện của biểu thức cuối cùng. -Wx -= 32+Ox += 24. Do Marbelous sử dụng số học 8 bit không dấu, nên điều kiện <Anày bao gồm cả trường hợp x > 9x < 0.


Bạn đã tạo ra niềm tin?
Rɪᴋᴇʀ

@RikerW Marbelous đã được tạo / bổ sung bởi một số người dùng PPCG bao gồm cả tôi: Xem tại đây .
es1024

Đuợc. Cảm ơn vì đã cho tôi biết.
Rɪᴋᴇʀ

4

JavaScript ES6, 61 byte 66 68 48 53 64

Lưu khá nhiều byte nhờ @ Cᴏɴᴏʀ O'Bʀɪᴇɴ, @NinjaBearMonkey và @nderscore

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

Tận dụng lợi thế của tự động đúc kiểu. Sửa các số không giết chết số byte


Sử dụng eval(`0x${s.slice(1)}`)thay vìparseInt
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Đó là cùng một chiều dài?
PurkkaKoodari

@ CᴏɴᴏʀO'Bʀɪᴇɴ cảm ơn, tôi đã sử dụng - thay vì eval đã lưu nhiều byte hơn nữa
Downgoat

Ôi, quên mất việc chọn kiểu tự động: D
Conor O'Brien

Hãy thử nó với đầu vào #FFFFFF. Trả về #0.
Conor O'Brien

4

JavaScript ES6, 63 58 52 49 byte

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

Cảm ơn nderscore vì đã tiết kiệm 11 byte!


-5 byte:c=>"#"+[...c].map(x=>"fedcba9876543210"[+('0x'+x)]).join``
nderscore

@nder chính xác, nghĩ về nó rồi :) Cảm ơn. Sẽ sử dụng nó, nhưng với "eval".
nicael

1
à, tôi đã có thêm một -6:c=>c.replace(/\w/g,x=>"fedcba9876543210"[+('0x'+x)])
nderscore

3

Jolf, 17 byte

pq#-w^88C Li1~560
pq                pad
         _Li1     the input, w/out the first char
        C    ~5   parsed as a base-16 integer (~5 = 16)
    w^88          8 ^ 8 - 1 (the magic number)
   -              subtract the parsed input from said number
  #               convert result to hexadecimal
               60 pad the result with 6 0's

Hãy thử nó ở đây! , Bộ kiểm tra (Sử dụng toàn bộ hoạt động, hiện đang hoạt động.)


3

Julia, 74 49 byte

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

Khá lâu tại thời điểm này nhưng đó là một sự khởi đầu. Đây là hàm lambda chấp nhận một chuỗi và trả về một chuỗi. Đầu ra sẽ được viết thường nhưng đầu vào có thể bằng một trong hai.

Như Thomas đã lưu ý , trừ từng thành phần màu 2 chữ số từ 255 tương đương với việc trừ từng chữ số riêng lẻ trong đầu vào thập lục phân từ 15. Vòng qua chuỗi đầu vào, ngoại trừ đầu #, chúng tôi chuyển đổi 15 - chữ số được phân tích thành thập lục phân. Chúng tôi tham gia tất cả những điều này sau đó giải quyết #và gọi nó là tốt.


3

Japt , 35 32 22 20 16 15 byte

¡Y?(F-XnG)sG :X

Giải trình:

¡                 //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)

Đẹp quá Tôi đã thấy điều này tối qua và tự nhủ: "Ngày mai tôi sẽ giúp đánh golf nó xuống." Nhưng bây giờ bạn đã chơi nó xa hơn tôi nghĩ là có thể. :)
Sản phẩm ETH

2

Perl, 30 byte

bao gồm +1 cho -p

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

cách sử dụng: echo #000000 | perl -p file.pl
hoặc echo #000000 | perl -pe 's/\w/sprintf"%x",15&~hex$&/eg'.


2

MATL , 21 byte

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

Điều này sử dụng bản phát hành 6.0.0 của ngôn ngữ / trình biên dịch, sớm hơn thử thách.

Các chữ số đầu vào phải là chữ hoa.

Thí dụ

Điều này đã được thực hiện trên Octave:

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

Chỉnh sửa (ngày 12 tháng 6 năm 2016)

Mã bây giờ có thể được thử trực tuyến . Dấu phẩy cần được thay thế bằng dấu cách và 6Lbởi 4L, để phù hợp với những thay đổi trong ngôn ngữ.

Giải trình

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

Bình thường, 20 19 byte

1 byte nhờ xnor .

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

Hãy thử trực tuyến. Bộ thử nghiệm.

Giải trình

  • z là đầu vào
  • tz loại bỏ #
  • itz16 phân tích cú pháp dưới dạng số thập lục phân
  • t^8 8tính 8 8 - 1
  • -t^8 8itz16tính toán 8 8 - 1 - đầu vào
  • %"#%06x"-t^2 24itz16 định dạng nó thành một chuỗi hex 6 ký tự không đệm và thêm #

Làm thế nào về 8 ^ 8 cho 2 ^ 24?
xnor

1

Haskell, 85 byte

Lần gửi đầu tiên của tôi, nó có thể sẽ dài nhất (85 byte) nhưng này, bạn phải bắt đầu ở đâu đó. Trong Haskell:

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

Đó là sử dụng cùng một phép trừ từ 15 mẹo mà tôi thấy người khác sử dụng.

Tôi cũng đã thử sử dụng printf cùng với thủ thuật khác (trừ 8 ^ 8 - 1) và nó hoạt động trong ghci nhưng vì một số lý do, nó không biên dịch:

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

Nếu ai đó có thể làm cho công việc này sẽ là tuyệt vời!


Chào mừng bạn đến với Câu đố lập trình và Code Golf. Đây là những câu trả lời rất hay (tốt hơn tôi có thể làm trong Haskell!). Tuy nhiên, có một định dạng câu trả lời chung cho các thử thách chơi gôn, cho phép đoạn trích Bảng dẫn đưa câu trả lời của bạn vào bảng xếp hạng. Tôi sẽ chỉnh sửa nó cho bạn; bạn có thể chấp nhận hoặc từ chối chỉnh sửa.
wizzwizz4

Để trả lời bình luận của người dùng khác, hãy nhập @username.
wizzwizz4

@ wizzwizz4 Rất cám ơn sự giúp đỡ của bạn.
lpapez

Bất cứ lúc nào! Bạn có muốn thực hiện một số thử thách của tôi không? Phân tích ghế của bạnchuỗi Map cho Hilbert Curve là những mục yêu thích của tôi, mặc dù đường cong Hilbert thực sự khó.
wizzwizz4

@ wizzwizz4 Chắc chắn, tôi sẽ thấy những gì tôi có thể làm.
lpapez

1

Toán học, 69 60 byte

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

Một lần nữa, đó là quá trình xử lý chuỗi giết chết tôi ở đây.


1

C, 94 byte

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;}

Hàm lấy trong một mảng char, trả về giá trị nghịch đảo. Tạo chữ in hoa để trả lời. Mã này lật từng ký tự hex ASCII thành nghịch đảo của nó nếu nó hợp lệ, bỏ qua nó.


Bạn có thể tiết kiệm một số không gian bằng cách khai báo toàn cầu itrước chức năng:i;
Liam

1

2, 18 ký tự / 34 byte

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

Try it here (Firefox only).

Sử dụng một phiên bản được tạo ra sau thử thách.

Giải trình

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

Giải pháp không cạnh tranh, 15 ký tự / 29 byte

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

Sử dụng phiên âm.


Bạn có thể thêm một phiên bản cạnh tranh không, vì vậy chúng ta có thể thấy ngôn ngữ sắp xếp như thế nào?
lirtosiast

Chắc chắn rồi. Xem chỉnh sửa mới.
Mama Fun Roll

Sử dụng tốt các biểu tượng APL .
lirtosiast

Hehe, biểu tượng đó là thứ có ý nghĩa nhất /g.
Mama Fun Roll

1

Con trăn, 96

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

Mã golf đầu tiên, xin vui lòng cho ý kiến ​​:)


Bạn được phép yêu cầu đầu vào phải bằng "quotes"btw, vì vậy input()hoạt động. Bạn không cần dòng mới và thụt vào vòng lặp for và rangehoạt động tốt. Ngoài ra còn có một vài không gian bạn có thể loại bỏ.
Rɪᴋᴇʀ

int("ff", 16)có thể được thay thế bằng chỉ 255.
Doorknob

Bạn có cần dấu ngoặc đơn bên trong ngoặc sau mỗi x không?
Màu xanh

0

CJam, 16 byte

qA,'G,65>+s_W%er

Điều này khá dài bởi vì CJam xử lý các thay đổi cơ sở khác nhau, do đó, nó chỉ ngắn hơn để thực hiện chuyển ngữ. Xem câu trả lời Retina của tôi để biết thêm về chuyển ngữ.

Hãy thử trực tuyến.

Giải trình

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 byte

Ban đầu tôi dùng 256^3rồi 16^6. Sau đó, tôi đã thấy thay thế của Pietu1998 8^8và bây giờ giải pháp này sử dụng thay thế.

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

0

Java, 95 90 byte

String f(String v){return v.format("#%06x",0xFFFFFF^Integer.parseInt(v.substring(1),16));}

BitOR XOR.


0

Bash + tr, 35 byte

tr 0-9A-Fa-f fedcba9876543210543210

Đầu ra luôn là chữ thường.

Thật không may "tr" không có phạm vi theo thứ tự ngược lại vì vậy tôi đã phải đánh vần chúng.


0

C, 147 byte

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);}}

Đã sử dụng strtol để chuyển đổi từ chuỗi hex sang int sau đó trừ số từ 255 để có được lời khen như bài đăng gốc đã nói. Tuy nhiên, tôi tự hỏi liệu có cách nào để chuyển một loạt các ký tự từ s sang strtol để tôi không phải lãng phí một loạt các byte sao chép sang một chuỗi mới không?


Tôi không nghĩ trình biên dịch thường thực thi trả về hàm và mặc định là int, vì vậy bạn có thể bỏ qua voidkiểu trả về không?
Liam

0

R, 62 byte

f=function(a)sprintf('#%06x',(8^8-1)-strtoi(substr(a,2,7),16))

0

sed, 48 byte

y/0123456789ABCDEFabcdef/fedcba9876543210543210/

Hoặc 36 byte nếu bạn chỉ cần hỗ trợ một trường hợp.


Bạn không cần phải hỗ trợ cả chữ thường và chữ hoa.
Martin Ender

@ MartinBüttner câu hỏi dường như yêu cầu hỗ trợ cho cả hai trường hợp trong đầu vào, nhưng không phải trong đầu ra. Giống như giải pháp bash + tr của tôi, giải pháp này hỗ trợ cả đầu vào nhưng chỉ ghi đầu ra chữ thường.
Glenn Randers-Pehrson

Bạn đã có thêm một 0mã trong mã của mình, giữa 9A(số byte là chính xác, phải là một lỗi sao chép).
hobbs

Câu hỏi cho biết bạn có thể chọn trường hợp đầu vào và đầu ra của bạn.
lirtosiast

0

PowerShell, 48 byte

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

Nhất thiết phải đưa đầu vào qua param($a)dưới dạng một chuỗi, được phân tách bằng 'hoặc ", vì C:\Tools\Scripts\Golfing> .\complementary-colors #a1b2c3trên dòng lệnh PowerShell sẽ coi #a1b2c3như một nhận xét và cuối cùng bỏ qua nó.

Từ trái sang phải, các "#{0:x6}"-f(...)định dạng tính toán đầu ra của chúng tôi trở lại thành thập lục phân với 6 ký tự được đảm bảo (để tính đến đầu vào #ffffff). Trong parens, chúng tôi trừ số đầu vào của chúng tôi từ 0xffffff. Chúng tôi thực hiện điều này bằng cách tận dụng thực tế là PowerShell phân tích các số thập lục phân ở định dạng 0xNNN, vì vậy chúng tôi xây dựng một số hex có định dạng phù hợp từ số đầu vào của chúng tôi $a. (Lưu ý rằng phép cộng cộng .Trim()ngắn hơn .Replace()ở đây một byte.) Chúng tôi cũng tận dụng MBtoán tử đơn nguyên thông qua 16MB-1để xây dựng 16777215thay vì 0xffffff.


0

TeaScript, 24 byte

"#"+S(8**8-1-xS1)t16))x6

Lỗi trong trình thông dịch không cho phép tôi rút ngắn hơn :(

Dùng thử trực tuyến


Downvote giải thích? Nó hoạt động cho tất cả các trường hợp thử nghiệm
Downgoat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.