The Last Slice: 解

The Last Slice series:Intro |  Challenge 1 & 2 | Challenge 3 | Thanks

上篇,目前The Last Slice前二关挑战已经截止,不知道有没有朋友去尝试过呢?(同一个话题能水两个月真开心啊)

本文将介绍两个挑战的解法。

 

第一关:TheLastSlice

入口:https://github.com/TheLastSliceGame/TheLastSliceGame

编译运行此项目需要VS2017,Win10,MonoGame SDK。

第一关是一个MonoGame编写的UWP游戏,玩法是扮演一个送披萨的车,按照菜单,在街道上找齐所有的原料,然后送到顾客家门口。在地图中移动会耗油,当油量降为0是游戏结束,完成数个运送任务后可进入下一关。代码库中的game_manual.pdf介绍了所有出现的原材料和特殊道具。

游戏共分为3关,前两关难度较小,但是第三关难度剧增,想手动通关需要极高的技巧和运气。

所以我们需要写一个AI来自动决策,帮我们通关……

不不,那就太麻烦了。由于游戏源代码已给,我们完全可以修改游戏的逻辑直接通关。改法也是非常自由的,比如你可以在TheLastSliceGame.cs中的Update()方法中加入当Space按键按下时直接进入下一关( LevelManager.NextLevel() )。或者,你会发现游戏通关后联网调用的API实际上就是在上传分数,那么你可以直接调用API上传一个分数,无需实际进行游戏。

所以这一关还是相当简单的,只要有C#基础都可以顺利通关……

 

第二关:KneadMoreDough

入口:https://github.com/KneadMoreDough/KneadMoreDough

编译运行此项目需要VS2017,Win10。

第二关简朴了许多,只是一个普通的UWP程序,其内容也非常简单,就是通过联网调用API获取一个问题,然后你需要将答案填在文本框中发送回去。

问题格式是Json,每次调用API获得的问题都是不同的,随后你将有30秒时间回答此问题,超时或结果错误都会失败,可继续尝试新问题。

展示一个获取到的问题:

{
  "Puzzle": {
    "Lines": [
      "NAUHI",
      "IREMH",
      "NCGMU",
      "OBKOO",
      "RAMET",
      "EAUTNIHJSTAGTTTHKJSO",
      "POSINMUSHROOMSCBCKGO",
      "PONEPALAJLLKHSTAARNL",
      "EGASUASJEAISJGCABLEH",
      "PSHKOTSJULUHAARHKOLO",
      "SPCPG",
      "INHPG",
      "MCGGU",
      "UMCMH",
      "PGIAU"
    ]
  },
  "Id": "deadbeef-a841-428f-afc7-e5b80e7688e3",
  "TimeIssued": "2018-06-07T10:24:30.2180931Z"
}

看到这个问题我们都是一头雾水的,首先想到的就是“这是要干什么?”和“回复格式是什么?”

其中第一个问题想必大家也都能推测出来,这大概是个找单词的游戏,虽然格式很奇怪。

第二个问题才是重点,大概可以刷掉很多参加者。需要仔细看源代码(MainPage.xaml.cs/btnChallenge2Click):

if (!string.IsNullOrEmpty(token))
                {
                    string puzzle = await challengeService.GetPuzzle();

                    // TODO: Now show your Swagger and find the solution.

                    string solution = "";
                    string solutionResponse = await challengeService.PostSolutionToPuzzle(solution);

                    ResultText.Text = solutionResponse;

                    // TODO: Check the solution response to see if you got the correct solution
                }

“Now show your Swagger and...”硬要说也没什么语法毛病,但是这里为什么非要用Swagger这个词来表达呢?因为我之前接触过Swagger,所以虽然第一时间没反应过来,但是仔细想了想还是怀疑到了。如果你没有接触过,就去网上百度了解一下。这是生成在线API文档的开源工具,在使用了Swagger的网站上访问xxx.com/swagger/ui/index就可以看到此网站所提供的REST API的说明文档和调用方式。

所以这里我们尝试访问 http://kneadmoredough.azurewebsites.net/swagger/ui/index ,bingo!

顺便一提,原本直接访问调用API的网址 http://kneadmoredough.azurewebsites.net 会返回403 forbidden,必须访问swagger页面才能看到真相。但是游戏后期,巨硬发现通关者比预期要少,于是一边在推特疯狂剧透,另一边继续降低难度,直接访问上面的地址也会跳转到swagger页面了……所以这个难点也基本上没有了。

根据上述文档说明,这果然是一个找单词游戏。但是上面并没有说明:

1. 要找哪些单词?

2. 单词后面有s咋办?

3. 为啥谜面每一行的长度不一样?

对于第一个问题,我们需要写一个AI来寻找和统计谜面中出现的单词,来寻找规律……

不不,那也太硬核了。可是还真有人这么干了(“Using a 7^3 tensor shell with 2x3x3 sliding/rotating convolution kernel, I can easily find 9 ingredients with a reasonable dictionary (e.g. Pepperoni, Raspi), and around 3k words in 6 seconds with a 370k word dictionary.”)。

其实通过仔细观察谜面和对第一关的印象就能发现大概:这其中出现的单词是第一关说明书中介绍的披萨原料:(说明书中的材料介绍共4页,以下截取2页)

第二个问题,我也不清楚……我采取的策略是如果后面是s就算上,否则就不算。比如上面贴的谜面中,在(6,5)处有MUSHROOM(S),我是按照MUSHROOMS提交的。

第三个问题,那就是本题的最后一个难点了。在搞明白前两点后,我写了一个按照词典找单词的程序,然而提交了几次,都不正确,于是怀疑是不是词典不对,是不是不该加s,反复尝试了很久。

但是后来,我觉得自己目前的思路没错,于是祭出了大杀器:反复横跳(误)提交。我使程序在得知答案不对后立即申请新问题继续回答。在连续错误了大概20~40次之后,最后真的正确了一次,通关!

所以说,暴力是真的可以为所欲为的……

那么第三个问题的答案究竟是什么呢?后来,巨硬又在推特疯狂剧透了:

巨硬发起了投票:“嘿伙计们,在玩TheLastSlice时你们觉得最麻烦的是啥?”

A: find the ingredients

B: Swagger

C: fold the cube

D: Take a break

嗯?叠方块???

原来在找单词时,还要把谜面叠成方块去考虑……

题目以5x5个字母作为一块,可以叠成一个方块(1-4-1,共6个面),当找单词找了一半就到了边界的时候,要继续到邻接的面去看是否继续匹配……

而之所以我能够暴力解出,是正好拿到了所有单词都不在边界上的情况。

(巨硬怕大家还没懂,随后又在推特发了个叠方块的视频,真是剧透到家了……)

 

以上就是The Last Slice前2关的解法。最终,有111个挑战者进入第三关,前五个解出第三关的将获得1w刀赏金……

 

 

添加评论

Loading