ตำแหน่งที่ไม่ชัดเจนบนกริด


11

คุณมีหุ่นยนต์ตัวน้อยที่มีเซ็นเซอร์วัดระยะทางสี่ตัว มันรู้เลย์เอาต์ของห้อง แต่มันไม่มีความรู้สึกในการวางแนวอื่นนอกจากจะสามารถล็อคการวางแนวของกริด คุณต้องการที่จะหาว่าหุ่นยนต์อยู่บนพื้นฐานของการอ่าน แต่มันอาจจะคลุมเครือเพราะเซ็นเซอร์ จำกัด

คำอธิบายการท้าทาย

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

วัตถุประสงค์ของคุณคือรายการสถานที่ทั้งหมดภายในห้องที่หุ่นยนต์อาจอยู่ในที่ที่จะให้การอ่านที่กำหนด โปรดทราบว่าหุ่นยนต์ไม่มีความรู้สึกในการวางแนว (นอกเหนือจากการถูกล็อคไปที่มุม 90 องศาบนกริด - นั่นคือหุ่นยนต์จะไม่ถูกวางแนวทแยงมุมหรือมุมเอียงอื่น ๆ ) ดังนั้นการอ่าน [1, 2, 3, ตัวอย่างเช่น 4] เหมือนกับการอ่าน [3, 4, 1, 2]

ตัวอย่าง

สำหรับตัวอย่างเหล่านี้พิกัดของเซลล์จะได้รับเป็นคู่ 0 ดัชนี (x, y) จากเซลล์ซ้ายบน การอ่านจะได้รับตามลำดับตามเข็มนาฬิกาในรายการวงเล็บเหลี่ยม เลย์เอาต์จะใช้เครื่องหมายปอนด์สำหรับกำแพงและตัวละครอื่น ๆ (โดยทั่วไปคือจุด) เพื่อแสดงเซลล์ว่าง

กรณีที่ 1

. . . .
. . . .
. . # .
. . . .
  • [1, 0, 2, 3] ==> (1, 0), (3, 1)
  • [0, 0, 3, 3] ==> (0, 0), (3, 0), (0, 3), (3, 3)
  • [2, 1, 1, 0] ==> (0, 2), (2, 1)
  • [1, 1, 2, 2] ==> (1, 1)

กรณีที่ 2

# a . # a .
a # . . # a
. . # . . #
# . . # . .
a # . . # a
. a # . a #
  • [0, 0, 1, 1] ==> ทุกตำแหน่งในกริดที่เป็นจุด
  • [1, 0, 0, 0] ==> a ทั้งหมดของกริด

กรณีที่ 3

.
  • [0, 0, 0, 0] ==> (0, 0)

กรณีที่ 4

. # #
. . .
  • [1, 2, 0, 0] ==> (0, 1)
  • [0, 1, 2, 0] ==> (0, 1)
  • [0, 0, 1, 0] ==> (0, 0)
  • [1, 0, 1, 0] ==> (1, 1)
  • [0, 1, 0, 1] ==> (1, 1)

กรณีที่ 5

. # . .
. . . .
. . # .
. . . .
  • [2, 1, 1, 0] ==> (0, 2), (2, 1)
  • [0, 2, 2, 1] ==> (1, 1)
  • [1, 0, 2, 2] ==> (1, 1)
  • [0, 3, 0, 0] ==> (0, 0)
  • [1, 0, 1, 1] ==> (1, 2)

กฎอื่น ๆ

  • อินพุตอาจอยู่ในรูปแบบที่สะดวก อินพุตเป็นตารางของกำแพงและช่องว่างและรายการของสี่ระยะทางตามลำดับตามเข็มนาฬิกา
  • ผลลัพธ์อาจเป็นรายการของเซลล์ทั้งหมดที่ตอบสนองการอ่านหรือรุ่นที่แก้ไขของตารางแสดงเซลล์ที่ตอบสนองการอ่าน รูปแบบที่แน่นอนของผลลัพธ์ไม่สำคัญตราบใดที่มันสมเหตุสมผลและสอดคล้องกัน รูปแบบเอาต์พุตที่ถูกต้องรวมถึง แต่ไม่ จำกัด เฉพาะ :
    • การพิมพ์บรรทัดสำหรับแต่ละเซลล์พิกัดเป็นคู่สั่ง
    • การพิมพ์กริดด้วย., #และ, !สำหรับพื้นที่, กำแพง, และตำแหน่งที่เป็นไปได้ตามลำดับ
    • ส่งคืนรายการคู่ที่สั่งซื้อ
    • ส่งคืนรายการดัชนี
    • ส่งคืนรายการที่ใช้ค่าต่างกันสำหรับช่องว่างกำแพงและตำแหน่งที่เป็นไปได้
    • ส่งคืน / พิมพ์เมทริกซ์ที่ 0 และ 1 โดยใช้ 1s เพื่อแทนเซลล์ที่การอ่านจะเกิดขึ้น (ไม่จำเป็นต้องรวมผนัง)
    • อีกครั้งรายการนี้ไม่ละเอียดดังนั้นการแสดงอื่น ๆ ที่ถูกต้องตราบเท่าที่พวกเขามีความสอดคล้องและแสดงตำแหน่งที่ถูกต้องทุกที่เป็นไปได้ในตารางหรือรายการ หากคุณไม่แน่ใจออกความคิดเห็นและฉันยินดีที่จะชี้แจง
  • คุณอาจสมมติว่าการอ่านสอดคล้องกับตำแหน่งอย่างน้อยหนึ่งตำแหน่งบนกริด
  • คุณอาจสมมติว่ากริดอินพุตมีขนาดอย่างน้อย 1x1 และมีพื้นที่ว่างอย่างน้อยหนึ่งแห่ง
  • คุณอาจสมมติว่ากริดอินพุตไม่ใหญ่กว่า 256 เซลล์ในแต่ละมิติ
  • คุณอาจจะสมมติว่ากริดอินพุตนั้นเป็นรูปสี่เหลี่ยมผืนผ้าที่สมบูรณ์แบบเสมอและไม่ขรุขระ
  • ไม่มีการลงโทษหรือโบนัสหากโปรแกรมของคุณให้สัญญาณที่มีสติสำหรับอินพุตที่ไม่ถูกต้อง
  • นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดจึงชนะ

การทดสอบสำหรับCase 5ดูเหมือนจะไม่ถูกต้องนัก ฉันได้รับ(0,2),(2,1), (1,3), และ(1,3) nothing
TFeld

@ ขอบคุณมาก แก้ไขแล้ว.
Beefster

1
@Arnauld ดูเหมือนว่าสมเหตุสมผลกับฉัน ฉันจะเพิ่มเข้าไปในรายการที่ไม่ครบถ้วนสมบูรณ์แล้ว
Beefster

คำตอบ:


3

JavaScript (ES6),  130 128 126  125 ไบต์

(ม.)(ล.)ม.01ล.

1

m=>l=>m.map((r,y)=>r.map((v,x)=>v&!!([...'3210321'].map(d=>(g=X=>(m[Y+=~-d%2]||0)[X+=(d-2)%2]?1+g(X):0)(x,Y=y))+g).match(l)))

ลองออนไลน์! (พร้อมเอาต์พุตหลังการประมวลผลเพื่อให้สามารถอ่านได้)

แสดงความคิดเห็น

m => l =>                         // m[] = layout matrix; l[] = list of distances
  m.map((r, y) =>                 // for each row r[] at position y in m[]:
    r.map((v, x) =>               //   for each cell v at position x in r[];
      v &&                        //     yield 0 if v = 0
      !!(                         //     otherwise, test whether we can find l[] within a
        [...'3210321']            //     list containing twice the results of the sensors
        .map(d =>                 //       for each direction d:
          (g = X => (             //         g = recursive function taking X
              m[Y += ~-d % 2]     //         add dy[d] to Y
              || 0                //         use a dummy object if we're out of the board
            )[X += (d - 2) % 2] ? //         add dx[d] to X; if (m[Y] || 0)[X] is equal to 1:
              1 +                 //           add 1 to the final result
              g(X)                //           and do a recursive call
            :                     //         else:
              0                   //           yield 0 and stop recursion
          )(x, Y = y)             //         initial call to g with X = x and Y = y
        )                         //       end of map() over directions
        + g                       //       coerce the result to a comma-separated string,
                                  //       followed by harmless garbage
      ).match(l)                  //     test whether l[] can be found in this string
                                  //     (l[] is implicitly coerced to a string as well)
    )                             //   end of map() over r[]
  )                               // end of map() over m[]


1

ถ่าน 42 ไบต์

PθFθ¿⁼¶ι⸿¿№E⁴E⁴⊖⌕⁺⪫KD⊕⌈η✳§⟦→↓←↑⟧⁺κμω#¦#η!ι

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด ถ่านดูเหมือนจะเพิ่มช่องว่างภายในเอาท์พุทด้วยเหตุผลบางอย่าง; ฉันคิดว่ามันเป็นข้อผิดพลาดใน Charcoal คำอธิบาย:

Pθ

พิมพ์แผนที่โดยไม่เลื่อนเคอร์เซอร์

Fθ

วนซ้ำอักขระแต่ละตัวในแผนที่

¿⁼¶ι⸿

หากเป็นบรรทัดใหม่ให้เลื่อนเคอร์เซอร์ไปที่จุดเริ่มต้นของบรรทัดถัดไป

⊖⌕⁺⪫KD⊕⌈η✳§⟦→↓←↑⟧⁺κμω#¦#

k+mค้นหาระยะทางที่ผนังในทิศทางที่

¿№E⁴E⁴...η!ι

วนรอบทิศทางเริ่มต้นทั้งสี่kมองในทิศทางตามเข็มนาฬิกาทั้งสี่ทิศทางmและหากผลลัพธ์ประกอบด้วยอินพุตที่สองให้!พิมพ์ตัวอักษรมิฉะนั้นพิมพ์อักขระปัจจุบัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.