জ্বলজ্বল ডুরকনব কীবোর্ডগুলি!


21

ওয়েল, দেখা যাচ্ছে Doorknob এর GitHub, reddit ও অন্য সাইটে ব্যবহারকারী নাম হল KeyboardFire । এটি আমাকে ধারণা দেয় ...

কাজটি

আপনি বিশেষ কীবোর্ড তৈরি করে এমন একটি সংস্থা কীবোর্ডফায়ার ইনক। এ কাজ করেন। এবং "বিশেষ" দ্বারা, আমার অর্থ এই যে, যখনই আপনি কোনও কী টিপেন, আপনার বাড়ির কোনও কিছু জ্বলিয়ে দেয়! নতুন কীবোর্ডফায়ার ডোরকনব সিরিজটির সাহায্যে আগুনে জ্বলতে থাকা অবজেক্টগুলি হ'ল ডোরকনবস।

তবে , নির্বোধ সরকারী বিধিমালার কারণে আপনার ব্যবহারকারীদের তাদের বাড়ির কোন ডোরকনবগুলি আগুন জ্বলবে তা জানতে হবে।

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 এএসসিআইআই আর্ট হিসাবে টপ-ডাউন ভিউ আঁকতে পারে (এই বিশ্বে যেখানে ধ্বংসাত্মক কীবোর্ডগুলি বিক্রয় করা আইনী, প্রতিটি বাড়ি একই আকারের হয়)। আমরা Dবাড়ির প্রতিটি ডোরকনব অবস্থানগুলি চিহ্নিত করতে ব্যবহার করতে পারি । এখানে একটি উদাহরণ:

D         D  D     D
    D               

              D  D  

আমরা এটিকে "ঘরের মানচিত্র" বলব। (হ্যাঁ, এটি অনেকগুলি ডোরকনবস!)

যে কোনও কী টিপলে আগুনে নিকটতম ডোরকনব জ্বলবে। উদাহরণস্বরূপ, আমরা যদি চিঠির পূর্ববর্তী স্থানাঙ্কগুলি গ্রহণ করি dতবে নিকটতম ডোরকনব (ম্যানহাটান দূরত্বের দ্বারা) স্থানাঙ্কে রয়েছে (1,4)। এই ডোরকনব dহ'ল চিঠিটি আঘাত করা হলে আগুন জ্বলবে । আমরা যদি জ্বলন্ত ডুরকনবকে একটি দিয়ে চিহ্নিত করি Fতবে ফলাফলটি হবে:

D         D  D     D
    F               

              D  D  

চশমা

আপনার প্রোগ্রামে দুটি ইনপুট লাগবে:

  • প্যাটার্নের সাথে মেলে এমন একটি স্ট্রিং [a-z0-9]+
  • একটি বাড়ির মানচিত্র। এটি স্ট্রিং, স্ট্রিংগুলির তালিকা বা সমতুল্য কিছু হতে পারে।

আপনাকে স্ট্রিংয়ের প্রতিটি অক্ষর দিয়ে যেতে হবে এবং আগুনে সম্পর্কিত ডোরকনবকে আলোকিত করতে হবে (এর চিঠিটি একটিতে পরিবর্তন করুন F)। যদি নিকটস্থ ডোরকনব ইতিমধ্যে আগুন লেগে থাকে তবে এটি যেমন রয়েছে তেমন ছেড়ে দিন। এই পদ্ধতিটি ব্যবহার করে যদি 1 টিরও বেশি ডোরকনব আগুনে জ্বলতে পারে তবে আপনি যেটি চান তা আলোকিত করতে পারেন।

পুরো স্ট্রিংটি এই পদ্ধতিতে প্রক্রিয়া করার পরে, আপনাকে ফলস্বরূপ বাড়ির মানচিত্রটি মুদ্রণ করতে হবে।

কোড-গল্ফ, তাই সংক্ষিপ্ততম প্রোগ্রামের জয়। যথারীতি স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ করা হয়েছে।

উদাহরণ

স্ট্রিং:

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) নয়? ২) উদাহরণটিতে এতগুলি সম্ভাব্য উত্তর রয়েছে কেন? 3) আপনি কীভাবে জিনিসগুলিতে আগুন জ্বলবে তা ব্যাখ্যা করার সময়, আপনি এমনকি কেন কথা বলছেন d? কেন কেবল সোজা হয়ে বলা হয়নি যে টিপলে aকিছু বাড়িতে আগুন জ্বলবে? না dএটা খুব না?
কোয়েলক্লেফ

@ কিউলক্লেফ এটি কি কিছুটা ভাল? সাহায্য করার জন্য ধন্যবাদ!
kirbyfan64sos

যদি 'এইচ' দুটি ডোরকনবসের মধ্যে ঠিক শেষ হয় এবং 'এইচ' দু'বার বলা হয়, তবে উভয় ডোরকনবগুলিকেই আগুন দেওয়া উচিত? বা প্রোগ্রামটি কি একই ডোরকনবকে গুলি চালানোর জন্য বেছে নিতে পারে?
গ্রান্ট ডেভিস

@ গ্রান্টডাভিস প্রোগ্রামটি একই ডোরকনবকে চালিত করতে পছন্দ করতে পারে।
kirbyfan64sos

উত্তর:


3

জাভাস্ক্রিপ্ট (ES6), 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
অবশেষে আমি অন্য উত্তর পেয়েছি !!! : ডি
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}

খুব ভাল না, কিন্তু আমি শুধু ছিল প্রথম উত্তরের জন্য।

কিছুটা অবহেলিত / মন্তব্য করা সংস্করণ:

#!/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']]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.