불타는 손잡이 손잡이 키보드!


21

음, 알고 보니 손잡이의 GitHub의, 레딧, 그리고 다른 사이트에 사용자 이름입니다 KeyboardFire는 . 그게 나에게 아이디어를 제공합니다 ...

작업

특수 키보드를 만드는 회사 인 KeyboardFire Inc.에서 근무합니다. 그리고 "특별한"이라는 말은, 당신이 열쇠를 누를 때마다, 집안의 어떤 것이 불을 붙인다는 것을 의미합니다! 새로운 KeyboardFire Doorknob 시리즈에서는 불이 켜진 물체가 손잡이입니다.

그러나 어리석은 정부 규정으로 인해 사용자는 집안의 어떤 손잡이가 불에 타야하는지 알아야합니다.

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). 가장 가까운 손잡이가 이미 불에 태우면 그대로 둡니다. 이 방법을 사용하여 불에 불을 붙일 수있는 문 손잡이가 두 개 이상인 경우 원하는 것을 불이 켜질 수 있습니다.

이 방법으로 전체 문자열을 처리 한 후 결과 집지도를 인쇄해야합니다.

코드 골프, 가장 짧은 프로그램이 승리합니다. 표준 허점은 평소처럼 금지되었습니다.

끈:

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

답변:


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
나는 마침내 또 다른 대답을 얻었다! !! : D
kirbyfan64sos 1

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']]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.