หยุดเดินบนกำแพง!


16

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

ความท้าทาย

เขียนโปรแกรมของฟังก์ชั่นที่กำหนดทิศทางและตารางขนาดตัวอักษร 3 ถึง 3 ตัวออกตารางเดียวกันหลังจากผู้เล่นทำตามขั้นตอน

ตัวอย่างเช่น,

9
#..
.@#
#.#

กลายเป็น

#.@
..#
#.#

อินพุต

  • ทิศทางจะถูกกำหนดโดยตัวเลขหลักเดียวจาก 1 ถึง 9 โดยแต่ละทิศทางสอดคล้องกับ 8 ทิศทางสำคัญและหยุดนิ่ง สิ่งนี้ได้มาจากตำแหน่งสัมพัทธ์ของตัวเลขบนแผงปุ่มกด:

    ไม่มีทางตะวันตกเฉียงเหนือ
    .. \ | /
    ... 7 8 9
    W- 4 5 6 -E
    ... 1 2 3
    ../ | \
    SW S SE
    
    อย่างไรก็ตามคุณอาจใช้ตัวเลข 123, 456, 789 แทน 789, 456, 123 ได้อีกนัยหนึ่งคุณสามารถสลับแถวหรือหมายเลข 2 ด้านบนและล่างหากคุณเลือก เหล่านี้เป็นชุดค่าดัชนีที่ยอมรับได้เพียง 2 รายการเท่านั้น

  • ตาราง 3 โดย 3 จะประกอบด้วยอักขระ ASCII 3 ตัวที่สามารถพิมพ์ได้ซึ่งเป็นตัวแทนของพื้นผนังและเครื่องเล่น (ในกรณีทดสอบ.ใช้สำหรับพื้น#s คือกำแพงและ@เป็นเครื่องเล่น)

  • คุณอาจเลือกตัวละครที่โปรแกรมของคุณใช้ แต่คุณต้องระบุตัวอักษรเหล่านั้นในคำตอบและต้องสอดคล้องกับการทดลองหลายครั้ง
  • ตัวละครที่เป็นตัวแทนของตัวละครมักจะอยู่ในช่วงกลางของ 3 โดย 3 ตารางและทิศทางจะอยู่ระหว่าง 1 และ 9 (รวม)
  • คุณสามารถป้อนข้อมูลในลำดับใดก็ได้
  • กริด 3 โดย 3 สามารถใส่เป็นถ่านแบบอาเรย์สตริงแบบสตริงความยาว 9 หรือแบบอื่นที่เหมาะสม

เอาท์พุต

  • ส่งคืนจากฟังก์ชันหรือเอาต์พุตไปยัง StdOut หรือทางเลือกที่ใกล้เคียงที่สุด
  • อนุญาตให้เว้นวรรคต่อท้ายและขึ้นบรรทัดใหม่
  • คุณต้องใช้การแทนตัวอักษรเหมือนกับอินพุต
  • รูปแบบเดียวกันที่อนุญาตสำหรับอินพุตได้รับอนุญาตสำหรับเอาต์พุต

ผู้เล่นเคลื่อนไหวอย่างไร

หากทิศทางที่ระบุถูกบล็อกโดยกำแพง (เช่นถ้าตัวอย่างด้านบนมีทิศทาง 6) ให้ดูที่ 2 ทิศทางที่ใกล้ที่สุด:

  • หากทิศทางเดียว (และเพียงหนึ่งทิศทาง) ว่างให้ย้ายผู้เล่นไปในทิศทางนั้น
  • หากไม่มีเส้นทางให้ดูที่ 2 ทิศทางถัดไปที่ใกล้เคียงที่สุด (ยกเว้นเส้นทาง 5) หากคุณพันรอบและไม่พบทิศทางที่เปิด (ผู้เล่นล้อมรอบด้วยกำแพง) อย่าขยับผู้เล่น
  • หากทั้งสองทิศทางเปิดอยู่ให้เลือกหนึ่งทิศทางที่จะสุ่มเลือก

หากทิศทางที่กำหนดคือ 5 ห้ามเคลื่อนย้ายเครื่องเล่น

กรณีทดสอบ

( #= ผนัง, .= พื้น, @= ผู้เล่น)

การป้อนข้อมูล:

9
# ..
. @ #
#. #

เอาท์พุท:

#. @
.. #
#. #


การป้อนข้อมูล:

3
# ..
. @ #
#. #

เอาท์พุท:

# ..
.. #
# @ #


การป้อนข้อมูล:

7
##
# @ #
.. #

เอาท์พุท:

## @ ##
#.# หรือ #.#
.. # @. #


การป้อนข้อมูล:

5
...
. @
...

เอาท์พุท:

...
. @
...


การป้อนข้อมูล:

2
###
# @ #
###

เอาท์พุท:

###
# @ #
###

เกณฑ์การให้คะแนน

นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ


ไม่ได้ใช้yuhjklbn? ฉีก.
Rɪᴋᴇʀ

นอกจากนี้ฉันไม่ชอบส่วน "เลือกทิศทางอื่น" มากนัก มันแตกต่างจากส่วนอื่น ๆ ของความท้าทายซึ่งก็คือ "ย้ายผู้เล่นไปในทิศทางที่กำหนดและเอาท์พุท" นั่นเป็นเพียงการตั้งค่าส่วนตัวแม้ว่า
Rɪᴋᴇʀ

1
ส่วนนี้ทำให้เกิดความสับสน: "หากไม่มีเส้นทางฟรีให้ดู 2 ทิศทางถัดไปที่ใกล้เคียงที่สุด"
Leun Nun

1
เราสามารถกำหนดตัวเลขแทนอักขระ ASCII สำหรับแต่ละองค์ประกอบแล้วนำเข้าเป็นรายการแบบสองมิติได้หรือไม่? หรือพวกเขาจะต้องเป็นสตริง?
Scott Milner

2
ฉันสามารถใช้เส้นทาง123;456;789แทนได้789;456;123หรือไม่
Leun Nun

คำตอบ:


2

Pyth - 73 70 ไบต์

Kmsd"78963214"DPGJXXYt@K+xKQG\@4\.R?q/J\#/Y\#Jk=YwV5=GflTmPd(N_N)IGOGB

ลองมัน

อินพุตประกอบด้วยสองบรรทัด:

บรรทัดที่ 1: ทิศทางการเคลื่อนที่

บรรทัดที่ 2: กระดาน (ตำแหน่ง 123456789 โดยที่ 123 เป็นแถวบนสุด)


3

JavaScript (ES6), 192 163 ไบต์

a=>b=>a[(a[4]=0)+--b]?(A=(c,d)=>c==b|(e=a[c])-(f=a[d])|!e?(a[c-b?(e?e<f:new Date&1)?c:d:4]=2,a):A(+g[c],+h[d]))(+(g="3016X2785")[b],+(h="1250X8367")[b]):(a[b]=2,a)

หมายเหตุ

ฟังก์ชั่นนี้ใช้รูปแบบอินพุตพิเศษ อินพุตแรกคืออาร์เรย์ของจำนวนเต็ม ( 0for floor, 1for wallและ2for player) ที่แสดงถึงแผนที่ อินพุตที่สองคือทิศทาง (พลิก): 1คือทิศตะวันตก2เฉียงเหนือ3คือทิศเหนือคือทิศตะวันออกเฉียงเหนือ4คือทิศตะวันตก ฯลฯ อินพุตที่ควรได้รับผ่านทางไวยากรณ์การแกง ( Z(a)(b))

กรณีทดสอบ

แผนที่และเส้นทางได้รับการแก้ไขให้เหมาะกับรูปแบบการป้อนข้อมูลของฉัน

Z=
a=>b=>a[(a[4]=0)+--b]?(A=(c,d)=>c==b|(e=a[c])-(f=a[d])|!e?(a[c-b?(e?e<f:new Date&1)?c:d:4]=2,a):A(+g[c],+h[d]))(+(g="3016X2785")[b],+(h="1250X8367")[b]):(a[b]=2,a)

testcases = [
    [[1,0,0,0,2,1,1,0,1], 3],
    [[1,0,0,0,2,1,1,0,1], 9],
    [[1,1,0,1,2,1,0,0,1], 1],
    [[0,0,0,0,2,0,0,0,0], 5],
    [[1,1,1,1,2,1,1,1,1], 2]
]
for (test of testcases) {
    console.log(Z(test[0])(test[1]))
}


1

Python 3, 120 104 153 176 175 ไบต์

def f(n,l):
 n-=1
 if n!=4and'.'in l:l[sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)[1][0]],l[4]='@.'
 return l

ลองออนไลน์!

วิธีนี้รับทิศทางและรายการ '.', '#' และ '@' ดัชนีเริ่มต้นด้วย 1 ถึง 9 (0 ถึง 8 ในรายการจริงๆ) ดังนั้นจึงมีรูปแบบ

123 
456
789 

วิธีการคืนรายการใหม่ที่มีตำแหน่งใหม่

สายนี้

sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)

ส่งคืนรายการประเภทนี้:

>>>n=7
>>> l=['#','#','#','.','@','#','.','#','.']
>>> sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)
[(4, '@'), (8, '.'), (6, '.'), (3, '.'), (7, '#'), (5, '#'), (1, '#'), (0, '#'), (2, '#')]

เราคำนวณระยะทางเพื่อเพิ่มคะแนนและเพิ่มการสุ่ม เพราะord('#') <= ord('.') - 8 and ord('.') + 8 <= ord('@')เราสามารถพูดได้ว่าใกล้ที่สุด '.' สำหรับ n = 7 (ดัชนีในรายการ) มีดัชนี 8

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่าง:

>>> f(9, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '.', '.', '.', '#', '#', '@', '#']
>>> f(3, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '@', '.', '.', '#', '#', '.', '#']
>>> f(5, ['.','.','#','.','@','.','#','.','#'])
['.', '.', '#', '.', '@', '.', '#', '.', '#']
>>> f(7, ['#','#','#','#','@','#','#','#','#'])
['#', '#', '#', '#', '@', '#', '#', '#', '#']
>>> f(7, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '.', '@', '.', '#', '#', '.', '#'] or ['#', '.', '.', '.', '.', '#', '#', '@', '#']

1) สิ่งนี้ไม่ได้ผลสำหรับกรณีทดสอบที่ทิศทางที่ผู้เล่นต้องการย้ายเข้าครอบครองและตำแหน่งที่ถูกต้องไม่ใช่ตำแหน่งแรก','(ซึ่งเป็นกรณีสำหรับกรณีทดสอบ 2, 3 และ 5) 2) รูปแบบ I / O ของคุณดูเหมือนจะไม่เหมือนกับในคำถาม โปรดพูดถึงรูปแบบ I / O ของคุณ
ลุ

ตัวอย่างของคุณf(9, ...ไม่ทำงาน - วางอักขระที่ 2 แต่ตำแหน่งที่ใกล้ที่สุดถึง 9 คือ 6 และ 8 ดังนั้นควรเลือกหนึ่งในนั้นโดยการสุ่ม (ไม่มีการสุ่มในรหัสของคุณ) ยิ่งไปกว่านั้นมันควรจะไปรอบ ๆ ปริมณฑลเพื่อหาสิ่งที่ใกล้เคียงที่สุดถัดไปดังนั้นf(9,list("####@#.##"))ควรวางตัวละครไว้ในจุดเดียวที่เป็นไปได้ (7 ที่นี่)
Jonathan Allan

ขอบคุณที่ชี้ให้เห็นข้อผิดพลาดสำหรับฉันข่าวคือรหัส l [4], l [l.index ('.')] = '. @' และ l [l.index ('.')], l [4 ] = '@. แตกต่าง
КириллМалышев

@JanathanAllan ในตอนแรกฉันไม่ค่อยเข้าใจกฎ ฉันหวังว่าฉันจะแก้ไขรหัสได้อย่างถูกต้อง
КириллМалышев

ยังไม่ถูกต้องไม่ 1. ตัวอย่างf(9, ...ควรส่งคืนlist("#....##@#")(เนื่องจาก 8 เป็นอิสระและถัดจาก 9) 2. สิ่งที่f(9,list("####@.#.#"))ควรมีโอกาสกลับlist("####..#@#")(ไม่เสมอlist("####.@#.#")) ตามที่ระบุ "หากทั้งสองทิศทางเปิดอยู่ให้เลือกหนึ่งเพื่อย้ายไปที่สุ่ม"
Jonathan Allan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.