遵循不完整的指示


21

您的一位朋友已为您指示了镇上最好的餐厅。这是一系列的左转和右转。不幸的是,他们忘了提到在这些转弯之间需要走多长时间。幸运的是,您有一张包含所有餐厅的街道地图。也许您能弄清楚他们的意思是哪家餐厅?

输入项

该地图以ASCII字符的矩形网格形式给出。.之路,#是一个建筑,AZ是各种餐馆。您从左上角开始,向东行驶。例:

.....A
.#.###
B....C
##.#.#
D....E
##F###

您朋友的说明将以(可能为空)字符串或包含Ls和Rs 的字符列表的形式给出。

输出量

您可以走与输入字符串中的左转和右转相对应的任何路径,前提是您在每个位置之前和末端至少向前走了一步。特别是,这意味着如果字符串以R您开头,则不能在最左边的列中立即向南移动。这也意味着您不能当场旋转180°。

除了最后到达的那栋建筑物或餐厅,您不能漫步。您可以假设左上角为.

您应该将您朋友指示下可以到达的所有餐馆输出为字符串或列表。

您可能会认为这些说明将导致至少一家餐馆。例如,一张单张L对于以上地图无效。

上图的一些示例:

<empty> A
R       F
RR      B,D
RL      C,E
RLRL    E
RLLR    C
RLLL    B
RLRR    D
RLRRRR  A,C
RLLLRLL B

请特别注意R达不到B

您可以编写程序或函数,通过STDIN(或最接近的替代方案),命令行自变量或函数自变量获取输入,并通过STDOUT(或最接近的替代方案),函数返回值或函数(out)参数输出结果。

适用标准规则。

其他测试用例

这是一张较大的地图,由Conor O'Brien提供(我对此做了一些修改):

.......Y..........................######
.####.....#.##....##..######....#.###.##
B.........#.##.#..##....##...##.#.#P...#
.#.#####..#.##..#.##....##.#....#.####.#
.#.#...C..#.##...G##..#.##.#....#.#....#
.#.#.#.#..#.####.###.#..##.#....#.#.NO.#
.#.#A#.#..#.##...F###...##.#.##.#......#
.#.###....#.##....##....##.#....###....#
.#.....##...##....##...D##........###R.#
.#.##..##...##E...##..######....####...#
.....X....#.#.....................##S.T#
###########.###########M############...#
#................................###.#.#
#.#########.########.######.#.######.#.#
#......V#.....######.IJ...........##.#.#
#########.###......ZH############L##.#.#
#########.##########.###############.#.#
####K##...##########.#....#..........#.#
####....########U......##...#######Q.#.#
#####################################W.#

以下是一些选定的路线及其预期结果列表:

<empty>                                 Y
RR                                      B
RLL                                     Y
RLRR                                    B,C,X
RLLLRRR                                 G
RLRLRLRL                                I,Z
RLLRRRLRRLRR                            C,D,F,G,Y
RLRRLLRLLLRL                            B,C,Y
RLLRRLRRRLLLL                           F,M,N,O,Y
RLRRLLLRRRRLLLL                         F,M,Y
RLRRLRRRRRRRRRR                         E,F,Y
RLRRRLLLRLLRRLL                         M,N,O
RLLRRLRRLRLRLRRLLR                      E,U
RLRLLRLRRLRRRRRLRL                      F,G,I,Z
RLLRRLLRLLRRRLRRLLRR                    W
RLLLRRRLRRLLLLLRLLLLLL                  D,G,X
RLRLLRLRRLRLRRRLRLLLRR                  B,C,E,J,X
RLRLRLLLLRLRRRRRRLRLRRLR                Y
RLRLRRRLRLLLLRLRRLLLLRLLRRL             E,M,X
RLRLLLRRRLLLRLLRLLRLRRLRLRR             B,E,F,K
RLRRRLLLLLLLLLLLLLLLRRRRLLL             A,B

额外的问题:是否有输入 导致I 或仅 导致U?如果是这样,最短的路径是什么?

Answers:


17

Perl中,150 149 146 145 141 140 138 136 135 133 130 126 125 124

为-F -Xn0i添加+7

初步尝试。

使用STDIN上的地图以及-i选项后的方向运行,例如

perl -F -Xn0iRL incomplete.pl
.....A
.#.###
B....C
##.#.#
D....E
##F###

^D^Z或在您的操作系统上可用的任何方法关闭STDIN 。

incomplete.pl

%P=0;$^I=~s``{%;=!/
/;%P=map{$_|=$F[$^H=$_+=(1,@+,-1,"-@+")[$d&3]]=~/(\w)|#|^$/*~!\$;{$1}}(%P)x@F}$d-=B&$'^u`eg;print%

用文字控制字符替换^ H以得到给定的分数

奖励问题:

  • 没有输入只会导致 I
  • 仅导致最短的输入URLLRRLLRLRLRRLRRLRLRLRRLLR
  • 在一套独特需要的结果最长的输入是RLLRRRLRLRLLLRRLRLLLLLRRRLLRRRLLLLLLLRRLRRRR赋予B O R

4
吨Hospel?:)
Lynn

14
只有一个名字叫外星人
Ton Hospel '16

2
@TonHospel能在这里很荣幸。
msh210 '16

8

Python 2中,180个 177 168 163 161 158字节

def a(v,o,c=0,A=0,d='.',O={0}):
 while'.'==d:w=v.find('\n');c+=[1,~w,-1,w+1][A%4];d=v[c];o>v<a(v+' '*w,o[1:],c,ord(o[0])-~A,d);d>v>o<O.add(d)
 return`O`[9::5]

参数v是作为字符串的映射;oLR字符串。

Mitch Schwartz保存了2 3 10字节。谢谢!

我通过设置保存两个字节O={0}并返回`O`[9::5],这可能不是非常便携:它假设hash(0) == 0,我认为,因为这会导致元素的顺序repr(O)

set([0, 'A', 'B', 'C'])

并创造性地将其切成薄片即可得到答案。


我认为,如果您在带有较长转弯弦的几乎是空的大网格上运行,则会遭受指数爆炸
Ton Hospel

哦,是的,这绝对是性能的灾难。不过,它适用于示例网格!
林恩

1

C ++ 465

C ++太冗长...

#include <vector>
#include <iostream>
using namespace std;
#define M m[y][x]
#define A if(M!=46)break
vector<string>m;char n[99];int r(int x,int y,int z,const char *d){for(;;){if(z%2)y=y-2+z;else x=x+1-z;if(y<0||y>=m.size()||x<0||x>=m[y].size())break;if(*d){A;r(x,y,(*d==82?z+3:*d==76?z+1:z)%4,d+1);}else{if(M>64&&M<91)n[M]++;A;}}}int main(int c,char**v){string l;while(getline(cin,l))m.push_back(l);r(0,0,0,c>1?v[1]:"");for(char j=0;j<99;j++)if(n[j])cout<<j<<" ";}

我将尝试进一步缩短它。欢迎提出建议。

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.