निकटतम तीन अंकों वाले हेक्स रंग का पता लगाएं


23

सीएसएस में, रंगों को "हेक्स ट्रिपलेट" द्वारा निर्दिष्ट किया जा सकता है - एक तीन बाइट (छह अंक) हेक्साडेसिमल संख्या जहां प्रत्येक बाइट रंग के लाल, हरे या नीले घटकों का प्रतिनिधित्व करता है। उदाहरण के लिए, #FF0000पूरी तरह से लाल है, और इसके बराबर है rgb(255, 0, 0)

रंगों को शॉर्टहैंड नोटेशन द्वारा भी दर्शाया जा सकता है जो तीन हेक्साडेसिमल अंकों का उपयोग करता है। शॉर्टहैंड प्रत्येक अंक को डुप्लिकेट करके छह अंकों के रूप में फैलता है। उदाहरण के लिए, #ABCबन जाता है #AABBCC

चूंकि हेक्स शॉर्टहैंड में कम अंक हैं, इसलिए कम रंगों का प्रतिनिधित्व किया जा सकता है।

चुनौती

एक प्रोग्राम या फ़ंक्शन लिखें जो छह अंकों का हेक्साडेसिमल रंग कोड लेता है और निकटतम तीन अंकों के रंग कोड को आउटपुट करता है।

यहाँ एक उदाहरण है:

  • इनपुट हेक्स कोड: # 28a086
  • लाल घटक
    • 0x28 = 40 (दशमलव)
    • 0x22 = 34
    • 0x33 = 51
    • 0x22 करीब है, इसलिए छोटा रंग कोड का पहला अंक 2 है
  • हरा घटक
    • 0xa0 = 160
    • 0x99 = 153
    • 0xaa = 170
    • 0x99 करीब है, इसलिए दूसरा अंक 9 है
  • नीला घटक
    • 0x86 = 134
    • 0x77 = 119
    • 0x88 = 136
    • 0x88 करीब है, इसलिए तीसरा अंक 8 है
  • छोटा रंग कोड # 298 है (जो # 229988 तक फैलता है)

आपके प्रोग्राम या फंक्शन को इनपुट के रूप में स्वीकार करना चाहिए और छः अंकों वाले हेक्साडेसिमल कलर कोड के साथ प्रीपेल्ड किया गया #और आउटपुट के साथ तीन डिजिट का कलर कोड तैयार किया गया #

उदाहरण

  • # FF0000 → # F00
  • # 00FF00 → # 0F0
  • # D913C4 → # D1C
  • # C0DD39 → # BD3
  • # 28A086 → # 298
  • # C0CF6F → # BC7

स्कोरिंग

यह एक कोड-गोल्फ चुनौती है, इसलिए आपकी भाषा में सबसे कम जवाब जीतता है! मानक नियम लागू होते हैं।


1
"पूर्ण रंग कोड के प्रत्येक घटक और शॉर्टहैंड रंग कोड के संगत घटक के बीच अंतर को जोड़ना" - यह हिस्सा भ्रामक है। कहीं कोई जोड़ नहीं है, है ना?
ग्रेजेगॉर्ज ओलेदज़की

3
ध्यान दें कि यदि आप केवल वैकल्पिक अंकों को छोड़ते हैं, तो प्रत्येक लघु रंग पूर्ण रंगों की एक समान संख्या का प्रतिनिधित्व करता है, ताकि निकटतम रंग की तुलना में बेहतर प्रतिनिधित्व करने पर विचार किया जा सके।
नील

6
इस सैंडबॉक्स में देखा, लेकिन यह उल्लेख करना भूल गया कि मुझे लगता #है कि चुनौती के लिए कुछ भी करने की आवश्यकता नहीं है ।
झबरा

2
क्या हम लोअरकेस में आउटपुट कर सकते हैं?
अरनौल

2
0x22 34 है, 30 नहीं
क्रूगा

जवाबों:


4

जावास्क्रिप्ट (ईएस 6), 55 बाइट्स

s=>s.replace(/\w./g,x=>(('0x'+x)/17+.5|0).toString(16))

इसे ऑनलाइन आज़माएं!


स्टर्लिंग का अच्छा उपयोग! मुझे यह महसूस नहीं हुआ कि यह एक मूलांक परम ले सकता है।
wrmug

8

05AB1E , 13 बाइट्स

ćs2ôH8+17÷hJ«

इसे ऑनलाइन आज़माएं!

कैसे?

ćs2ôH8+17÷hJ« | string, S   e.g. stack: "#B23F08"
ć             | decapitate              "B23F08", "#"
 s            | swap                    "#", "B23F08"
  2           | two                     "#", "B23F08", 2
   ô          | chuncks                 "#", ["B2", "3F", "08"]
    H         | from hexadecimal        "#", [178, 63, 8]
     8        | eight                   "#", [178, 63, 8], 8
      +       | add                     "#", [186, 71, 16]
       17     | seventeen               "#", [186, 71, 16], 17
         ÷    | integer divide          "#", [10, 4, 0]
          h   | to hexadecimal          "#", ["A", "4", "0"]
           J  | join                    "#", "A40"
            « | concatenate             "#A40"
              | print top of stack

1
मैंने N 05AB1E उत्तर को करने के बारे में भी सोचा - जब तक मैंने कुछ याद नहीं किया है, जेली में हेक्साडेसिमल रूपांतरण काफी बाइट्स लेता है!
निक केनेडी

1
हाँ, जेली में किसी भी पाठ आधार रूपांतरणों के लिए बिल्ट-इन नहीं।
जोनाथन एलन

1
" ćडिकैप्रिट " यह वर्णन करने का एक और तरीका है, योग्य। : D अच्छा जवाब हालांकि, +1 मुझसे।
केविन क्रूज़सेन

6

जाप , 16 बाइट्स

r"%w"²_n16_r17Ãg

इसे आज़माएं या सभी परीक्षण मामलों को चलाएं

r"%w"²_n16_r17Ãg     :Implicit input of string
r                    :Replace
 "%w"                :RegEx /\w/g
     ²               :Duplicate, giving /\w\w/g
      _              :Pass each match through a function
       n16           :  Convert to decimal
          _          :  Pass through the following function, and convert back to hex
           r17       :    Round to the nearest multiple of 17
              Ã      :  End function
               g     :  Get first character

5

8088 असेंबली, आईबीएम पीसी डॉस, 59 58 बाइट्स

अनुपलब्ध सूची:

BE 0082     MOV  SI, 82H    ; SI to begining of input string 
AC          LODSB           ; load first '#' char into AL 
B4 0E       MOV  AH, 0EH    ; BIOS display char function  
CD 10       INT  10H        ; call BIOS 
B3 11       MOV  BL, 17     ; set up for divide by 17 
B9 0304     MOV  CX, 0304H  ; hex byte loop counter (CH=3), shift counter (CL=4) 
        LOOP_BYTE: 
AD          LODSW           ; load next two ASCII hex chars into AX 
B7 02       MOV  BH, 2      ; hex chars loop counter
        LOOP_ALPHA:
2C 30       SUB  AL, '0'    ; convert from ASCII 
3C 0A       CMP  AL, 10     ; is digit > 10 (A-F)? 
7C 02       JL   NOT_ALPHA  ; if not, jump to next char
2C 07       SUB  AL, 7      ; ASCII adjust alpha char to binary 
        NOT_ALPHA: 
86 E0       XCHG AH, AL     ; swap first and second chars 
FE CF       DEC  BH         ; decrement loop counter
75 F2       JNZ  LOOP_ALPHA ; loop to next hex char
D2 E0       SHL  AL, CL     ; shift low nibble to high nibble 
02 C4       ADD  AL, AH     ; add first and second nibbles
32 E4       XOR  AH, AH     ; clear AH for add/division
05 0008     ADD  AX, 8      ; add 0.5 (8/16) to round (with overflow) 
F6 F3       DIV  BL         ; divide by 17 
3C 0A       CMP  AL, 10     ; is digit > 10? 
7C 02       JL   DISP_CHAR  ; if not, jump to display digit 
04 07       ADD  AL, 7      ; binary adjust alpha char to ASCII 
        DISP_CHAR: 
04 30       ADD  AL, '0'    ; convert to ASCII 
B4 0E       MOV  AH, 0EH    ; BIOS display char function  
CD 10       INT  10H        ; call BIOS 
FE CD       DEC  CH         ; decrement loop counter 
75 D4       JNZ  LOOP_BYTE  ; loop to next hex byte
C3          RET             ; return to DOS 

स्टैंडअलोन पीसी डॉस निष्पादन योग्य। इनपुट कमांड लाइन के माध्यम से है, आउटपुट कंसोल के लिए है।

अधिकांश कोड लंबाई बाइट्स में आवश्यक हेक्स स्ट्रिंग I / O के रूपांतरण को संभाल रही है, क्योंकि DOS / x86 मशीन कोड में इसके लिए कोई बिल्ट-इन नहीं है।

मैं / हे:

यहाँ छवि विवरण दर्ज करें

HEXCLR.COM , या xxdहेक्सडंप डाउनलोड और परीक्षण करें :

0000000: be82 00ac b40e cd10 b311 b904 03ad b702  ................
0000010: 2c30 3c0a 7c02 2c07 86e0 fecf 75f2 d2e0  ,0<.|.,.....u...
0000020: 02c4 32e4 0508 00f6 f33c 0a7c 0204 0704  ..2......<.|....
0000030: 30b4 0ecd 10fe cd75 d4c3                 0......u..

3

रेटिना 0.8.2 , 88 बाइट्स

(\w)(.)
$1,$2;
[A-F]
1$&
T`L`d
\d+
$*
+`1,
,16$*
,
8$*
(1{17})*1*;
$#1;
T`d`L`1\d
B\B|;

इसे ऑनलाइन आज़माएं! लिंक में परीक्षण मामले शामिल हैं। स्पष्टीकरण:

(\w)(.)
$1,$2;

हेक्स अंकों को जोड़ी।

[A-F]
1$&
T`L`d

प्रत्येक अंक को अलग से दशमलव में बदलें।

\d+
$*

प्रत्येक दशमलव अंक को unary में बदलें।

+`1,
,16$*

अंकों की जोड़ी के हेक्साडेसिमल रूपांतरण को समाप्त करें।

,
8$*
(1{17})*1*;
$#1;

8 जोड़ें और 17 से विभाजित करें।

T`d`L`1\d
B\B|;

वापस हेक्साडेसिमल में परिवर्तित करें।



3

पायथन 3 , 72 70 68 बाइट्स

lambda x:'#'+''.join(f"{(int(x[i:i+2],16)+8)//17:X}"for i in(1,3,5))

इसे ऑनलाइन आज़माएं!

यह ग्रेज़गोरज़ ओलेडज़िस मूल उत्तर का एक बंदरगाह है , जो मैंने उन्हें नीचे गोल्फ में मदद की थी।

पायथन 3 की दो विशेषताएं हमें बाइट बचाने में मदद करती हैं:

  • डिफ़ॉल्ट रूप से फ्लोटिंग पॉइंट डिवीजन
  • स्ट्रिंग शाब्दिक स्वरूप

जोनाथन एलन को -2 बाइट्स थैंक्स


2
(int(x[i:i+2],16)+8)//172 बचाता है
जोनाथन एलन



2

वोल्फ्राम भाषा (गणितज्ञ) , 63 48 बाइट्स

"#"<>Round[15List@@RGBColor@#]~IntegerString~16&

इसे ऑनलाइन आज़माएं!

-15 के लिए धन्यवाद बाइट्स attinat ! सिंटैक्स के StringJoinसाथ बदलना <>और संपीड़ित करना।

  1. RGBColor@#इनपुट स्ट्रिंग को RGBColor[r, g, b]सीमा में तीन फ्लोटिंग-पॉइंट तर्क के साथ फॉर्म के रंग में परिवर्तित करता है ।

  2. Round[15 List @@ %]तीन तर्कों की सूची को 15 से गुणा करता है और उन्हें निकटतम पूर्णांक में गोल करता है। अब हमारे पास तीन वांछित हेक्साडेसिमल अंकों के अनुरूप तीन पूर्णांक मानों की एक सूची है।

  3. %~IntegerString~16 तीन पूर्णांकों की इस सूची को एक वर्ण के तीन हेक्साडेसिमल तारों की सूची में परिवर्तित करता है।

  4. "#"<>%एक #चरित्र प्रस्तुत करता है और इन सभी पात्रों को एक साथ जोड़ता है ।



2

मैथॉल्फ , 19 12 बाइट्स

╞2/¢8+F/¢'#▌

चरित्र-सूची के रूप में आउटपुट। यदि यह अनुमति नहीं है, yतो चरित्र-सूची को एक स्ट्रिंग में शामिल करने के लिए एक अतिरिक्त अनुगामी जोड़ा जाना चाहिए।

-7 बाइट्स @ maxb के लिए धन्यवाद , क्योंकि मैंने एक बिलिन ( ) 2ô_2<\1>]से पिछले देखा 2/

इसे ऑनलाइन आज़माएं।

स्पष्टीकरण:

              # Remove the first character from the (implicit) input-string
 2/            # Split the string into parts of size 2
   ¢           # Convert each part from hexadecimal to integer
    8+         # Add 8 to each integer
      F/       # Integer-divide each integer by 17
        ¢      # Then convert back from integer to hexadecimal
         '#▌  '# Prepend '#' in front of the list
               # (which is output implicitly as result)

2

रूबी (2.5.3), 45 , 44 , 42 बाइट्स

->a{a.gsub(/\w./){|b|"%X"%((8+b.hex)/17)}}

संपादित करें: एक बाइट को बचाया क्योंकि हमें रेगेक्स में दूसरे चरित्र के लिए एक चरित्र समूह की आवश्यकता नहीं है (नील के उत्तर से प्रेरित)

संपादित 2: 2 बाइट्स को बचाया क्योंकि डैश रॉकेट लैम्ब्डा सिंटैक्स को तर्क के आसपास कोष्ठक की आवश्यकता नहीं है


2
आप स्टड पर इनपुट लेने और ब्लॉक के अंदर एक तर्क के बजाय झंडे और अन्य 2 का उपयोग करके-p 7 बाइट्स बचा सकते हैं $&: tio.run/##KypNqvz/…
जॉर्डन

1
@ जोर्डन धन्यवाद! मैं उन दोनों में से किसी के बारे में नहीं जानता था, इसलिए यह भविष्य के गोल्फ प्रयासों के लिए एक वास्तविक मदद है
डेवमॉन्गोज

1

पायथन 2 ( 109 101 97 85 83 74 बाइट्स)

lambda x:'#'+''.join(hex(int(int(x[i:i+2],16)/17.+.5))[2:]for i in[1,3,5])

"निकटतम दूरी" को 17 और गोलाई द्वारा विभाजन द्वारा नियंत्रित किया जाता है।

सुधार:

के int(...+.5)बजाय चाल का उपयोग करके -8 बाइट्सint(round(...))

के बजाय सूची समझ का उपयोग करके -4 बाइट्स map()

#आउटपुट में हार्डकोडिंग द्वारा -1 बाइट (धन्यवाद @movatica)

-10 बाइट्स re.findall("..",...)स्पष्ट स्ट्रिंग splicing के पक्ष में उपयोग नहीं करके

सूची joinबोध का उपयोग नहीं करके -2 बाइट्स, लेकिन इनलाइन जनरेटर अभिव्यक्ति में (धन्यवाद @movatica)

-1 बाइट :7को नीले हिस्से के लिए समाप्त नहीं करना चाहिए

-9 बाइट्स रंगों पर बेहतर पुनरावृत्ति द्वारा - यानी सूचकांकों पर पुनरावृत्ति, वास्तविक अक्षर नहीं (धन्यवाद @movaticaa)


1
@movatica - आप सही कह रहे हैं, इसे जोड़ा
ग्रेज़गोरज़ ओलेदज़की

1
1 बाइट बचाएं हार्डकोडिंग के '#'बजाय x[0]
२१:३

1
आप सूची की समझ को अंदर छोड़ सकते हैं ''.join(...), क्योंकि यह एक जनरेटर अभिव्यक्ति को भी संभालता है। बस को हटा दें []और 2 और बाइट्स
बचाएं

1
धन्यवाद! range(1,6,2)के साथ और भी बेहतर है[1,3,5]
ग्रेज़गोरज़ ओलेदज़की

1
जोनाथन एलन ने mz Pzthon3 संस्करण में गोलाई के लिए एक अलग चाल का प्रस्ताव दिया। यह यहाँ भी लागू होता है: lambda x:'#'+''.join(hex((int(x[i:i+2],16)+8)/17)[2:]for i in[1,3,5])-> ६ ९ बाइट्स
मूविका

1

पर्ल 5 -p , 35 34 बाइट्स

@nwellnhof ने एक बाइट को बचाया

s|\w.|sprintf'%X',.5+(hex$&)/17|ge

इसे ऑनलाइन आज़माएं!

एसटीडीआईएन से पढ़ता है, प्रत्येक जोड़ी को उन वस्तुओं की जगह देता है #जो निकटतम एकल को खोजने के लिए 17 विधि से विभाजन का उपयोग करके उपयुक्त एकल वर्ण के साथ नहीं है , फिर परिणामी रूप से आउटपुट ( -p)।


1

पायथन 3, 67 बाइट्स

f=lambda x:(f(x[:-2])if x[3:]else"#")+f'{(int(x[-2:],16)+8)//17:X}'

स्वागत हे। एक विवरण, स्पष्टीकरण या ऑनलाइन दुभाषिया से लिंक जोड़ने पर विचार करें, जैसे कि TIO जहां हम आपका कोड चला सकते हैं। कोड-केवल उत्तर स्वचालित रूप से निम्न-गुणवत्ता के रूप में चिह्नित किए जाते हैं। उदाहरण के लिए अन्य मौजूदा उत्तर देखें।
mbomb007

0

लाल , 103 बाइट्स

func[c][r: to 1 c to #1 rejoin reverse collect[loop 3[keep to-hex/size r % 256 + 8 / 17 1 r: r / 256]]]

इसे ऑनलाइन आज़माएं!

यह पता चला कि लाल के वर्तमान लिनक्स संस्करण में hex-to-rgbफ़ंक्शन का कार्यान्वयन नहीं है , यही कारण है कि मैं आधार रूपांतरण "मैन्युअल रूप से" करता हूं :)

यह Windows पर लाल GUI कंसोल में ठीक काम करता है :

लाल , 94 बाइट्स

f: func[c][r: hex-to-rgb c to #1 rejoin collect[repeat n 3[keep to-hex/size r/:n + 8 / 17 1]]]


0

चारकोल , 22 बाइट्स

#F⪪⮌…⮌S⁶¦²⍘÷⁺⁸⍘ι¹⁶¦¹⁷φ

इसे ऑनलाइन आज़माएं! लिंक कोड के वर्बोज़ संस्करण के लिए है। स्पष्टीकरण:

#                       Literal `#`
      S                 Input string
     ⮌                  Reversed
    …  ⁶                Truncated to length 6
   ⮌                    Reversed
  ⪪      ²              Split into pairs of characters
 F                      Loop over each pair
               ι        Current pair
              ⍘ ¹⁶      Convert from base 16
            ⁺⁸          Add 8
           ÷       ¹⁷   Integer divide by 17
          ⍘          φ  Convert to large base
                        Implicitly print


0

अजगर , 20 बाइट्स

+\#sm.H/+8id16 17c3t

इसे यहाँ आज़माएँ।

नोट: मामले में उठाता ऊपर के लिंक एक ImportError, जाना यहां के बजाय; वर्तमान में "आधिकारिक" पृष्ठ में एक बग है, और यह माल्टीसेन द्वारा एक अस्थायी समाधान है । आधिकारिक लिंक तय होने के बाद यह लिंक काम करना बंद कर सकता है।


0

फोर्थ (gforth) , 87 बाइट्स

: f d>s 1- hex ." #"3. do 2 + dup 2 s>number d>s 17 /mod swap 8 > - 1 .r loop decimal ;

इसे ऑनलाइन आज़माएं!

व्याख्या

  1. इनपुट के पहले वर्ण को अनदेखा / छोटा करें ( #)
  2. हेक्साडेसिमल मोड के लिए दुभाषिया सेट करें
  3. उत्पादन #
  4. प्रत्येक लूप में 3 बार लूप करें:
    1. स्ट्रिंग प्रारंभ पते में 2 जोड़ें
    2. अगले 2 वर्णों को स्ट्रिंग में हेक्साडेसिमल संख्या में बदलें
    3. 0x11छोटे घटक के लिए निकटतम मूल्य प्राप्त करने के लिए 17 ( ) द्वारा विभाजन और मॉड्यूल का उपयोग करें
    4. पूर्ववर्ती स्थान के साथ आउटपुट
  5. दशमलव मोड पर वापस दुभाषिया सेट करें

कोड स्पष्टीकरण

: f                    \ start a new word definition
  d>s                  \ convert double-length int to single-length (cheaper drop)
  1- hex               \ subtract 1 from string address, set current base to 10
  ." #"                \ output #
  3. do                \ start a loop from 0 to 2 (inclusive)
    2 + dup            \ add 2 to string starting address and duplicate
    2 s>number         \ parse the next 2 characters to a hexadecimal value
    d>s                \ convert result to single-length value
    17 / mod           \ get the quotient and remainder of dividing by 17
    swap               \ move the remainder to the top of the stack
    8 > -              \ if remainder is greater than 8, add 1 to quotient
    1 .r               \ output result (as hexadecimal) with no space
  loop                 \ end the loop
  decimal              \ set interpreter back to base 10 (decimal)
;                      \ end the word definition


0

K4 , 39 बाइट्स

समाधान:

"#",{x@_1%17%8+16/:x?y}[.Q.nA]@/:3 2#1_

स्पष्टीकरण:

इन उत्तरों में से एक के रूप में एक ही रणनीति का उपयोग करता है (यानी 8 जोड़ें, 17 से विभाजित करें):

"#",{x@_1%17%8+16/:x?y}[.Q.nA]@/:3 2#1_ / the solution
                                     1_ / drop first character
                                 3 2#   / reshape as 3x2 (e.g. "FF", "00", "00")
                              @/:       / apply each-right to left lambda
    {                 }[     ]          / lambda with first argument populated
                        .Q.nA           / "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                   x?y                  / get index of hex character, e.g. "AA" => 10 10
               16/:                     / convert from base-16
             8+                         / add 8
          17%                           / 17 divided by...
        1%                              / 1 divided by...
       _                                / floor
     x@                                 / index into .Q.nA to get hex character
"#",                                    / prepend "#"

अतिरिक्त:

  • "#",{x@*16\:a?&/a:abs(17*!16)-16/:x?y}[.Q.nA]@/:3 2#1_- 54 बाइट्स के लिए मेरा मूल विचार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.