ทำตามคำแนะนำที่ไม่สมบูรณ์


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 (หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือพารามิเตอร์

ใช้กฎมาตรฐานของ

กรณีทดสอบเพิ่มเติม

นี่คือแผนที่ขนาดใหญ่ความอนุเคราะห์ของ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

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

เพิ่ม +7 สำหรับ -F -Xn0i

ความพยายามครั้งแรก

รันด้วยแผนที่บน 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
  • อินพุตที่สั้นที่สุดที่ให้ผลลัพธ์เท่านั้นUคือRLLRRLLRLRLRRLRRLRLRLRRLLR
  • อินพุตที่ยาวที่สุดที่ต้องการเพื่อให้ได้ผลลัพธ์ในชุดที่ไม่เหมือนใครคือRLLRRRLRLRLLLRRLRLLLLLRRRLLRRRLLLLLLLRRLRRRRสิ่งที่ให้B O R

4
พระวรสารตัน :)
ลินน์

14
มีคนต่างด้าวเพียงคนเดียวที่มีชื่อนั้น
Ton Hospel

2
@TonHospel มันเป็นเกียรติอย่างยิ่งที่ได้มาอยู่ที่นี่
msh210

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คือแม็พเป็นสตริงoเป็นLRสตริง

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

ฉันจะพยายามย่อให้สั้นลงอีก ข้อเสนอแนะยินดีต้อนรับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.