Bantu Pac-Man menghitung Pac-Dots

29

Atas saran Ms. Pac-Man yang khawatir tentang kelebihan berat badannya, Pac-Man telah memutuskan untuk melacak asupan Pac-Dot hariannya. Bantu dia menghitung jumlah Pac-Dots pada jalur tertentu di labirin!

Labirin

labirin

Untuk membantu Anda membangun penyandian labirin sendiri, Anda bisa mendapatkan beberapa data mentah di sini .

Perjalanan Pac-Man

Dalam konteks tantangan ini, aturan berikut ini berlaku:

  • Pertama, kabar baiknya: hantu tidak ada di sana.
  • Pac-Man selalu memulai balapannya pada posisi yang ditunjukkan pada gambar di atas, menuju ke Timur. Tidak ada Pac-Dot di posisi awal.
  • Selama dia mengikuti jalan yang lurus, dia terus maju ke kotak berikutnya.
  • Ketika dia menemukan belokan 90 ° tanpa jalur lain yang tersedia (kotak oranye di peta), dia secara otomatis dan sistematis mengambil belokan.
  • Ketika ia menemukan persimpangan di mana beberapa jalur tersedia (kotak hijau di peta), ia dapat melanjutkan ke arah yang sama - jika ada - atau memilih arah lain (termasuk melakukan putar balik).
  • Ketika Pac-Man melewati salah satu pintu keluar di sisi kiri tengah atau kanan tengah labirin, ia segera muncul kembali di sisi yang berlawanan.
  • Pac-Man makan semua Pac-Dots di jalan yang dia ikuti. Setelah Pac-Dot dimakan, ia dikeluarkan dari labirin.

Tantangan

Memasukkan

Anda akan diberi string yang menggambarkan perilaku Pac-Man di persimpangan yang akan dijangkau. String ini akan dibuat dari karakter berikut:

  • L: lakukan belokan 90 ° ke kiri
  • R: lakukan belokan 90 ° ke kanan
  • F: maju (tidak ada perubahan arah)
  • B: mundur (putar balik)

Ketika semua karakter telah diproses, Pac-Man berhenti di persimpangan berikutnya yang dia temui.

Keluaran

Anda harus mencetak atau menampilkan jumlah Pac-Dots yang dimakan di sepanjang jalur input.

Aturan

  • Anda dapat menulis program atau fungsi lengkap.
  • Anda dapat mengambil input dalam huruf besar atau kecil, baik sebagai string atau array karakter. Anda juga dapat menggunakan karakter lain (tetapi hanya satu karakter per arah) atau bilangan bulat di [0 .. 9]. Jika Anda melakukannya, harap jelaskan dalam jawaban Anda.
  • Anda dapat mengasumsikan bahwa input selalu valid. (JsFiddle di bawah ini akan mendeteksi kesalahan, tetapi Anda tidak seharusnya melakukannya.)
  • Ini adalah kode-golf, jadi kode terpendek dalam byte menang.
  • Celah standar dilarang.

Petunjuk

Mungkin tidak diperlukan atau optimal untuk menyimpan bentuk labirin yang tepat.

Uji kasus dan demo

Kasing uji berikut - atau masukan lainnya - dapat diuji di jsFiddle ini .

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!
Arnauld
sumber
1
Berikut beberapa data untuk membantu: pastebin.com/G4MnbVww . Ini adalah daftar setiap persimpangan dan jumlah titik-titik di jalan ke persimpangan berikutnya tergantung pada arah mana Anda pergi (0 = atas, 1 = kiri, 2 = bawah, 3 = kanan). Mungkin ada beberapa kesalahan, dan perlu diingat bahwa persimpangan 12, 13, 15, 16, 18, dan 19 tidak memiliki titik di tengah, sementara yang lainnya melakukannya.
Buah Esolanging
@ Challenger5 Ini terlihat bagus. Karena gerakannya relatif, Anda mungkin ingin juga melacak orientasi baru Pac-Man ketika persimpangan berikutnya tercapai.
Arnauld
BTW Dalam game pac man tidak bisa melakukan putar balik
Matthew Roh
4
@SIGSEGV Dengan 'u-turn', maksud saya hanya mengubah ke arah yang berlawanan, yang mungkin kapan saja di game arcade asli dan semua klon yang saya tahu. Haruskah saya menggunakan istilah lain?
Arnauld
Saya cukup yakin Pac-Man mulai bergerak ke kiri di game arcade, tidak benar.
mbomb007

Jawaban:

10

Pyth, 356 345 + 1 = 346 byte

Kode ini mengandung beberapa unsintables, jadi di sini adalah xxdhexdump yang dapat dibalik.

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.

Membutuhkan -Mbendera untuk menonaktifkan memoisasi. Sayangnya, ini tidak dapat dilakukan di setiap pelaksana online yang saya kenal.

Berikut adalah versi ASCII yang dapat dicetak yang dapat dibaca :

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

Penjelasan

Ini sangat banyak pekerjaan yang sedang berlangsung, jadi saya belum akan memposting penjelasan lengkap.

Pada dasarnya, program ini mewakili papan sebagai grafik (agak aneh) menggunakan lima tabel pencarian: 2 untuk konektivitas, 1 untuk arah persimpangan, dan 2 untuk jumlah titik. Ini dibangun oleh skrip Python 200-baris yang saya habiskan terlalu banyak waktu. Kemudian program hanya berjalan melalui input dan menghitung titik-titik, memperbarui tabel titik menjadi nol saat titik-titik dikumpulkan.

MELAKUKAN:

  • Tulis rutin Python untuk menata ulang node sampai tabel pencarian berisi sesedikit mungkin karakter yang membutuhkan pelarian
  • Cobalah untuk menghapus penanganan bagian sama sekali (harus menghapus satu tabel pencarian)
    • PEMBARUAN: mencoba ini, sepertinya tidak menghapus tabel dan memperpanjang kode
  • Tulis ulang logika sisi Pyth (yang saat ini tidak terlalu golf)
    • PEMBARUAN: agak selesai, kode masih belum sempurna
PurkkaKoodari
sumber
Mengapa Anda tidak menghasilkan URL saja sehingga Anda dapat menjalankan kode asli di TIO? Mungkin Dennis harus menambahkan cara yang lebih mudah untuk melakukannya.
mbomb007
@ mbomb007 TIO tidak mendukung suite tes (untuk Pyth, toh), jadi saya ingin menggunakan host Pyth sendiri. Juga, saya tidak terlalu percaya diri dengan browser yang menangani null byte dengan benar.
PurkkaKoodari
Untuk suite non-tes, Anda bisa. Dan Anda masih dapat kode dengan nol, Anda tidak bisa menyalin / menempelkannya, itulah sebabnya Anda harus menghasilkan URL.
mbomb007
Jawaban Pyth terpanjang?
Luis Mendo
@LuisMendo Setidaknya bagi saya, berdasarkan pencarian cepat. : ~)
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...

Hex dump:

$ 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  [email protected]
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                      ,"".%._.

Data biner pada akhirnya mengkodekan dua array:

  • a terdiri dari pasangan byte, masing-masing mewakili (64 * arah) + junctionId

  • b adalah jumlah titik Pacman antara setiap pasangan persimpangan di a

Program membaca file sumbernya sendiri ( p.k) dan menerjemahkan data.

Input berasal dari stdin dan menggunakan 0x00,0x01,0x02,0x03 (alias NUL, SOH, STX, ETX - empat kode ASCII pertama) alih-alih FLBR.

Saya menggunakan implementasi k saya sendiri yang terbatas, kembung, macet, dan lambat dibandingkan dengan yang asli . Saya menguji dengan program berikut:

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]
\
ngn
sumber
Saya mengkompilasi juru bahasa untuk Linux (maaf, tidak ada Windows) dan meletakkan file yang diperlukan untuk menjalankan tes di sini: github.com/ngn/tmp Untuk menjalankannya, cukup ketik: ./k tk Jika Anda masih memerlukan tautan unduhan untuk pk: github.com/ngn/tmp/blob/master/pk?raw=true
ngn