Diberikan input warna dalam #rrggbb
format hex, output komplemen RGB-nya dalam format yang sama.
Pelengkap RGB R 2 G 2 B 2 warna apa pun R 1 G 1 B 1 didefinisikan sebagai warna dengan nilai R 2 255 - R 1 , nilai B 2 255 - B 1 , dan nilai G 2 255 - G 1 .
Digit heks dapat berupa huruf besar (# FFAA20) atau huruf kecil (# ffaa20). Kasus input dan output tidak harus konsisten (jadi Anda dapat mengambil input dalam huruf kecil tetapi output dalam huruf besar, dan sebaliknya).
Karena ini adalah kode-golf , kode terpendek dalam byte akan menang.
Kasing uji (perhatikan bahwa karena memberi program / fungsi keluarannya sendiri harus menghasilkan input asli (tidak disengaja ), kasing uji harus bekerja di kedua arah):
In/Out Out/In
----------------
#ffffff #000000
#abcdef #543210
#badcab #452354
#133742 #ecc8bd
#a1b2c3 #5e4d3c
#7f7f80 #80807f
Jawaban:
Pyth,
98 byteTerima kasih kepada @isaacg untuk -1 byte!
Mengurangkan nilai warna tertentu dari 255 sama dengan mengurangkan setiap digit heksadesimalnya dari 15. Katakan angka 16a + b . Maka nilai angka yang dibuat dengan mengurangi angka-angka dari 15 adalah 16 (15-a) + (15-b) = 255 - (16a + b) .
Coba di sini . Suite uji.
sumber
'0123456789abcdef'
untuk mengonversi ke hex (alih-alihdec2hex
fungsi)U
tidak perlu - itu secara implisit diisi olehM
.Retina,
1310 byteAda tiga bagian kode, dipisahkan oleh backticks (
`
):T
menentukan mode transliterasi, yang menggantikan setiap karakter di bagian kedua dengan karakter yang sesuai di bagian ketiga.w
sama dengan regex tradisional\w
, atau_0-9A-Za-z
, yang diperluas ke_0123456789ABCDEFGH...
.Bagian kedua diperluas
GFEDCBA9876543210
, berkat kemampuan Retina yang bagus untuk berkembang dalam urutan terbalik. Letakkan ini di atas satu sama lain, dan kita mendapatkan:Perhatikan bahwa karakter terakhir,,
0
diulang agar sesuai dengan panjang string yang lebih panjang, tetapi kami hanya peduli dengan karakter heksadesimal, yang ditunjukkan oleh caret.Terima kasih kepada Martin Büttner karena menyarankan pendekatan ini.
Coba test suite online.
sumber
Marbelous, 41 byte
Penerjemah Online di sini. Masukan harus dalam huruf besar.
Penjelasan
The
00
dan]]
di bagian bawah akan mengambil karakter pertama (the#
) dan itu akan jatuh ke bawah dan dikeluarkan sebelum yang lain.3 baris pertama adalah loop untuk mengambil semua karakter yang tersisa.
Pertama-tama kita perlu mengkonversi karakter hex digit ke 0-15, dengan melakukan
x -= 48, x -= x > 9 ? 7 : 0
(karena'A' - '9'
8).Untuk menemukan pelengkap, kita cukup mengonversi setiap digit
x
menjadi15-x
. Ini setara dengan (untuk nilai 8-bit)(~x)+16 = ~(x-16)
.Akhirnya, kita harus mengubah angka-angka ini kembali menjadi digit hex, dengan melakukan
x += x > 9 ? 7 : 0, x += 48
.Jadi sekarang sudah
x -= 48, x -= x > 9 ? 7 : 0, x = ~(x - 16), x += x > 9 ? 7 : 0, x += 48
.Perhatikan bahwa jika kita menghapus ekspresi dengan operator ternary pertama, maka digit input
A
-F
akan menghasilkan x negatif setelah negasi.Jadi kita dapat mengubah ekspresi sebelumnya menjadi:,
x -= 48, x -= 16, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48
yang sama denganx -= 64, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48
.Kode di atas hanyalah implementasi dari ekspresi terakhir.
-W
adalahx -= 32
dan+O
sekarangx += 24
. Karena Marbelous menggunakan aritmatika 8-bit yang tidak ditandatangani, kondisinya<A
mencakup kasusx > 9
danx < 0
.sumber
JavaScript ES6, 61 byte
66 68 48 53 64Menghemat beberapa byte berkat @ Cᴏɴᴏʀ O'Bʀɪᴇɴ, @NinjaBearMonkey, dan @nderscore
Mengambil keuntungan dari casting tipe otomatis. Memperbaiki nol membunuh jumlah byte
sumber
eval(`0x${s.slice(1)}`)
sebagai gantiparseInt
-
alih-alih eval yang menyimpan lebih banyak byte#FFFFFF
. Pengembalian#0
.JavaScript ES6,
63585249 byteTerima kasih kepada nderscore untuk menghemat 11 byte!
sumber
c=>"#"+[...c].map(x=>"fedcba9876543210"[+('0x'+x)]).join``
c=>c.replace(/\w/g,x=>"fedcba9876543210"[+('0x'+x)])
Jolf, 17 byte
Coba di sini! , Test suite (Gunakan full run, yang sekarang berfungsi.)
sumber
Julia,
7449 byteCukup lama saat ini tetapi ini adalah awal. Ini adalah fungsi lambda yang menerima string dan mengembalikan string. Outputnya akan dalam huruf kecil tetapi inputnya bisa dalam baik.
Seperti dicatat Thomas , mengurangi setiap komponen warna 2-digit dari 255 sama dengan mengurangkan masing-masing digit individu dalam input heksadesimal dari 15. Melilit string input, tidak termasuk yang terdepan
#
, kami mengonversi 15 - digit yang diurai menjadi heksadesimal. Kami bergabung dengan semua ini kemudian#
memperbaiki dan menyebutnya bagus.sumber
Japt ,
353222201615 bytePenjelasan:
sumber
Perl, 30 byte
termasuk +1 untuk
-p
penggunaan:
echo #000000 | perl -p file.pl
atau
echo #000000 | perl -pe 's/\w/sprintf"%x",15&~hex$&/eg'
.sumber
MATL , 21 byte
Ini menggunakan rilis 6.0.0 dari bahasa / kompiler, yang lebih awal dari tantangan.
Digit input harus huruf besar.
Contoh
Ini telah dieksekusi pada Oktaf:
Edit (12 Juni 2016)
Kode sekarang dapat dicoba secara online . Koma perlu diganti dengan spasi, dan
6L
oleh4L
, agar sesuai dengan perubahan dalam bahasa.Penjelasan
sumber
Pyth,
2019 byte1 byte terima kasih kepada xnor .
Cobalah online. Suite uji.
Penjelasan
z
adalah inputtz
menghapus#
itz16
mem-parsing sebagai angka heksadesimalt^8 8
menghitung 8 8 - 1-t^8 8itz16
menghitung 8 8 - 1 - input%"#%06x"-t^2 24itz16
memformatnya menjadi string hex 6-karakter nol-empuk dan menambahkan#
sumber
Haskell, 85 byte
Kiriman pertama saya, mungkin akan menjadi yang terpanjang (85 byte) tapi hei, Anda harus mulai dari suatu tempat. Dalam Haskell:
Ini menggunakan pengurangan yang sama dari 15 trik yang saya lihat orang lain gunakan.
Saya juga mencoba menggunakan printf bersama dengan trik lainnya (kurangi 8 ^ 8 - 1) dan itu berfungsi dalam ghci tetapi karena beberapa alasan ia tidak dapat dikompilasi:
Jika seseorang dapat membuat pekerjaan ini, itu akan menjadi hebat!
sumber
@username
.Mathematica,
6960 byteSekali lagi, ini adalah pemrosesan string yang membunuh saya di sini.
sumber
C, 94 byte
Fungsi mengambil dalam array char, mengembalikan nilai terbalik. Menghasilkan huruf besar untuk respons. Kode membalik setiap karakter hex ASCII ke kebalikannya jika valid, abaikan sebaliknya.
sumber
i
sebelum fungsi:i;
𝔼𝕊𝕄𝕚𝕟 2, 18 karakter / 34 byte
Try it here (Firefox only).
Menggunakan versi yang dibuat setelah tantangan.
Penjelasan
Solusi non-kompetitif, 15 karakter / 29 byte
Menggunakan transliterasi.
sumber
⌿
./g
.Python, 96
Golf kode pertama, tolong beri pendapat :)
sumber
"quotes"
btw, jadiinput()
berfungsi. Anda tidak perlu baris baru dan lekukan pada for loop, danrange
berfungsi dengan baik. Ada juga beberapa ruang yang dapat Anda hapus.int("ff", 16)
bisa diganti dengan adil255
.CJam, 16 byte
Ini cukup lama karena CJam menangani perubahan basis secara berbeda, jadi lebih pendek untuk hanya melakukan transliterasi. Lihat jawaban Retina saya untuk lebih lanjut tentang transliterasi.
Cobalah online.
Penjelasan
sumber
Python 3, 44 byte
Awalnya saya gunakan
256^3
, lalu16^6
. Lalu saya melihat Pietu19988^8
dan sekarang solusi ini menggunakan itu.sumber
Java,
9590 byteBitor XOR.
sumber
Bash + tr, 35 byte
Output selalu huruf kecil.
Sayangnya "tr" tidak mengambil rentang dalam urutan terbalik jadi saya harus mengejanya.
sumber
C, 147 byte
Digunakan strtol untuk mengkonversi dari string hex ke int kemudian kurangi jumlahnya dari 255 untuk mendapatkan pujian seperti kata posting asli. Namun, saya bertanya-tanya apakah ada cara untuk melewatkan serangkaian karakter dari s ke strtol jadi saya tidak perlu membuang banyak byte yang disalin ke string baru?
sumber
void
jenis kembali?R, 62 byte
sumber
sed, 48 byte
Atau 36 byte jika Anda hanya perlu mendukung satu kasing.
sumber
0
dalam kode Anda, antara9
danA
(jumlah byte benar, harus merupakan kesalahan penyalinan).PowerShell, 48 byte
Diperlukan mengambil input melalui
param($a)
sebagai string, dibatasi dengan'
atau"
, karenaC:\Tools\Scripts\Golfing> .\complementary-colors #a1b2c3
pada baris perintah PowerShell akan memperlakukan#a1b2c3
sebagai komentar dan mengabaikannya.Kiri-ke-kanan,
"#{0:x6}"-f(...)
memformat kalkulasi hasil kami kembali menjadi heksadesimal dengan 6 karakter yang dijamin (untuk memperhitungkan input#ffffff
). Di dalam parens, kami mengurangi nomor input kami dari0xffffff
. Kami melakukan ini dengan memanfaatkan fakta bahwa PowerShell mem-parsing angka heksadesimal dalam format0xNNN
, jadi kami membangun nomor hex format yang tepat dari nomor input kami$a
. (Perhatikan bahwa gabungan plus.Trim()
lebih pendek dari.Replace()
sini dengan satu byte.) Kami juga memanfaatkanMB
operator unary melalui16MB-1
untuk membangun16777215
bukan0xffffff
.sumber
TeaScript, 24 byte
Bug di interpreter tidak membuat saya mendapatkan ini lebih pendek :(
Cobalah online
sumber