คีย์บอร์ด Doorknob Flaming!


21

ดีผลัดกันออกDoorknob ของ ชื่อผู้ใช้บน GitHub, Reddit และเว็บไซต์อื่น ๆ ที่เป็น KeyboardFire นั่นทำให้ฉันมีความคิด ...

งาน

คุณทำงานที่ KeyboardFire Inc. บริษัท ที่ผลิตแป้นพิมพ์พิเศษ และโดย "พิเศษ" ฉันหมายความว่าเมื่อใดก็ตามที่คุณกดปุ่มบางสิ่งในบ้านของคุณก็จะติดไฟ! ด้วย KeyboardFire Doorknob ซีรี่ส์ใหม่วัตถุที่แสงไฟเป็นลูกบิดประตู

อย่างไรก็ตามเนื่องจากข้อบังคับของรัฐบาลที่โง่ผู้ใช้ของคุณจำเป็นต้องรู้ว่าลูกบิดประตูใดในบ้านของพวกเขาจะมีแสงไฟ

พิจารณาศิลปะ ASCII นี้ของคีย์บอร์ด 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

(สิ่ง|นี้แสดงถึงขอบเขตระหว่างกุญแจ)

เราสามารถใช้การวาดภาพ ASCII ที่แน่นอนนี้เป็น "กราฟ" ของการเรียงลำดับโดยที่อักขระแต่ละตัวในช่วง[a-z0-9] มีดัชนี x (แนวนอน) และ y (แนวตั้ง) ซึ่ง(0,0)อยู่ที่1ใด ตัวอย่างเช่นตัวอักษรdมีพิกัด(2,6)(ท่อและช่องว่างรวมอยู่ในการคำนวณพิกัด)

ตอนนี้ลองคิดถึงบ้านของผู้ใช้แต่ละคน บ้านทุกหลังสามารถวาดมุมมองจากบนลงล่างในฐานะศิลปะ ASCII ขนาด 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) หากลูกบิดประตูที่ใกล้ที่สุดอยู่ในไฟให้ปล่อยทิ้งไว้ตามที่เป็น หากมีลูกบิดมากกว่าหนึ่งอันที่สามารถจุดไฟโดยใช้วิธีนี้คุณสามารถส่องแสงได้ตามต้องการ

หลังจากประมวลผลสตริงทั้งหมดในลักษณะนี้คุณต้องพิมพ์แผนผังบ้านที่ได้

รหัสกอล์ฟโปรแกรมที่สั้นที่สุดชนะ ช่องโหว่มาตรฐานถูกแบนเหมือนปกติ

ตัวอย่าง

สตริง:

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) ทำไมdcoords (2, 6) และไม่ใช่ (2, 2) 2) เหตุใดตัวอย่างจึงมีคำตอบที่เป็นไปได้มากมาย 3) เมื่อคุณอธิบายว่าสิ่งที่จะสว่างไฟทำไมคุณยังพูดคุยเกี่ยวกับd? ทำไมไม่พูดตรงๆว่าการกดaจะทำให้บางบ้านติดไฟ ไม่dทำมันเกินไป?
Quelklef

@Quelklef นี้ดีกว่าไหม? ขอบคุณสำหรับความคิดเห็น!
kirbyfan64sos

หาก 'h' ลงเอยอย่างแน่นอนระหว่างสองลูกบิดประตูและเรียกว่า 'h' สองครั้งทั้งสองลูกบิดประตูควรจะติดไฟหรือไม่ หรือโปรแกรมสามารถเลือกที่จะเปิดลูกบิดประตูเดียวกันได้หรือไม่
Grant Davis

@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.