Biorąc pod uwagę wejście koloru w #rrggbb
formacie szesnastkowym, wypisz jego dopełnienie RGB w tym samym formacie.
RGB dopełniacza R 2 G 2 B 2 dowolnego koloru R 1 G 1 B 1 jest zdefiniowany jako kolor z R 2 wartości 255 - R 1 , B 2 wartości 255 - B 1 i G 2 wartości 255 - G 1 .
Cyfry szesnastkowe mogą być pisane dużymi literami (# FFAA20) lub małymi literami (# ffaa20). Przypadek wejścia i wyjścia nie musi być spójny (więc możesz brać dane wejściowe małymi literami, ale dane wyjściowe dużymi literami i odwrotnie).
Ponieważ jest to code-golf , wygrywa najkrótszy kod w bajtach.
Przypadki testowe (zwróć uwagę, że ponieważ nadanie programowi / funkcji własnego wyniku powinno dawać oryginalne dane wejściowe (jest to ewolwenta ), przypadki testowe powinny działać w obu kierunkach):
In/Out Out/In
----------------
#ffffff #000000
#abcdef #543210
#badcab #452354
#133742 #ecc8bd
#a1b2c3 #5e4d3c
#7f7f80 #80807f
Odpowiedzi:
Pyth,
98 bajtówDzięki @isaacg za -1 bajt!
Odejmowanie wartości określonego koloru od 255 jest równoważne odejmowaniu każdej jego szesnastkowej cyfry od 15. Powiedzmy, że liczba to 16a + b . Zatem wartość liczby utworzonej przez odjęcie jej cyfr od 15 wynosi 16 (15-a) + (15-b) = 255 - (16a + b) .
Wypróbuj tutaj . Zestaw testowy.
źródło
'0123456789abcdef'
do konwersji na hex (zamiastdec2hex
funkcji)U
to niepotrzebne - jest domyślnie wypełnione przezM
.Siatkówka,
1310 bajtówKod składa się z trzech części oddzielonych znakami wstecznymi (
`
):T
określa tryb transliteracji, który zastępuje każdy znak w drugiej części odpowiednim znakiem w trzeciej części.w
jest taki sam jak tradycyjne wyrażenia regularne\w
, lub_0-9A-Za-z
, który jest rozwinięty do_0123456789ABCDEFGH...
.Druga część została rozszerzona
GFEDCBA9876543210
, dzięki sprytnej zdolności Retiny do ekspansji w odwrotnej kolejności. Połóż je jeden na drugim, a otrzymamy:Zauważ, że ostatni znak,
0
powtarza się, aby dopasować długość dłuższego łańcucha, ale dbamy tylko o znaki szesnastkowe, pokazane przez daszki.Podziękowania dla Martina Büttnera za zasugerowanie takiego podejścia.
Wypróbuj zestaw testowy online.
źródło
Cudowny, 41 bajtów
Tłumacz online tutaj. Dane wejściowe powinny być pisane wielkimi literami.
Wyjaśnienie
00
I]]
na dole pobiera pierwszy znak (the#
) i spadnie na dno i być wyprowadzane zanim cokolwiek innego.Pierwsze 3 wiersze to pętla do pobrania wszystkich pozostałych znaków.
Najpierw musimy przekonwertować znaki szesnastkowe na 0-15, wykonując
x -= 48, x -= x > 9 ? 7 : 0
(ponieważ'A' - '9'
jest to 8).Aby znaleźć uzupełnienie, musimy po prostu przekonwertować każdą cyfrę
x
na15-x
. Jest to równoważne (dla wartości 8-bitowych)(~x)+16 = ~(x-16)
.Na koniec musimy przekonwertować te liczby z powrotem na cyfry szesnastkowe
x += x > 9 ? 7 : 0, x += 48
.Więc teraz mamy
x -= 48, x -= x > 9 ? 7 : 0, x = ~(x - 16), x += x > 9 ? 7 : 0, x += 48
.Zauważ, że jeśli usuniemy wyrażenie z pierwszym operatorem trójskładnikowym, wówczas wprowadź cyfry
A
-F
spowoduje negację x po negacji.W ten sposób możemy zmienić poprzednie wyrażenie na:,
x -= 48, x -= 16, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48
co jest równex -= 64, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48
.Powyższy kod jest tylko implementacją ostatniego wyrażenia.
-W
jestx -= 32
i+O
jestx += 24
. Ponieważ Marbelous używa 8-bitowej arytmetyki bez znaku, warunek<A
obejmuje zarówno przypadek, jakx > 9
ix < 0
.źródło
JavaScript ES6, 61 bajtów
66 68 48 53 64Oszczędza sporo bajtów dzięki @ Cᴏɴᴏʀ O'Bʀɪᴇɴ, @NinjaBearMonkey i @nderscore
Korzysta z automatycznego odlewania. Naprawienie zer zabiło liczbę bajtów
źródło
eval(`0x${s.slice(1)}`)
zamiastparseInt
-
zamiast eval, co pozwoliło zaoszczędzić jeszcze więcej bajtów#FFFFFF
. Powraca#0
.JavaScript ES6,
63585249 bajtówDzięki nderscore za zapisanie 11 bajtów!
źródło
c=>"#"+[...c].map(x=>"fedcba9876543210"[+('0x'+x)]).join``
c=>c.replace(/\w/g,x=>"fedcba9876543210"[+('0x'+x)])
Jolf, 17 bajtów
Wypróbuj tutaj! , Zestaw testowy (użyj pełnego uruchomienia, które teraz działa.)
źródło
Julia,
7449 bajtówW tej chwili dość długo, ale to dopiero początek. Jest to funkcja lambda, która przyjmuje ciąg i zwraca ciąg. Dane wyjściowe będą pisane małymi literami, ale dane wejściowe mogą znajdować się w jednym z nich.
Jak zauważył Thomas , odejmowanie każdej dwucyfrowej składowej koloru od 255 jest równoważne odejmowaniu każdej pojedynczej cyfry w danych szesnastkowych od 15. Pętlę nad łańcuchem wejściowym, z wyłączeniem wiodącego
#
, konwertujemy 15 - parsowaną cyfrę na szesnastkową. Łączymy je wszystkie, a następnie wybieramy#
i nazywamy to dobrym.źródło
Japt ,
353222201615 bajtówWyjaśnienie:
źródło
Perl, 30 bajtów
zawiera +1 dla
-p
użycie:
echo #000000 | perl -p file.pl
lub
echo #000000 | perl -pe 's/\w/sprintf"%x",15&~hex$&/eg'
.źródło
MATL , 21 bajtów
Korzysta z wersji 6.0.0 języka / kompilatora, która jest wcześniejsza niż wyzwanie.
Wprowadzane cyfry powinny być pisane wielkimi literami.
Przykład
Zostało to wykonane w Octave:
Edytuj (12 czerwca 2016 r.)
Kod można teraz wypróbować online . Przecinki muszą zostać zastąpione przez przestrzenie, a
6L
przez4L
, w celu dostosowania się do zmian na języku.Wyjaśnienie
źródło
Pyth,
2019 bajtów1 bajt dzięki xnor .
Wypróbuj online. Zestaw testowy.
Wyjaśnienie
z
jest wejściemtz
usuwa#
itz16
parsuje jako liczbę szesnastkowąt^8 8
oblicza 8 8 - 1-t^8 8itz16
oblicza 8 8-1 - wejście%"#%06x"-t^2 24itz16
formatuje go do 6-znakowego szesnastkowego łańcucha z zerami i dodaje#
źródło
Haskell, 85 bajtów
Moje pierwsze zgłoszenie będzie prawdopodobnie najdłuższe (85 bajtów), ale hej, musisz gdzieś zacząć. W Haskell:
Używa tego samego odejmowania od 15 lew, których widziałem innych ludzi.
Próbowałem także użyć printf wraz z drugą sztuczką (odejmij 8 ^ 8 - 1) i działa w ghci, ale z jakiegoś powodu nie kompiluje się:
Gdyby ktoś mógł sprawić, by to zadziałało, byłoby świetnie!
źródło
@username
.Mathematica,
6960 bajtówPo raz kolejny zabija mnie tutaj przetwarzanie łańcuchów.
źródło
C, 94 bajty
Funkcja przyjmuje tablicę char, zwraca wartość odwrotną. Tworzy wielkie litery na odpowiedź. Kod odwraca każdy znak szesnastkowy ASCII na jego odwrotność, jeśli jest poprawny, ignoruje go inaczej.
źródło
i
przed funkcją:i;
𝔼𝕊𝕄𝕚𝕟 2, 18 znaków / 34 bajty
Try it here (Firefox only).
Korzystanie z wersji utworzonej po wyzwaniu.
Wyjaśnienie
Niekonkurencyjne rozwiązanie, 15 znaków / 29 bajtów
Wykorzystuje transliterację.
źródło
⌿
./g
.Python, 96
Pierwszy kod golfa, proszę o opinie :)
źródło
"quotes"
btw, więcinput()
działa. Nie potrzebujesz nowej linii i wcięcia w pętli for, irange
działa dobrze. Istnieje również kilka spacji, które można usunąć.int("ff", 16)
można zastąpić przez just255
.CJam, 16 bajtów
Jest to dość długie, ponieważ CJam inaczej obsługuje zmiany bazy, więc krótsza była transliteracja. Zobacz moją odpowiedź Retina, aby uzyskać więcej informacji na temat transliteracji.
Wypróbuj online.
Wyjaśnienie
źródło
Python 3, 44 bajty
Pierwotnie
256^3
wtedy użyłem16^6
. Potem zobaczyłem Pietu19988^8
i teraz to rozwiązanie używa tego zamiast tego.źródło
Java,
9590 bajtówBitowy XOR.
źródło
Bash + tr, 35 bajtów
Dane wyjściowe są zawsze małe.
Niestety „tr” nie przyjmuje zakresów w odwrotnej kolejności, więc musiałem je przeliterować.
źródło
C, 147 bajtów
Użyłem strtol do konwersji z ciągu szesnastkowego na int, a następnie odejmowałem liczbę od 255, aby uzyskać komplement, tak jak powiedział oryginalny post. Zastanawiam się jednak, czy istnieje sposób na przekazanie szeregu znaków od s do strtol, więc nie muszę marnować wiązki bajtów na nowy ciąg?
źródło
void
typ zwracany?R, 62 bajty
źródło
sed, 48 bajtów
Lub 36 bajtów, jeśli potrzebujesz obsługiwać tylko jedną sprawę.
źródło
0
kodzie jest dodatkowy kod między9
iA
(liczba bajtów jest prawidłowa, musi to być błąd kopiowania).PowerShell, 48 bajtów
Koniecznie pobiera dane wejściowe
param($a)
jako ciąg, rozdzielany znakami'
lub"
, ponieważC:\Tools\Scripts\Golfing> .\complementary-colors #a1b2c3
w wierszu polecenia programu PowerShell będzie on traktowany#a1b2c3
jako komentarz i zostanie zignorowany.Od lewej do prawej
"#{0:x6}"-f(...)
formatuje nasze obliczenia wyjściowe z powrotem do postaci szesnastkowej z gwarantowanymi 6 znakami (w celu uwzględnienia danych wejściowych#ffffff
). Wewnątrz parens odejmujemy nasz numer wejściowy0xffffff
. Robimy to, wykorzystując fakt, że PowerShell analizuje liczby szesnastkowe w formacie0xNNN
, więc konstruujemy liczbę szesnastkową w odpowiednim formacie z naszej liczby wejściowej$a
. (Zauważ, że konkatenacja plus.Trim()
jest krótsza niż.Replace()
tutaj o jeden bajt.) Wykorzystujemy równieżMB
jednoargumentowy operator poprzez16MB-1
konstruowanie16777215
zamiast0xffffff
.źródło
TeaScript, 24 bajty
Błędy w tłumaczu nie pozwalają mi się skrócić :(
Wypróbuj online
źródło