火焰状的门把手键盘!


21

好吧,事实证明,Doorknob 在GitHub,Reddit和其他站点上用户名是 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  

规格

您的程序将接受两个输入:

  • 与模式匹配的字符串[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)?2)为什么这个例子有这么多可能的答案?3)当您解释事物将如何着火时,您为什么还要谈论d?为什么不直接说紧迫a会点燃一些房屋着火呢?是否d做到这一点,太?
Quelklef

@Quelklef好一点了吗?感谢您的反馈!
kirbyfan64sos

如果“ h”恰好位于两个门把手之间,并且两次调用了“ h”,那么两个门把手都应该着火吗?还是该程序可以选择发射相同的门把手?
格兰特·戴维斯

@GrantDavis该程序可以选择触发相同的门把手。
kirbyfan64sos

Answers:


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

Ruby,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']]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.