Follow incomplete directions

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

Added +7 for -F -Xn0i

An initial attempt.

Run with the map on STDIN and the directions after the -i option, e.g.

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

Close STDIN with ^D or ^Z or whatever works on your operating system.

incomplete.pl:

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

Replace the ^H by the literal control character to get the given score

Bonus question:

  • There is no input that results in only I
  • The shortest input that results in only U is RLLRRLLRLRLRRLRRLRLRLRRLLR
  • The longest input needed to result in a unique set is RLLRRRLRLRLLLRRLRLLLLLRRRLLRRRLLLLLLLRRLRRRR which gives B O R

Python 2, 180 177 168 163 161 158 bytes

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]

Parameter v is the map as a string; o is the LR string.

Mitch Schwartz saved 2 3 10 lots of bytes. Thanks!

I saved two bytes by setting O={0} and returning `O`[9::5], which might not be very portable: it assumes that hash(0) == 0, I think, because that causes the order of elements in repr(O) to be

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

and creatively slicing that string gets me the answer.


C++ 375

Thanks to @ceilingcat for finding a much better (and shorter) version

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

Try it online!