ช่วย Pac-Man นับ Pac-Dots


29

ตามคำแนะนำของ Ms. Pac-Man ที่กังวลเกี่ยวกับการที่เขามีน้ำหนักเกิน Pac-Man ได้ตัดสินใจที่จะติดตามการบริโภค Pac-Dot ทุกวันของเขา ช่วยเขานับจำนวน Pac-Dots บนเส้นทางที่กำหนดในเขาวงกต!

เขาวงกต

เขาวงกต

ที่จะช่วยให้คุณสร้างการเข้ารหัสของตัวเองของเขาวงกตที่คุณสามารถได้รับข้อมูลดิบบางอย่างที่นี่

การเดินทางของ Pac-Man

ในบริบทของการท้าทายนี้จะใช้กฎต่อไปนี้:

  • ก่อนอื่นข่าวดี: ผีไม่มีอยู่จริง
  • แพคแมนเริ่มการแข่งขันเสมอตามตำแหน่งที่ระบุไว้ในภาพด้านบนมุ่งหน้าไปทางทิศตะวันออก ไม่มี Pac-Dot ที่ตำแหน่งเริ่มต้น
  • ตราบใดที่เขาเดินไปตามทางตรงเขาจะก้าวไปสู่สี่เหลี่ยมถัดไป
  • เมื่อเขาพบการเลี้ยว 90 °โดยไม่มีเส้นทางอื่น (สี่เหลี่ยมสีส้มบนแผนที่) เขาจะเลี้ยวโดยอัตโนมัติและเป็นระบบ
  • เมื่อเขาพบทางแยกที่มีหลายเส้นทาง (สี่เหลี่ยมสีเขียวบนแผนที่) เขาอาจดำเนินการต่อในทิศทางเดียวกัน - ถ้าทำได้ - หรือเลือกทิศทางอื่น (รวมถึงกลับรถด้วย)
  • เมื่อ Pac-Man ผ่านทางออกหนึ่งทางด้านซ้ายกลางหรือด้านขวากลางของเขาวงกตเขาจะปรากฏขึ้นอีกครั้งในด้านตรงข้ามทันที
  • Pac-Man กิน Pac-Dots ทั้งหมดบนเส้นทางที่เขาติดตาม เมื่อ Pac-Dot ถูกกินแล้วมันจะถูกลบออกจากเขาวงกต

ความท้าทาย

อินพุต

คุณจะได้รับสตริงที่อธิบายพฤติกรรมของ Pac-Man ในทางแยกที่เขากำลังจะไปถึง สายนี้จะทำจากตัวละครต่อไปนี้:

  • L: เลี้ยว 90 ไปทางซ้าย
  • R: เลี้ยว 90 ไปทางขวา
  • F: ไปข้างหน้า (ไม่เปลี่ยนทิศทาง)
  • B: ย้อนกลับ (กลับรถ)

เมื่อตัวละครทั้งหมดได้รับการประมวลผล Pac-Man จะหยุดที่จุดต่อไปที่เขาพบ

เอาท์พุต

คุณต้องพิมพ์หรือส่งออกจำนวน Pac-Dots ที่รับประทานไปตามทางเข้า

กฎระเบียบ

  • คุณสามารถเขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น
  • คุณสามารถรับอินพุตเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กได้ทั้งสตริงหรืออาร์เรย์ของอักขระ นอกจากนี้คุณยังอาจจะใช้ตัวละครอื่น ๆ ( แต่ตัวละครตัวหนึ่งต่อทิศทาง) [0 .. 9]หรือจำนวนเต็มใน หากคุณทำเช่นนั้นโปรดระบุให้ชัดเจนในคำตอบของคุณ
  • คุณสามารถสันนิษฐานได้ว่าอินพุตนั้นถูกต้องเสมอ (jsFiddle ด้านล่างจะตรวจพบข้อผิดพลาด แต่คุณไม่ควรทำ)
  • นี่คือโค้ดกอล์ฟดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

เปรย

มันอาจไม่จำเป็นหรือไม่เหมาะสมในการจัดเก็บรูปร่างที่แน่นอนของเขาวงกต

กรณีทดสอบและการสาธิต

กรณีทดสอบต่อไปนี้ - หรืออินพุตอื่น ๆ - สามารถทดสอบได้ใน jsFiddleนี้

1. Input  : ""
   Output : 1
   Comment: Pac-Man just advances to the first junction, eats the Pac-Dot on it and stops.

2. Input  : "L"
   Output : 7

3. Input  : "FFR"
   Output : 13

4. Input  : "LFLR"
   Output : 17
   Comment: Pac-Man will exit on the middle right side and re-appear on the left side.

5. Input  : "BBBB"
   Output : 2

6. Input  : "BRRFFFL"
   Output : 15

7. Input  : "LFFRLFFFFRF"
   Output : 50

8. Input  : "BRFRLRFRLFR"
   Output : 54
   Comment: Pac-Man will exit on the middle left side and re-appear on the right side.

9. Input  : "FFLRLFFLLLLFFBFLFLRRRLRRFRFLRLFFFLFLLLLFRRFBRLLLFBLFFLBFRLLR"
   Output : 244
   Comment: All cleared!

1
นี่คือข้อมูลบางอย่างมากขึ้นเพื่อช่วยออก: pastebin.com/G4MnbVww นี่คือรายการของทางแยกและจำนวนจุด pac บนถนนไปทางแยกถัดไปขึ้นอยู่กับทิศทางที่คุณไป (0 = ขึ้น, 1 = ซ้าย, 2 = ลง, 3 = ขวา) อาจมีข้อผิดพลาดและจำไว้ว่าทางแยกที่ 12, 13, 15, 16, 18 และ 19 ไม่มีจุดตรงกลางในขณะที่คนอื่น ๆ ทำ
แยกผลไม้

@ Challenger5 นี่มันดูดีนะ เนื่องจากการเคลื่อนไหวนั้นสัมพันธ์กันคุณอาจต้องการติดตามการวางแนวใหม่ของ Pac-Man เมื่อถึงทางแยกถัดไป
Arnauld

BTW ในเกม pac man ไม่สามารถกลับรถได้
Matthew Roh

4
@SIGSEGV โดย 'u-turn' ฉันแค่หมายถึงการเปลี่ยนทิศทางตรงกันข้ามซึ่งเป็นไปได้ตลอดเวลาในเกมอาเขตดั้งเดิมและโคลนทั้งหมดที่ฉันรู้จัก ฉันควรใช้คำอื่นหรือไม่
Arnauld

ฉันค่อนข้างมั่นใจว่า Pac-Man เริ่มมุ่งหน้าไปทางซ้ายในเกมอาร์เคดไม่ถูกต้อง
mbomb007

คำตอบ:


10

Pyth, 356 345 + 1 = 346 ไบต์

รหัสมีบาง unprintables ดังนั้นนี่คือxxdhexdump ย้อนกลับได้

0000000: 4a4b 304c 2c3d 2b4b 4062 4a58 624a 3041  JK0L,=+K@bJXbJ0A
0000010: 2c63 6a43 2201 e120 49b4 efbc e267 27f4  ,cjC".. I....g'.
0000020: a11b f5d5 7f79 d1a0 ab8a 7689 449f 0c50  .....y....v.D..P
0000030: b2d4 7c30 99c3 368e aa67 4213 ab9b d276  ..|0..6..gB....v
0000040: d75f 6e99 5757 04a6 08cc 99d0 7141 3d2f  ._n.WW......qA=/
0000050: d854 7cf7 4a70 954e 6e35 f9b9 e0c5 1d53  .T|.Jp.Nn5.....S
0000060: 36d5 63f9 cf13 0f66 c113 4dec 956e 5225  6.c....f..M..nR%
0000070: b14a 1659 dcb5 6822 3534 2034 6a43 2203  .J.Y..h"54 4jC".
0000080: ffe3 8fff 2232 3d59 636a 4322 0b8a 4624  ...."2=YcjC"..F$
0000090: 7815 4a94 192c 79f6 d6e5 e098 5e97 76bc  x.J..,y.....^.v.
00000a0: 23cf 027c 35c5 5098 2a83 68f1 823a 83f6  #..|5.P.*.h..:..
00000b0: dfa4 7e12 443f 0257 7adb ab2d 8e6f 1199  ..~.D?.Wz..-.o..
00000c0: 9a3e 3f9d a524 d331 c5ff 94ae e5a2 3507  .>?..$.1......5.
00000d0: bd22 3334 2032 3d6b 2b30 6a43 2202 25f2  ."34 2=k+0jC".%.
00000e0: f55c 2252 c250 0002 c250 0000 065c 225c  .\"R.P...P...\"\
00000f0: 2247 5289 3698 4227 5350 8822 3136 3d64  "GR.6.B'SP."16=d
0000100: 636a 4322 8223 a80e 5c22 981d d272 729d  cjC".#..\"...rr.
0000110: d88d 981d 5c22 5c22 2bd7 91dd 9428 73d7  ....\"\"+....(s.
0000120: 1dd7 2234 2032 5651 2079 483d 547e 4a40  .."4 2VQ yH=T~J@
0000130: 4047 4a2b 5a78 2246 5242 4c22 4e20 796b  @GJ+Zx"FRBL"N yk
0000140: 3d5a 4040 647e 4a40 4059 4a3d 5421 7840  =Z@@d~J@@YJ=T!x@
0000150: 594a 5454 2968 7948 0a                   YJTT)hyH.

ต้องใช้-Mแฟล็กเพื่อปิดใช้งานการบันทึก น่าเสียดายที่สิ่งนี้ไม่สามารถทำได้ในผู้ปฏิบัติการออนไลน์ที่ฉันรู้จัก

นี่คือเวอร์ชัน ASCII ที่พิมพ์ได้ที่สามารถอ่านได้ :

JK0L,=+K@bJXbJ0A,cj746957013238413906925468440008893181365431681519974815772691846219267045007717553452313017550830370829477591340658010575885616582299429376501117428763541235628345630376341520044712982918668584832091126800263024965443560007480163218792 54 4j17178005503 2=Ycj664551201217474826979459068682259492333017695780569003557724234375880492114440213266014621594427584622393511454741615093293082181365458295035985321888753898774398909 34 2=k+0j883734055588186287049718559289059922762611092840989558085734536 16=dcj53536195844172273707047543644202986760006840011986146398708374999 4 2VQ yH=T~J@@GJ+Zx"FRBL"N yk=Z@@d~J@@YJ=T!x@YJTT)hyH

คำอธิบาย

นี่เป็นงานที่กำลังดำเนินการอย่างมากดังนั้นฉันยังไม่ได้โพสต์คำอธิบายที่สมบูรณ์

โดยทั่วไปโปรแกรมจะแสดงกระดานเป็นกราฟ (ค่อนข้างแปลก) โดยใช้ตารางการค้นหาห้าตาราง: 2 สำหรับการเชื่อมต่อ, 1 สำหรับทิศทางการเชื่อมต่อและ 2 สำหรับการนับจุด สิ่งนี้สร้างโดยสคริปต์ Python 200 บรรทัดที่ฉันใช้ไปหลายชั่วโมง จากนั้นโปรแกรมก็แค่ป้อนข้อมูลและนับจำนวนจุดอัปเดตตารางจุดให้เป็นศูนย์เมื่อมีการรวบรวมจุด

ทำ:

  • เขียนรูทีน Python เพื่อจัดเรียงโหนดใหม่จนกระทั่งตารางการค้นหามีอักขระที่ต้องมีการหลีกเลี่ยงน้อยที่สุด
  • ลองลบการจัดการส่วนทั้งหมด (ควรลบตารางการค้นหาหนึ่งตาราง)
    • ปรับปรุง:ลองสิ่งนี้ดูเหมือนว่าจะไม่ลบตารางและรหัสยาว
  • เขียนซ้ำอีกด้านตรรกะ Pyth (อันปัจจุบันไม่มากนัก)
    • ปรับปรุง:ค่อนข้างเสร็จแล้วรหัสยังไม่สมบูรณ์

เหตุใดคุณจึงไม่สร้าง URL ขึ้นมาเพื่อให้สามารถเรียกใช้รหัสจริงบน TIO ได้ บางทีเดนนิสควรเพิ่มวิธีที่ง่ายกว่าในการทำเช่นนั้น
mbomb007

@ mbomb007 TIO ไม่รองรับชุดทดสอบ (สำหรับ Pyth แล้ว) ดังนั้นฉันชอบใช้โฮสต์ของ Pyth นอกจากนี้ฉันไม่มั่นใจกับเบราว์เซอร์ที่จัดการไบต์ที่ถูกต้อง
PurkkaKoodari

สำหรับชุดที่ไม่ใช่การทดสอบคุณสามารถทำได้ และคุณยังคงสามารถใช้โค้ดเป็นโมฆะได้คุณไม่สามารถคัดลอก / วางได้ซึ่งเป็นสาเหตุที่คุณต้องสร้าง URL
mbomb007

Pyth ที่ยาวที่สุดตอบได้หรือยัง
Luis Mendo

@ LuisMendo อย่างน้อยสำหรับฉันก็ขึ้นอยู่กับการค้นหาที่รวดเร็ว : ~)
PurkkaKoodari

2

k, 264 ไบต์

b:,/16 16\'108_a:-135#0+1:"p.k"
(#(?27,r 1)^(12+!8)^14 17)+/b@?*|r:+1 27 0{i:a?64/(4!2+y+*x;x 1);(4 64\a i+1-2*2!i),_i%2}\0:""
\
...binary data...

การถ่ายโอนข้อมูล Hex:

$ xxd p.k
00000000: 623a 2c2f 3136 2031 365c 2731 3038 5f61  b:,/16 16\'108_a
00000010: 3a2d 3133 3523 302b 313a 2270 2e6b 220a  :-135#0+1:"p.k".
00000020: 2823 283f 3237 2c72 2031 295e 2831 322b  (#(?27,r 1)^(12+
00000030: 2138 295e 3134 2031 3729 2b2f 6240 3f2a  !8)^14 17)+/b@?*
00000040: 7c72 3a2b 3120 3237 2030 7b69 3a61 3f36  |r:+1 27 0{i:a?6
00000050: 342f 2834 2132 2b79 2b2a 783b 7820 3129  4/(4!2+y+*x;x 1)
00000060: 3b28 3420 3634 5c61 2069 2b31 2d32 2a32  ;(4 64\a i+1-2*2
00000070: 2169 292c 5f69 2532 7d5c 303a 2222 0a5c  !i),_i%2}\0:"".\
00000080: 0a02 4005 c006 4109 c103 8008 8143 c244  ..@...A......C.D
00000090: c345 c446 c547 c648 c749 c84a 820a 830c  .E.F.G.H.I.J....
000000a0: 840d 870b 8889 cb0e 8a11 8b0f 4c4d cc10  ............LM..
000000b0: cd4e d14f ce51 d014 8e12 8f13 9017 9153  .N.O.Q.........S
000000c0: d215 9216 931e 5455 d41a d51b 5657 d61f  ......TU....VW..
000000d0: d718 941d 9759 d85a d95b da5c db5d dc98  .....Y.Z.[.\.]..
000000e0: de20 9921 9c5f 9d5e 60df e161 e089 9833  . .!._.^`..a...3
000000f0: 4222 2247 2662 7550 0000 0500 5000 c255  B""G&buP....P..U
00000100: 2c22 2202 2588 5ff2                      ,"".%._.

ข้อมูลไบนารีตอนท้ายเข้ารหัสสองอาร์เรย์:

  • a ประกอบด้วยคู่ของไบต์แต่ละคู่แทน (64 * ทิศทาง) + junctionId

  • b คือจำนวนจุด Pacman ระหว่างจุดเชื่อมต่อแต่ละคู่ a

โปรแกรมอ่านไฟล์ต้นฉบับ ( p.k) และถอดรหัสข้อมูล

อินพุตมาจาก stdin และใช้ 0x00,0x01,0x02,0x03 (aka NUL, SOH, STX, ETX - สี่รหัส ASCII แรก) แทน FLBR

ผมใช้การดำเนินการของตัวเองของ kซึ่งมีการ จำกัด ป่อง crashy และช้าเมื่อเทียบกับสิ่งที่จริง ฉันทดสอบด้วยโปรแกรมต่อไปนี้:

t:{e:($y),"\n"; a:`sys[("/path/to/k";"./p.k");`c$"FLBR"?x]
   1@$[a~e;"ok\n";"failed ",x,"\n expected: ",e," actual: ",a,"\n"];}
t["";1]
t[,"L";7]
t["FFR";13]
t["LFLR";17]
t["BBBB";2]
t["BRRFFFL";15]
t["LFFRLFFFFRF";50]
t["BRFRLRFRLFR";54]
t["FFLRLFFLLLLFFBFLFLRRRLRRFRFLRLFFFLFLLLLFRRFBRLLLFBLFFLBFRLLR";244]
\

ฉันรวบรวมล่ามสำหรับ Linux (ขออภัยไม่มี Windows) และวางไฟล์ที่จำเป็นเพื่อเรียกใช้การทดสอบที่นี่: github.com/ngn/tmp เพื่อเรียกใช้พวกเขาเพียงแค่พิมพ์: ./k tk หากคุณยังต้องการลิงค์ดาวน์โหลดสำหรับ pk: github.com/ngn/tmp/blob/master/pk?raw=true
ngn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.