Фон
Ви прокинетесь, щоб опинитися загубленим в одномірному лабіринті! З’являється містичний джин (або щось таке) і пояснює, що вихід стоїть перед вами, але що між вами та виходом є низка викликів. Коли ти бродиш вперед, ти розумієш, що всі так звані виклики - це лише зачинені двері. Ви вперше бачите двері з отвором для ключів у формі трійника і, не маючи такого ключа, витягуйте свої кроки, шукаючи ключ з T
формою.
Розчарувавшись, ви знайдете на землі суп з алфавітом ключів, жоден з яких не відповідає дверям, на які ви натрапили. Деяким геніальним штрихом (або ідіотизмом) ви вирішите, що t
ключ у формі малого регістру міг би поміститися у гніздо, якщо застрягнути його там досить сильно. Коли ви підходите до дверей із малим t
ключем у руці, T
отвір світиться зеленим кольором, і двері розчиняються перед вами.
Один вниз, ще багато ...
Виклик
Мета цього виклику - позначити, скільки кроків вам потрібно, щоб вийти з лабіринту.
Вхідним завданням цього завдання є лабіринт: одна рядок, що містить лише символи [A-Za-z^$ ]
. Глосарій:
^
- Стартовий простір. Вхід буде містити рівно один^
.$
- Вихід (свобода!). Вхід буде містити рівно один$
.[A-Z]
- Великі літери означають двері. Ви можете пройти через ці двері, лише якщо ви вже зібрали необхідний ключ.[a-z]
- Малі літери означають клавіші. Ви збираєте ці ключі, переходячи до місця, яке містить ключ.
Тут буде максимум одна з великих літер. Це означає, що загальна кількість дверей буде становити 0-26 включно.
Кожна заблокована двері [A-Z]
матиме рівно один відповідний нижній ключ [a-z]
. На вході може бути будь-яка кількість пробілів ( ).
Усі двері будуть праворуч від початку та ліворуч від виходу. Таким чином зайвих дверей не буде. Усі входи будуть вирішувані.
Результатом для цього виклику буде число, кількість кроків, які пройшли, щоб вийти з лабіринту.
Алгоритм
Ваш методичний підхід до виходу з цього жалюгідного місця полягає в наступному:
- Почніть з початку (
^
) і рухайтеся вперед (вправо), збираючи будь-які клавіші, на які ви натрапили. - Якщо ви натрапили на двері, якщо у вас є правильний ключ, ви переходите до дверей. Якщо у вас немає правильного ключа, ви йдете назад (ліворуч), збираючи ключі, на які ви натрапили, поки не знайдете ключ для останньої двері, яку ви не змогли відкрити.
- Як тільки ви зіберете ключ для поточної тривожної двері, ви повернетеся вправо і продовжуєте рух вперед.
- Повторіть цей процес, поки не перейдете до виходу (
$
).
Досвідчені гольфісти зрозуміють, що ваш код не повинен реалізовувати цей конкретний алгоритм до тих пір, поки він дає такий же результат, як якщо б ви запустили цей алгоритм.
Підрахунок
Кожен раз, коли ви переходите від одного квадрата до іншого, це рахується як один крок. Поворот на 180º не передбачає додаткового кроку. Ви не можете вийти на двері без необхідного ключа. Ви повинні наступити на ключ, щоб забрати його, і перейти до виходу, щоб перемогти. Після першого переміщення стартовий простір ( ^
) поводиться так само, як і будь-який інший звичайний простір.
Приклади
У цих прикладах я залишив пробіли як підкреслення для читабельності людини.
Введення є _a_^_A__$__
. Вихід є 11
. Ви робите 1
крок вперед, помічаєте, що у вас немає ключа від A
дверей, а потім про обличчя. Ви йдете назад, поки не займете простір, що містить a
( 3
кроки назад, тепер 4
усього). Потім ви йдете вперед, поки не займете простір, що містить вихід ( 7
кроки вперед, 11
усього).
Введення є b__j^__a_AJB_$
. Вихід - 41
Ви робите дві окремі поїздки до задньої частини лабіринту, одну для отримання j
ключа, а наступну для отримання b
ключа.
Введення є __m__t_^__x_T_MX_$____
. Вихід є 44
. Ви не будете робити жодної додаткової поїздки, щоб отримати x
ключ, оскільки ви забрали його на шляху від початку до дверей T
.
Введення є g_t_^G_T$
. Вихід є 12
. Ви не можете переміститись у G
простір без клавіші та негайно навколо обличчя. Вам пощастило забрати t
ключ на шляху до g
ключа і тим самим відкрити обидві двері на шляху до свободи.
Введення є _^_____$
. Вихід є 6
. Це було легко.
Керівні принципи вводу / виводу та критерій виграшу
Застосовуються стандартні правила вводу / виводу. Це проблема з кодовим гольфом .
A
в bA^aB$
не буде зайвим ні. ;)