帮助吃豆人计算吃点数


29

在担心自己超重的吃豆人女士的建议下,吃豆人决定跟踪自己每天的吃豆点摄入量。帮助他计算迷宫中给定路径上的点点数!

迷宫

迷宫

为了帮助您构建自己的迷宫编码,您可以在此处获取一些原始数据

吃豆人的旅程

在此挑战的背景下,适用以下规则:

  • 首先,好消息是:幽灵不在。
  • 吃豆人总是在上图所示的位置开始比赛,向东方行驶。起始位置没有Pac-Dot。
  • 只要他一直走直线路,他就会一直前进到下一个方块。
  • 当他遇到90°转弯而没有其他可用路径(地图上的橙色正方形)时,他会自动而系统地转弯。
  • 当他遇到路口时多个路径可用(地图上的绿色正方形)时,他可以沿相同的方向继续行驶(如果适用),也可以选择其他方向(包括掉头)。
  • 当吃豆人穿过迷宫左中或右中出口的其中一个出口时,他立即在对面再次出现。
  • 吃豆人会在他遵循的路径上吃掉所有吃豆点。一旦吃了一点点,就将其从迷宫中取出。

挑战

输入值

您将得到一个字符串,描述吃豆人在他将要到达的路口的行为。此字符串将由以下字符组成:

  • L:向左旋转90度
  • R:向右旋转90度
  • F:前进(方向不变)
  • B:向后走(掉头)

处理完所有字符后,Pac-Man在遇到的下一个路口停下来。

输出量

您必须打印或输出沿输入路径吃掉的点点数。

规则

  • 您可以编写完整的程序或函数。
  • 您可以输入大写或小写形式的字符串或字符数组。您也可以在中使用其他字符(每个方向只能使用一个字符)或整数[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,这看起来不错。由于移动是相对的,因此您可能还想在到达下一个交叉路口时跟踪吃豆人的新方向。
Arnauld

顺便说一句,在游戏中,吃豆人无法掉头
马修·鲁

4
@SIGSEGV通过“掉头”,我的意思是转向相反的方向,这在原始的街机游戏和我所知道的所有克隆中都可以随时进行。我应该使用另一个术语吗?
Arnauld

我很确定吃豆人开始在街机游戏中向左走,而不是向右走。
mbomb007 '17

Answers:


10

Pyth,356 345 +1 = 346字节

该代码包含一些不可打印的内容,因此这里是可逆的xxd十六进制转储。

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个用于点计数。这是由我花了太多时间的200行Python脚本构建的。然后,程序仅遍历输入并计数点,在收集点时将点表更新为零。

去做:

  • 编写Python例程以对节点重新排序,直到查找表包含尽可能少的转义字符
  • 尝试完全删除节处理(应删除一个查找表)
    • UPDATE:尝试过此操作,似乎未删除表并延长代码
  • 重写Pyth端逻辑(当前的逻辑不太好)
    • 更新:有些完成,代码仍然不完善

您为什么不只生成URL,以便可以在TIO上运行真实代码?也许丹尼斯应该添加一种更简单的方法来做到这一点。
mbomb007 '17

@ mbomb007 TIO不支持测试套件(无论如何对于Pyth),所以我喜欢使用Pyth自己的主机。另外,我对浏览器正确处理空字节不是很有信心。
PurkkaKoodari

对于非测试套件,您可以。而且您仍然可以使用null进行编码,只是无法复制/粘贴它们,这就是为什么必须生成URL的原因。
mbomb007 '04

最长的Pyth回答了吗?
路易斯·门多

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

十六进制转储:

$ 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(又名NUL,SOH,STX,ETX-前四个ASCII码)代替FLBR。

我使用自己的k实现,与实物相比k是有限的,limited肿的,崩溃的和缓慢。我使用以下程序进行测试:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.