Thực hiện theo các hướng dẫn không đầy đủ


21

Một người bạn của bạn đã cho bạn chỉ dẫn đến nhà hàng tốt nhất trong thị trấn. Đó là một loạt các rẽ trái và phải. Thật không may, họ đã quên đề cập đến việc bạn cần đi thẳng bao lâu giữa các lượt đó. May mắn thay, bạn có một bản đồ đường phố với tất cả các nhà hàng trên đó. Có lẽ bạn có thể tìm ra nhà hàng họ có nghĩa là gì?

Đầu vào

Bản đồ được đưa ra dưới dạng lưới hình chữ nhật gồm các ký tự ASCII. .là một con đường, #là một tòa nhà, Ađể Zlà những nhà hàng khác nhau. Bạn bắt đầu ở góc trên bên trái, đi về phía đông. Thí dụ:

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

Hướng dẫn của bạn bè sẽ được cung cấp dưới dạng chuỗi (có khả năng trống) hoặc danh sách các ký tự có chứa Ls và Rs.

Đầu ra

Bạn có thể đi bộ bất kỳ con đường nào tương ứng với rẽ trái và phải trong chuỗi đầu vào, với điều kiện bạn phải tiến ít nhất một bước về phía trước trước mỗi bước, cũng như ở cuối. Cụ thể, điều này có nghĩa là nếu chuỗi bắt đầu với Rbạn không thể đi về phía nam ngay lập tức trong cột ngoài cùng bên trái. Điều đó cũng có nghĩa là bạn không thể quay ngoắt 180 ° ngay tại chỗ.

Bạn không thể đi bộ qua các tòa nhà hoặc nhà hàng trừ cái bạn đến ở cuối. Bạn có thể cho rằng góc trên cùng bên trái là a ..

Bạn nên xuất tất cả các nhà hàng có thể đạt được theo hướng dẫn của bạn bè, dưới dạng chuỗi hoặc danh sách.

Bạn có thể cho rằng các hướng dẫn sẽ dẫn đến ít nhất một nhà hàng. Ví dụ, một đơn Lsẽ không hợp lệ cho bản đồ trên.

Một số ví dụ cho bản đồ trên:

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

Đặc biệt lưu ý rằng Rkhông đạt được B.

Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và xuất kết quả qua tham số STDOUT (hoặc thay thế gần nhất), tham số trả về hàm hoặc tham số hàm (out).

Luật tiêu chuẩn được áp dụng.

Các trường hợp kiểm tra bổ sung

Đây là một bản đồ lớn hơn, lịch sự của Conor O'Brien (mà tôi đã sửa đổi một chút):

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

Và đây là một vài danh sách hướng dẫn được lựa chọn và kết quả mong đợi của họ:

<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

Câu hỏi thưởng: có một đầu vào chỉ dẫn đến I hoặc chỉ U ? Nếu vậy, con đường ngắn nhất như vậy là gì?

Câu trả lời:


17

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

Đã thêm +7 cho -F -Xn0i

Một nỗ lực ban đầu.

Chạy với bản đồ trên STDIN và chỉ đường sau tùy chọn -i, ví dụ:

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

Đóng STDIN với ^Dhoặc ^Zbất cứ thứ gì hoạt động trên hệ điều hành của bạn.

incomplete.pl:

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

Thay thế ^ H bằng ký tự điều khiển theo nghĩa đen để có được số điểm nhất định

Câu hỏi thưởng:

  • Không có đầu vào nào chỉ dẫn đến I
  • Đầu vào ngắn nhất mà kết quả chỉ URLLRRLLRLRLRRLRRLRLRLRRLLR
  • Đầu vào dài nhất cần thiết để tạo thành một bộ duy nhất là RLLRRRLRLRLLLRRLRLLLLLRRRLLRRRLLLLLLLRRLRRRRcung cấpB O R

4
Các Tôn Hospel? :)
Lynn

14
Chỉ có một người ngoài hành tinh có tên đó
TonMedel 24/2/2016

2
@TonH rửa Thật vinh dự khi có bạn ở đây.
msh210

8

Python 2, 180 177 168 163 161 158 byte

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]

Tham số vlà bản đồ dưới dạng chuỗi; oLRchuỗi.

Mitch Schwartz đã lưu 2 3 10 rất nhiều byte. Cảm ơn!

Tôi lưu hai byte bằng cách thiết lập O={0}và trở về `O`[9::5], mà có thể không được rất cầm tay: nó giả định rằng hash(0) == 0, tôi nghĩ rằng, bởi vì đó gây ra thứ tự của các yếu tố trong repr(O)

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

và sáng tạo cắt chuỗi đó cho tôi câu trả lời.


Tôi nghĩ rằng điều này phải chịu một vụ nổ theo cấp số nhân nếu bạn chạy nó trên một lưới lớn gần như trống rỗng với các chuỗi quay dài
TonMedel

Ồ, vâng, đó là một thảm họa hiệu suất tuyệt đối. Nó hoạt động cho các ví dụ lưới, mặc dù!
Lynn

1

C ++ 465

C ++ thật dài dòng ...

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

Tôi sẽ cố gắng rút ngắn nó hơn nữa. Đề nghị được chào đón.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.