Bàn phím rực lửa Doorknob!


21

Chà, hóa ra tên người dùng của Doorknob trên GitHub, Reddit và các trang web khác là KeyboardFire . Điều đó mang lại cho tôi một ý tưởng...

Nhiệm vụ

Bạn làm việc tại KeyboardFire Inc., một công ty sản xuất bàn phím đặc biệt. Và, "đặc biệt", ý tôi là, bất cứ khi nào bạn nhấn một phím, một cái gì đó trong nhà bạn sẽ sáng lên! Với sê-ri Bàn phím Doirenob mới, các vật thể phát sáng là tay nắm cửa.

Tuy nhiên , vì các quy định ngu ngốc của chính phủ, người dùng của bạn cần biết tay nắm cửa nào trong nhà sẽ sáng lửa.

Hãy xem xét nghệ thuật ASCII này của một phần của bàn phím QWERTY:

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

(Các |'đại diện cho ranh giới giữa các khóa.)

Chúng ta có thể đối xử với bản vẽ ASCII chính xác này như là một "biểu đồ" của các loại, trong đó mỗi nhân vật trong phạm vi [a-z0-9] có x (ngang) và y (dọc) chỉ số, nơi (0,0)1. Ví dụ, chữ cái dcó tọa độ (2,6)(đường ống và khoảng trắng được bao gồm trong phép tính tọa độ).

Bây giờ hãy nghĩ về mỗi ngôi nhà của người dùng. Mọi ngôi nhà đều có thể được vẽ từ trên xuống dưới như một nghệ thuật ASCII 20x4 (trong thế giới này nơi bán bàn phím phá hoại hợp pháp, mọi ngôi nhà đều có cùng kích thước). Chúng ta có thể sử dụng Dđể đánh dấu vị trí của mỗi tay nắm cửa trong nhà. Đây là một ví dụ:

D         D  D     D
    D               

              D  D  

Chúng tôi sẽ gọi đây là "bản đồ nhà". (Vâng, đó là rất nhiều tay nắm cửa!)

Nhấn bất kỳ phím nào sẽ làm sáng tay nắm cửa gần nhất trên lửa. Chẳng hạn, nếu chúng ta lấy tọa độ trước của chữ cái d, thì tay nắm cửa gần nhất (theo khoảng cách Manhattan) nằm ở tọa độ (1,4). Đây là tay nắm cửa sẽ sáng lên khi thư dđược nhấn. Nếu chúng ta đánh dấu tay nắm cửa rực lửa bằng một F, kết quả sẽ là:

D         D  D     D
    F               

              D  D  

Thông số kỹ thuật

Chương trình của bạn sẽ có hai đầu vào:

  • Một chuỗi phù hợp với mô hình [a-z0-9]+.
  • Một bản đồ nhà. Đây có thể là một chuỗi, một danh sách các chuỗi hoặc một cái gì đó tương đương.

Bạn cần phải đi qua từng chữ cái của chuỗi và thắp sáng tay nắm cửa tương ứng trên lửa (thay đổi chữ cái của nó thành một F). Nếu tay nắm cửa gần nhất đã cháy, hãy để nguyên như vậy. Nếu có nhiều hơn 1 tay nắm cửa có thể được thắp sáng bằng phương pháp này, bạn có thể thắp sáng bất cứ thứ gì bạn muốn.

Sau khi toàn bộ chuỗi được xử lý theo cách này, bạn cần in bản đồ nhà kết quả.

Code-golf, vì vậy chương trình ngắn nhất sẽ thắng. Sơ hở tiêu chuẩn bị cấm như bình thường.

Thí dụ

Chuỗi:

helloworld123

Bản đồ nhà:

D    D       D     D
    D

              D  D  

Kết quả có thể:

F    F       F     D
    F

              D  F

Hoặc là:

F    D       F     D
    F

              D  F

Hoặc là:

F    F       D     D
    F

              F  F

Hoặc là:

F    D       D     D
    F

              F  F

EDIT: Uh ... có một lý do tôi có một câu trả lời, ngay cả với tiền thưởng +50? Nếu bạn thấy các hướng phức tạp / mơ hồ, tôi sẽ rất vui nếu bạn đăng trong các bình luận hoặc một cái gì đó ... hoặc tôi đang làm gì sai ...

EDIT 2: Bounty hết hạn dưới một ngày! Đăng một cái gì đó khác! Xin vui lòng! XIN VUI LÒNG!!!! :


1
Có một vài điều tôi thấy khó hiểu: 1) Tại sao lại là dcoords (2, 6) mà không phải (2, 2)? 2) Tại sao ví dụ có rất nhiều câu trả lời có thể? 3) Khi bạn giải thích mọi thứ sẽ sáng như thế nào, tại sao bạn lại nói về nó d? Tại sao không chỉ cần nói thẳng rằng nhấn asẽ đốt một số nhà trên lửa? Có dlàm điều đó không?
Quelklef

@Quelklef Điều này có tốt hơn một chút không? Cảm ơn vì bạn đã phản hồi!
kirbyfan64sos

Nếu 'h' kết thúc chính xác giữa hai tay nắm cửa và 'h' được gọi hai lần, cả hai tay nắm cửa có bị cháy không? hoặc chương trình có thể chọn bắn cùng một tay nắm cửa?
Cấp Davis

@GrantDavis Chương trình có thể chọn bắn cùng một tay nắm cửa.
kirbyfan64sos

Câu trả lời:


3

JavaScript (ES6), 204 byte

(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``

Tốt thôi, tôi sẽ trả lời nó. ;)

Giải trình

(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

Kiểm tra

<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
Cuối cùng tôi đã có câu trả lời khác !!! : D
kirbyfan64sos

12

Ruby, 229 byte

->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}

Không tốt lắm, nhưng tôi chỉ cần câu trả lời đầu tiên.

Phiên bản hơi vô căn cứ / nhận xét:

#!/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']]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.