Segui indicazioni incomplete


21

Un tuo amico ti ha dato le indicazioni per il miglior ristorante in città. È una serie di curve a sinistra e a destra. Sfortunatamente, hanno dimenticato di menzionare per quanto tempo devi andare dritto tra quei turni. Fortunatamente hai una mappa stradale con tutti i ristoranti. Forse puoi capire quale ristorante intendessero?

Ingresso

La mappa è data come una griglia rettangolare di caratteri ASCII. .è una strada, #è un edificio, Aper Zsono i vari ristoranti. Inizi nell'angolo in alto a sinistra, andando verso est. Esempio:

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

Le istruzioni del tuo amico verranno fornite come una stringa (potenzialmente vuota) o un elenco di caratteri che contengono se Le R.

Produzione

Puoi percorrere qualsiasi percorso che corrisponda alle svolte a destra e sinistra nella stringa di input, a condizione che tu faccia almeno un passo avanti prima di ciascuno di essi, così come alla fine. In particolare questo significa che se la stringa inizia con Rte non puoi andare immediatamente a sud nella colonna più a sinistra. Significa anche che non è possibile ruotare di 180 ° sul posto.

Non puoi camminare attraverso edifici o ristoranti tranne quello che raggiungi alla fine. Si può presumere che l'angolo in alto a sinistra sia a ..

Dovresti produrre tutti i ristoranti che puoi raggiungere con le istruzioni del tuo amico, come una stringa o un elenco.

Puoi presumere che le istruzioni porteranno ad almeno un ristorante. Ad esempio, un singolo non Lsarebbe valido per la mappa sopra.

Alcuni esempi per la mappa sopra:

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

Nota in particolare che Rnon raggiunge B.

È possibile scrivere un programma o una funzione, prendendo l'input tramite STDIN (o l'alternativa più vicina), l'argomento della riga di comando o l'argomento della funzione e producendo il risultato tramite STDOUT (o l'alternativa più vicina), il valore di ritorno della funzione o il parametro della funzione (out).

Si applicano le regole standard del .

Casi di prova aggiuntivi

Ecco una mappa più grande, per gentile concessione di Conor O'Brien (che ho modificato un po '):

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

Ed ecco alcuni elenchi selezionati di indicazioni stradali e i loro risultati previsti:

<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

Domanda bonus: c'è un input che risulta solo I o solo U ? In tal caso, qual è il percorso più breve?

Risposte:


17

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

Aggiunto +7 per -F -Xn0i

Un tentativo iniziale.

Corri con la mappa su STDIN e le indicazioni dopo l'opzione -i, ad es

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

Chiudi STDIN con ^Do ^Zqualunque cosa funzioni sul tuo sistema operativo.

incomplete.pl:

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

Sostituisci ^ H con il carattere di controllo letterale per ottenere il punteggio dato

Domanda bonus:

  • Non ci sono input che producono solo I
  • L'input più breve che risulta solo UèRLLRRLLRLRLRRLRRLRLRLRRLLR
  • L'input più lungo necessario per ottenere un set unico è quello RLLRRRLRLRLLLRRLRLLLLLRRRLLRRRLLLLLLLRRLRRRRche dàB O R

4
The Ton Hospel? :)
Lynn,

14
C'è un solo alieno con quel nome
Ton Hospel,

2
@TonHospel È un onore averti qui.
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]

Il parametro vè la mappa come una stringa; oè la LRstringa.

Mitch Schwartz ha salvato 2 3 10 lotti di byte. Grazie!

Ho salvato due byte modificando O={0}e ritorno `O`[9::5], che potrebbe non essere molto portatile: assume che hash(0) == 0, ritengo, perché questo provoca l'ordine degli elementi in repr(O)essere

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

e tagliare creativamente quella stringa mi dà la risposta.


Penso che questo soffra di un'esplosione esponenziale se lo esegui su una grande griglia quasi vuota con stringhe di svolta longish
Ton Hospel,

Oh, sì, è un disastro in termini di prestazioni assolute. Funziona con le griglie di esempio, però!
Lynn,

1

C ++ 465

Il C ++ è così dettagliato ...

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

Proverò ad accorciarlo ulteriormente. Suggerimenti sono ben accetti

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.