불완전한 지시를 따르십시오


21

당신의 친구가 당신에게 마을 최고의 레스토랑으로가는 길을 알려주었습니다. 일련의 좌우 회전입니다. 불행히도, 그들은 당신이 그 턴 사이에 얼마나 오래 가야하는지 언급하는 것을 잊었습니다. 다행히 모든 레스토랑이있는 거리지도가 있습니다. 그들이 어떤 식당을 의미했는지 알아낼 수 있습니까?

입력

맵은 ASCII 문자의 사각형 격자로 제공됩니다. .도로는이다 #, 건물입니다 A하는 Z다양한 레스토랑이 있습니다. 왼쪽 상단에서 시작하여 동쪽으로갑니다. 예:

.....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 ? 그렇다면 가장 짧은 경로는 무엇입니까?

답변:


17

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###

STDIN을 사용 ^D하거나 ^Z운영 체제에서 작동하는 모든 것을 닫습니다 .

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
  • 고유 세트를 생성하는 데 필요한 가장 긴 입력 RLLRRRLRLRLLLRRLRLLLLLRRRLLRRRLLLLLLLRRLRRRRB O R

4
톤 Hospel? :)
Lynn

14
그 이름을 가진 외계인은 하나뿐입니다
Ton Hospel

2
@TonHospel 여기에 오게되어 영광입니다.
msh210

8

파이썬 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는 맵으로서 문자열입니다. o는 IS LR문자열.

Mitch Schwartz는 2 3 10 많은 바이트를 절약했습니다 . 감사!

설정 O={0}하고 반환 하여 2 바이트를 절약 `O`[9::5]했습니다. 이는 휴대하기가 쉽지 않을 것 hash(0) == 0입니다. 요소의 순서 repr(O)

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

그 문자열을 창의적으로 자르면 답이 나옵니다.


긴 줄로 긴 거의 빈 그리드에서 돌면 폭발적인 폭발로 인한 것 같습니다
Ton Hospel

아, 그렇습니다. 절대적인 성능 재앙입니다. 그래도 예제 그리드에서 작동합니다!
Lynn

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<<" ";}

나는 그것을 더 짧게하려고 노력할 것이다. 제안은 환영합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.