ज्वलंत Doorknob कीबोर्ड!


21

खैर, GitHub, Reddit और अन्य साइटों पर Doorknob का उपयोगकर्ता नाम KeyboardFire है । यह मुझे एक विचार देता है ...

काम

आप KeyboardFire Inc. में काम करते हैं, जो एक कंपनी है जो विशेष कीबोर्ड बनाती है। और, "विशेष" से मेरा मतलब है कि, जब भी आप एक कुंजी दबाते हैं, तो आपके घर में आग लग जाती है! नई KeyboardFire Doorknob श्रृंखला के साथ, जिन वस्तुओं में आग लगी है, वे doorknobs हैं।

हालांकि , बेवकूफ सरकारी नियमों के कारण, आपके उपयोगकर्ताओं को यह जानना होगा कि उनके घर में कौन से डॉकनेबॉर्न आग पर प्रकाश डालते हैं।

QWERTY कीबोर्ड के एक हिस्से की इस ASCII कला पर विचार करें:

1|2|3|4|5|6|7|8|9|0
 q|w|e|r|t|y|u|i|o|p
  a|s|d|f|g|h|j|k|l
   z|x|c|v|b|n|m

( |कुंजी के बीच की सीमाओं का प्रतिनिधित्व करते हैं।)

हम इस सटीक ASCII ड्राइंग को "ग्राफ" के रूप में मान सकते हैं, जहां रेंज के प्रत्येक वर्ण में [a-z0-9] x (क्षैतिज) और y (वर्टिकल) इंडेक्स है, जहां (0,0)है 1। उदाहरण के लिए, पत्र dमें निर्देशांक हैं (2,6)(पाइप और रिक्त स्थान समन्वय गणना में शामिल हैं)।

अब प्रत्येक उपयोगकर्ता के घर के बारे में सोचते हैं। प्रत्येक घर को 20x4 ASCII कला के रूप में शीर्ष-डाउन दृश्य दिया जा सकता है (इस दुनिया में जहां विनाशकारी कीबोर्ड बेचने के लिए कानूनी है, हर घर एक ही आकार है)। हम Dघर में प्रत्येक doorknob के पदों को चिह्नित करने के लिए उपयोग कर सकते हैं । यहाँ एक उदाहरण है:

D         D  D     D
    D               

              D  D  

हम इसे "घर का नक्शा" कहेंगे। (हाँ, यह बहुत सारे doorknobs है!)

किसी भी कुंजी को दबाने पर पास के डोरकनॉब को आग लग जाएगी। उदाहरण के लिए, यदि हम अक्षर के पिछले निर्देशांक लेते हैं d, तो निकटतम डॉर्कनोब (मैनहट्टन दूरी द्वारा) निर्देशांक पर है (1,4)। यह डॉकर्नोब है जो अक्षर dके हिट होने पर आग पर प्रकाश डालेगा । यदि हम एक के साथ ज्वलंत doorknob को चिह्नित करने के लिए थे F, तो परिणाम होगा:

D         D  D     D
    F               

              D  D  

ऐनक

आपका कार्यक्रम दो इनपुट लेगा:

  • एक स्ट्रिंग जो पैटर्न से मेल खाती है [a-z0-9]+
  • एक घर का नक्शा। यह एक स्ट्रिंग, स्ट्रिंग की एक सूची या कुछ समतुल्य हो सकता है।

आपको स्ट्रिंग के प्रत्येक अक्षर के माध्यम से जाने और आग पर संबंधित डॉकर्नोब को प्रकाश में लाने (इसके पत्र को ए F) में बदलने की आवश्यकता है । यदि निकटतम डोरकनॉब पहले से ही आग पर है, तो इसे छोड़ दें-जैसा है। यदि इस पद्धति का उपयोग करके 1 से अधिक doorknob को आग पर जलाया जा सकता है, तो आप जिसे चाहें उसे प्रकाश कर सकते हैं।

पूरे स्ट्रिंग को इस तरीके से संसाधित करने के बाद, आपको परिणामस्वरूप घर का नक्शा प्रिंट करने की आवश्यकता है।

कोड-गोल्फ, इसलिए सबसे छोटा कार्यक्रम जीतता है। मानक खामियों को हमेशा की तरह प्रतिबंधित कर दिया।

उदाहरण

स्ट्रिंग:

helloworld123

घर का नक्शा:

D    D       D     D
    D

              D  D  

संभावित परिणाम:

F    F       F     D
    F

              D  F

या:

F    D       F     D
    F

              D  F

या:

F    F       D     D
    F

              F  F

या:

F    D       D     D
    F

              F  F

संपादित करें: उह ... एक कारण है कि मेरे पास एक जवाब है, यहां तक ​​कि एक +50 इनाम के साथ? यदि आप दिशाओं को जटिल / अस्पष्ट पाते हैं, तो मुझे खुशी होगी कि यदि आप टिप्पणी या कुछ और में पोस्ट करते हैं ... या मैं कुछ भी गलत कर रहा हूं ...

संपादित करें 2: बाउंटी एक दिन के भीतर समाप्त हो रहा है! पोस्ट कुछ और! कृप्या! कृप्या!!!! :(


1
कुछ चीजें हैं जो मुझे भ्रामक लगती हैं: 1) d'कॉर्ड्स (2, 6) और नहीं (2, 2) क्यों है? 2) उदाहरण के इतने सारे संभावित उत्तर क्यों हैं? 3) जब आप समझाते हैं कि कैसे आग लग जाएगी, तो आप भी क्यों बात कर रहे हैं d? सिर्फ सीधे क्यों नहीं कहा जाता है कि दबाने aसे किसी घर में आग लग जाएगी? dयह भी करता है?
क्वालालंफ

@Quelklef क्या यह थोड़ा बेहतर है? प्रतिक्रिया के लिए धन्यवाद!
kirbyfan64sos

यदि 'एच' दो डॉर्कबॉब्स के बीच बिल्कुल समाप्त होता है और 'एच' को दो बार कहा जाता है, तो क्या डॉर्कबोन को आग लगना चाहिए? या क्या कार्यक्रम उसी डॉकर्नोब को फायर करने का विकल्प चुन सकता है?
ग्रांट डेविस

@GrantDavis कार्यक्रम उसी डोरकनॉब को फायर करने का विकल्प चुन सकता है।
kirbyfan64sos

जवाबों:


3

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

(s,h)=>[...s].map(c=>(o="1234567890qwertyuiopasdfghjkl_zxcvbnm".search(c),y=o/10|0,x=o%10*2+y,n=a=Math.abs,h.map((k,i)=>k.match(/\s/)||(d=a(x-i%21)+a(y-i/21|0))>n||(n=d,p=i)),h[p]="F"),h=[...h])&&h.join``

ठीक है, मैं इसका जवाब दूंगा। ;)

व्याख्या

(s,h)=>
  [...s].map(c=>(                     // iterate through each character of the input

    // Get X and Y coordinates of the character input
    o="1234567890qwertyuiopasdfghjkl_zxcvbnm".search(c),
    y=o/10|0,
    x=o%10*2+y,

    // Find the nearest doorknob
    n=                                // n = Manhattan distance to nearest doorknob
      a=Math.abs,
    h.map((k,i)=>                     // iterate through each character of the house
      k.match(/\s/)||                 // do not check distance to whitespace characters
        (d=a(x-i%21)+a(y-i/21|0))>n|| // d = distance to the current doorknob
          (n=d,                       // set the nearest doorknob to this one
          p=i)                        // p = position of the doorknob
    ),
    h[p]="F"                          // update the doorknob to "F" in the house string
  ),h=[...h])&&h.join``               // return the house map as a string

परीक्षा

<input type="text" id="input" value="helloworld123" /><br />
<textarea id="house" rows="4" cols="20">D    D       D     D
    D               
                    
              D  D  </textarea><br />
<button onclick='result.innerHTML=(

(s,h)=>[...s].map(c=>(o="1234567890qwertyuiopasdfghjkl_zxcvbnm".search(c),y=o/10|0,x=o%10*2+y,n=a=Math.abs,h.map((k,i)=>k.match(/\s/)||(d=a(x-i%21)+a(y-i/21|0))>n||(n=d,p=i)),h[p]="F"),h=[...h])&&h.join``

)(input.value,house.value)'>Go</button>
<pre id="result"></pre>


2
मुझे आखिरकार एक और जवाब मिला !!! : D
kirbyfan64sos

12

रूबी, 229 बाइट्स

->s,m{c=m.flat_map.with_index{|x,i|x.size.times.select{|j|x[j]==?D}.map{|y|[i,y]}}
s.chars{|h|x='1234567890qwertyuiop*asdfghjkl*zxcvbnm'.index h
x,y=(x%10)*2,x/10
a,b=c.min_by{|a,b|(y-a).abs+((y%2>0?x+1:x)-b).abs}
m[a][b]='F'}
m}

बहुत अच्छा नहीं है, लेकिन मैं सिर्फ था के पहले उत्तर प्राप्त करने के लिए।

थोड़ा ungolfed / टिप्पणी संस्करण:

#!/usr/bin/ruby

f = -> s, m {
    # get knob coords
    c = m.flat_map.with_index {|x, i| x.size.times.select{|j| x[j] == ?D }.map{|y| [i, y] } }
    # for each char in the string
    s.chars {|h|
        # note the asterisks to correct for offsets
        x = '1234567890qwertyuiop*asdfghjkl*zxcvbnm'.index h
        # get un-"staggered" x and y coords
        x, y = (x % 10) * 2, x / 10
        # add one to x for every other row to fit keyboard
        x += 1 if y % 2 > 0
        # find closest knob by Manhattan distance
        a, b = c.min_by{|a, b| (y - a).abs + (x - b).abs }
        # LIGHT IT ON FIRE!
        m[a][b] = 'F'
    }
    # return new map
    m
}

puts f['helloworld123', ['D    D       D     D', '    D', '', '              D  D']]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.