Дотримуйтесь неповних вказівок


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 (або найближчу альтернативу), значення повернення функції або параметр функції (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

Додано +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
Ton Hospel? :)
Лінн

14
Є лише один іноземець з таким ім’ям
Тон Євангеліє,

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 лотів. Спасибі!

Я зберіг два байта, встановлюючи O={0}і повернення `O`[9::5], яке не могло б бути дуже компактний: він передбачає , що hash(0) == 0, я думаю, тому , що викликає порядок елементів , repr(O)щоб бути

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

і творче нарізання цієї струни отримує мені відповідь.


Я думаю, що це страждає від експоненціального вибуху, якщо запустити його по великій майже порожній сітці з довгими струнними струнами
Тон Євангелія,

О так, це абсолютна катастрофа продуктивності. Це працює для прикладних сіток!
Лінн

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

Я спробую її скоротити далі. Пропозиції вітаються.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.