不完全な指示に従う


21

あなたの友人が町で最高のレストランへの道順を教えてくれました。一連の左と右のターンです。残念ながら、彼らはあなたがそれらのターンの間にまっすぐに進む必要がある時間について言及するのを忘れていました。幸いなことに、すべてのレストランがある通りの地図があります。たぶん、あなたは彼らがどのレストランを意味したかを理解できるでしょうか?

入力

マップは、ASCII文字の長方形のグリッドとして提供されます。.道は、ある#建物であるAためにZ様々なレストランがあります。左上隅から始まり、東に進みます。例:

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

友人の指示は、LsとRs を含む(潜在的に空の)文字列または文字のリストとして提供されます。

出力

入力文字列の左と右のターンに対応する任意のパスを歩くことができます。ただし、それぞれのパスの前と最後で少なくとも1ステップ先に進む必要があります。特に、文字列がで始まる場合、R一番左の列ですぐに南に行けないことを意味します。また、その場で180°向きを変えることはできません。

最後に到達した建物以外の建物やレストランを歩くことはできません。あなたは左上隅がであると仮定するかもしれません.

友達の指示で到達できるすべてのレストランを、文字列またはリストとして出力する必要があります。

指示が少なくとも1つのレストランにつながると想定することができます。たとえば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

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

閉じると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
  • 一意のセットを生成するために必要な最長の入力RLLRRRLRLRLLLRRLRLLLLLRRRLLRRRLLLLLLLRRLRRRRは、B O R

4
トンHospel?:)
リン

14
その名前のエイリアンは1人だけです
トンホスペル

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あるLR文字列が。

ミッチ・シュワルツは2 3 10ロットのバイトを節約しました。ありがとう!

私は設定して、2つのバイトを保存O={0}し、返却`O`[9::5]は非常に移植できない可能性がある、:それはそれを前提としhash(0) == 0ているが、中に要素の順序を引き起こすので、私が思うに、repr(O)であることを

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

その文字列を創造的にスライスすることで答えが得られます。


長いターンストリングのある大きなほとんど空のグリッドで実行すると、指数関数的な爆発に悩まされると思います
トン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.