Giúp Pac-Man đếm số Pac-Dots


29

Theo lời khuyên của cô Pac-Man, người lo lắng về việc anh ta bị béo phì, Pac-Man đã quyết định theo dõi lượng Pac-Dot hàng ngày của anh ta. Giúp anh ta đếm số lượng Pac-Dots trên một con đường nhất định trong mê cung!

Mê cung

mê cung

Để giúp bạn xây dựng mã hóa mê cung của riêng mình, bạn có thể lấy một số dữ liệu thô tại đây .

Hành trình của Pac-Man

Trong bối cảnh của thách thức này, các quy tắc sau được áp dụng:

  • Đầu tiên, tin tốt: những con ma không có ở đó.
  • Pac-Man luôn bắt đầu cuộc đua của mình ở vị trí được chỉ ra trong bức ảnh trên, hướng về phía Đông. Không có Pac-Dot ở vị trí bắt đầu.
  • Chừng nào anh ta còn đi theo một con đường thẳng, anh ta tiếp tục tiến đến những ô vuông tiếp theo.
  • Khi anh ta gặp một ngã rẽ 90 ° mà không có bất kỳ con đường có sẵn nào khác (hình vuông màu cam trên bản đồ), anh ta tự động và quay đầu một cách có hệ thống.
  • Khi anh ta gặp một ngã ba có sẵn một vài con đường (hình vuông màu xanh lá cây trên bản đồ), anh ta có thể tiếp tục đi về cùng một hướng - nếu có thể - hoặc chọn một hướng khác (bao gồm thực hiện quay đầu xe).
  • Khi Pac-Man đi qua một trong những lối thoát ở phía giữa bên trái hoặc giữa bên phải của mê cung, anh ta ngay lập tức xuất hiện ở phía đối diện.
  • Pac-Man ăn tất cả Pac-Dots trên con đường anh ấy đi theo. Khi một Pac-Dot đã được ăn, nó sẽ bị xóa khỏi mê cung.

Các thách thức

Đầu vào

Bạn sẽ nhận được một chuỗi mô tả hành vi của Pac-Man trên các điểm nối mà anh ấy sẽ đạt được. Chuỗi này sẽ được tạo thành từ các ký tự sau:

  • L: rẽ 90 ° sang trái
  • R: rẽ 90 ° sang phải
  • F: đi tiếp (không thay đổi hướng)
  • B: đi ngược lại (quay đầu xe)

Khi tất cả các nhân vật đã được xử lý, Pac-Man dừng lại ở ngã ba tiếp theo mà anh gặp.

Đầu ra

Bạn phải in hoặc xuất số lượng Pac-Dots đã ăn dọc theo đường dẫn đầu vào.

Quy tắc

  • Bạn có thể viết một chương trình đầy đủ hoặc một chức năng.
  • Bạn có thể lấy đầu vào bằng chữ hoa hoặc chữ thường, dưới dạng một chuỗi hoặc một mảng các ký tự. Bạn cũng có thể sử dụng các ký tự khác (nhưng chỉ một ký tự cho mỗi hướng) hoặc số nguyên trong [0 .. 9]. Nếu bạn làm như vậy, xin vui lòng xác định rõ ràng trong câu trả lời của bạn.
  • Bạn có thể cho rằng đầu vào luôn hợp lệ. (JsFiddle bên dưới sẽ phát hiện lỗi, nhưng bạn không được phép.)
  • Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte sẽ thắng.
  • Sơ hở tiêu chuẩn bị cấm.

Dấu

Nó có thể không được yêu cầu cũng không tối ưu để lưu trữ hình dạng chính xác của mê cung.

Các trường hợp thử nghiệm và bản demo

Các trường hợp kiểm tra sau - hoặc bất kỳ đầu vào nào khác - có thể được kiểm tra trong jsFiddle này .

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
Dưới đây là một số dữ liệu khác để trợ giúp: pastebin.com/G4MnbVww . Đó là danh sách của mọi ngã ba và số điểm pac trên đường đến ngã ba tiếp theo tùy theo hướng bạn đi (0 = lên, 1 = trái, 2 = xuống, 3 = phải). Có thể có một số lỗi và hãy nhớ rằng các điểm nối 12, 13, 15, 16, 18 và 19 không có dấu chấm ở giữa, trong khi tất cả các điểm khác đều xảy ra.
Trái cây Esolanging

@ Challenger5 Điều này có vẻ tốt. Vì các bước di chuyển là tương đối, nên có lẽ bạn cũng muốn theo dõi hướng đi mới của Pac-Man khi đến ngã ba tiếp theo.
Arnauld

BTW Trong trò chơi, người đàn ông không thể quay đầu
Matthew Roh

4
@SIGSEGV Bởi 'u-Turn', tôi chỉ có nghĩa là thay đổi sang hướng ngược lại, điều này có thể xảy ra bất cứ lúc nào trong trò chơi arcade gốc và tất cả các bản sao mà tôi biết. Tôi có nên sử dụng một thuật ngữ khác?
Arnauld

Tôi khá chắc chắn Pac-Man bắt đầu đi sang trái trong trò chơi arcade, không phải.
mbomb007

Câu trả lời:


10

Pyth, 356 345 + 1 = 346 byte

Mã này chứa một số không thể in được, vì vậy đây là đảo ngược xxd hexdump .

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.

Yêu cầu -Mcờ để vô hiệu hóa ghi nhớ. Thật không may, điều này không thể được thực hiện trong bất kỳ nhà điều hành trực tuyến nào tôi biết.

Đây là phiên bản ASCII có thể đọc được :

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

Giải trình

Đây là công việc đang tiến triển rất nhiều, vì vậy tôi sẽ không đăng một lời giải thích hoàn chỉnh nào.

Về cơ bản, chương trình biểu thị bảng dưới dạng biểu đồ (hơi kỳ lạ) bằng cách sử dụng năm bảng tra cứu: 2 cho kết nối, 1 cho hướng tiếp giáp và 2 cho số lượng chấm. Điều này được xây dựng bởi một kịch bản Python 200 dòng mà tôi đã dành quá nhiều giờ. Sau đó, chương trình chỉ cần đi qua đầu vào và đếm các dấu chấm, cập nhật các bảng chấm thành 0 khi các dấu chấm được thu thập.

LÀM:

  • Viết thói quen Python để sắp xếp lại các nút cho đến khi bảng tra cứu chứa càng ít ký tự yêu cầu thoát càng tốt
  • Cố gắng loại bỏ hoàn toàn việc xử lý phần (nên xóa một bảng tra cứu)
    • CẬP NHẬT: đã thử điều này, dường như không xóa bảng và kéo dài mã
  • Viết lại logic phía Pyth (hiện tại không được đánh gôn)
    • CẬP NHẬT: phần nào được thực hiện, mã vẫn chưa hoàn hảo

Tại sao bạn không tạo URL để bạn có thể chạy mã thực trên TIO? Có lẽ Dennis nên thêm một cách dễ dàng hơn để làm điều đó.
mbomb007

@ mbomb007 TIO không hỗ trợ các bộ thử nghiệm (đối với Pyth, dù sao), vì vậy tôi thích sử dụng máy chủ của Pyth. Ngoài ra, tôi không tự tin lắm với các trình duyệt xử lý các byte rỗng một cách chính xác.
PurkkaKoodari

Đối với bộ không thử nghiệm, bạn có thể. Và bạn vẫn có thể mã bằng null, bạn không thể sao chép / dán chúng, đó là lý do tại sao bạn phải tạo URL.
mbomb007

Câu trả lời dài nhất của Pyth chưa?
Luis Mendo

@LuisMendo Ít nhất là đối với tôi, dựa trên một tìm kiếm nhanh. : ~)
PurkkaKoodari

2

k, 264 byte

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

Đổ lục giác:

$ 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                      ,"".%._.

Dữ liệu nhị phân ở cuối mã hóa hai mảng:

  • a bao gồm các cặp byte, mỗi byte đại diện (hướng 64 *) + jeftId

  • b là số chấm Pacman giữa mỗi cặp nút giao trong a

Chương trình đọc tệp nguồn riêng của nó ( p.k) và giải mã dữ liệu.

Đầu vào đến từ stdin và sử dụng 0x00,0x01,0x02,0x03 (còn gọi là NUL, SOH, STX, ETX - bốn mã ASCII đầu tiên) thay vì FLBR.

Tôi sử dụng triển khai k của riêng tôi bị hạn chế, cồng kềnh, sụp đổ và chậm so với thực tế . Tôi kiểm tra với chương trình sau:

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]
\

Tôi đã biên dịch trình thông dịch cho Linux (xin lỗi, không có Windows) và đặt các tệp cần thiết để chạy thử nghiệm tại đây: github.com/ngn/tmp Để chạy chúng, chỉ cần gõ: ./k tk Nếu bạn vẫn cần liên kết tải xuống cho pk: github.com/ngn/tmp/blob/master/pk?raw=true
ngn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.