燃えるようなドアノブキーボード!


21

さて、 GitHub、Reddit、およびその他のサイトでのDoorknobのユーザー名は KeyboardFireです。それは私にアイデアを与えます...

タスク

あなたは、特別なキーボードを製造しているKeyboardFire Inc.で働いています。そして、「特別」とは、キーを押すたびに、家の中にあるものが燃えることを意味します!新しい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 ASCIIアートとしてトップダウンビューで描画できます(破壊的なキーボードを販売することが合法であるこの世界では、すべての家は同じサイズです)。を使用Dして、家の各ドアノブの位置をマークできます。以下に例を示します。

D         D  D     D
    D               

              D  D  

これを「ハウスマップ」と呼びます。(はい、それはたくさんのドアノブです!)

いずれかのキーを押すと、最寄りのドアノブが点灯します。たとえば、文字の前の座標を取得した場合d、最も近いドアノブ(マンハッタン距離による)は座標にあり(1,4)ます。これは、手紙dに当たったときに火がついたドアノブです。炎のドアノブをでマークするFと、結果は次のようになります。

D         D  D     D
    F               

              D  D  

スペック

プログラムには2つの入力があります。

  • パターンに一致する文字列[a-z0-9]+
  • 家の地図。これは、文字列、文字列のリスト、または同等のものです。

文字列の各文字を調べて、それぞれのドアノブに火をつける必要があります(文字をに変更しますF)。最寄りのドアノブがすでに燃えている場合は、そのままにしておきます。この方法を使用して火で照らすことができるドアノブが複数ある場合は、好きな方を照らすことができます。

文字列全体がこの方法で処理された後、結果のハウスマップを印刷する必要があります。

コードゴルフ、最短プログラムが勝ちます。通常のように禁止されている標準的な抜け穴。

文字列:

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

編集:ええと...私は1つの答えを持っている理由があります、+ 50の賞金があっても?道順が複雑/あいまいであると思うなら、コメントや何かで投稿してくれたらうれしいです...または私が何か間違ったことをしているのなら...

編集2:賞金は1日以内に期限切れになります!何か他のものを投稿してください!お願いします!お願いします!!!!:(


1
紛らわしいものがいくつかあります:1)dの座標は(2、6)であり、(2、2)ではないのはなぜですか?2)なぜ例には非常に多くの可能な答えがあるのですか?3)物事がどのように燃えるかを説明するとき、なぜあなたは話しているのdですか?押すだけでa家に火がつくと言うのはなぜですか?dあまりにも、それを行いますか?
-Quelklef

@Quelklefこれは少し良いですか?フィードバックをお寄せいただきありがとうございます!
kirbyfan64sos

「h」が2つのドアノブの間に正確に配置され、「h」が2回呼び出された場合、両方のドアノブを起動する必要がありますか?またはプログラムは同じドアノブを発射することを選択できますか?
グラントデイビス

@GrantDavisプログラムは、同じドアノブを起動することを選択できます。
kirbyfan64sos

回答:


3

JavaScript(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
私はついに別の答えを得ました!!! :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}

非常に良いが、私はちょうどない持っていたの最初の答えを得るために。

わずかに未使用/コメント版:

#!/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.