Eksik talimatları takip et


21

Bir arkadaşınız size şehirdeki en iyi restorana yol tarifi verdi. Bir dizi sola ve sağa dönüş. Ne yazık ki, bu dönüşler arasında ne kadar ileri gitmeniz gerektiğinden bahsetmeyi unuttular. Neyse ki üzerinde tüm restoranlar ile bir sokak haritası var. Belki de hangi restoranı kastettiklerini anlayabilirsin?

Giriş

Harita, ASCII karakterlerinden oluşan dikdörtgen bir ızgara olarak verilmiştir. .Bir yol, bir #, bir yapıdır Aiçin Zçeşitli restoranlar bulunmaktadır. Sol üst köşeden başlayıp doğuya gidiyorsunuz. Örnek:

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

Arkadaşınızın talimatları (potansiyel olarak boş) bir dize veya Ls ve Rs içeren karakterlerin listesi olarak verilecektir .

Çıktı

Her birinden önce ve sonunda en az bir adım atmanız şartıyla, giriş dizisindeki sola ve sağa dönüşlere karşılık gelen herhangi bir yolu yürüyebilirsiniz. Özellikle bu, dizenin Rsizinle başlaması halinde , en soldaki sütunda hemen güneye gidemezsiniz anlamına gelir . Ayrıca yerinde 180 ° dönemeyeceğiniz anlamına gelir.

Sonunda ulaştığınız bina dışında restoranlar veya restoranlar arasında yürüyemezsiniz. Sol üst köşenin a olduğunu kabul edebilirsiniz ..

Arkadaşınızın talimatıyla ulaşılabilecek tüm restoranları bir dize veya liste halinde çıkarmalısınız.

Talimatların en az bir restorana yol açacağını varsayabilirsiniz. Örneğin L, yukarıdaki harita için bir single geçersiz sayılır.

Yukarıdaki harita için bazı örnekler:

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

Özellikle Rulaşmadığını unutmayın B.

STDIN (veya en yakın alternatif), komut satırı argümanı veya işlev argümanı yoluyla giriş alarak ve sonucu STDOUT (veya en yakın alternatif), fonksiyon dönüş değeri veya function (out) parametresi ile çıktı alarak bir program veya işlev yazabilirsiniz.

Standart kuralları geçerlidir.

Ek Test Durumları

İşte Conor O'Brien'ın izniyle (biraz değiştirdiğim) daha büyük bir harita :

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

Ve işte birkaç seçilmiş yol tarifi listesi ve beklenen sonuçları:

<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

Bonus soru: bir giriş vardır sonuçları bu sadece I yoksa sadece U ? Öyleyse, bu yoldaki en kısa yol nedir?

Yanıtlar:


17

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

-F -Xn0i için +7 eklendi

İlk deneme.

STDIN'deki harita ile ve -i seçeneğinden sonraki yol tariflerini kullanın, örn.

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

İşletim sisteminizde STDIN'i ^Dveya ile çalışanlar ile kapatın ^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%

Verilen puanı almak için ^ H harfini değişmez kontrol karakteriyle değiştirin

Bonus soru:

  • Sadece sonuçlanan hiçbir giriş yok I
  • Sonuçlar sadece kısa girişi UolanRLLRRLLRLRLRRLRRLRLRLRRLLR
  • Eşsiz bir set elde etmek için gereken en uzun girdi RLLRRRLRLRLLLRRLRLLLLLRRRLLRRRLLLLLLLRRLRRRR,B O R

4
Ton Hospel? :)
Lynn

14
Bu isimde sadece bir uzaylı var
Ton Hospel

2
@TonHospel Burada olmanız bir onurdur.
msh210

8

Python 2, 180 177 168 163 161 158 bayt

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]

Parametre vbir dizge olarak haritadır; oolduğu LRdize.

Mitch Schwartz kurtardı 2 3 10 byte bir sürü. Teşekkürler!

İki byte'ı ayarlayarak O={0}ve geri döndürdüm `O`[9::5], ki bu çok taşınabilir olmayabilir: hash(0) == 0sanırım, çünkü öğelerin sırasının değişmesine neden olduğunu sanıyorum repr(O).

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

ve bu dizgiyi yaratıcı bir şekilde dilimlemek bana cevabı verir.


Eğer uzunca dönüş dizeleri ile büyük neredeyse boş ızgara üzerinde çalıştırırsanız ben üstel patlamadan bu acılarını düşünüyorum
Ton Hospel

Evet, tam bir performans felaketi. Yine de örnek ızgaralar için çalışıyor!
Lynn,

1

C ++ 465

C ++ çok ayrıntılı ...

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

Daha fazla kısaltmaya çalışacağım. Önerilerinizi bekliyoruz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.