Це заключний спринт ... і половина вашої команди погана. Ти працюєш із запізненням, просто робиш останній день на день, з нетерпінням чекаєш ... чому вимкнули світло? Я не пам’ятаю охоронця, який приїжджав ... о, ні! Я залишив ключі вдома!
Коли жах обернеться, ви вирішите, що збираєтесь втекти .
Підсумок завдань
Для здійснення втечі вам потрібен план! Однак ви знаєте, що будь-який план має шанс провалитися, а різні плани вимагають різної кількості зусиль.
Будучи голодним, втомленим та інженером, ви вирішили написати коротку програму, щоб визначити найкращий спосіб уникнути комплексу, врівноважуючи проблеми ймовірності успіху та зусиль, які знадобляться.
Ви складаєте карту будівлі:
#######################
# = #
! = ! <-- window
# ! = # (freedom!)
#################= #
# # = #
# # = #
# # = #
# o ! # # ! = #
##| ! ## # ! = #
#######################
^ ^ ^
me my door ludicrously high shelves
(locked) (climbable)
Щоб вийти з офісу, вам доведеться відійти від карти. Тут ви бачите, що є два вікна ( !
), і кожне з них призведе вас до свободи, але доступне лише одне з них. Ми визначаємо "вимкнути карту" як ноги поза межами карти
Типи клітин
- empty, you can be here (i.e. the escapee can consume this cell)
# - solid (your desk, your in-tray), you can't be here, but you can stand on it
! - destructible, (co-worker's desk, door, window), you can't be here until you smash it first (turning it into an empty cell)
= - climbable, (fire ladder, filing cabinet, etc.), you can be here
Камери, спочатку споживачі втечі, прийняті порожніми.
Технічні умови дії
У вас є кілька можливих дій у вашому одноразовому користуванні. Вони визначаються простими переходами стану з деякою цілою ймовірністю успіху. Наприклад, для ходьби ви переміщуєте одну клітинку, що ми представляємо за допомогою цього переходу:
Крок
1 ст.п., 100%, дзеркало
o. o
|. --> |
# #
У крапках відображаються клітини, які повинні бути порожніми (або піднімаються, але не твердими або руйнуючимись), тому що ми рухаємося в неї чи через неї. 100% означає, що у вас є 100% шанс не поранити себе і закінчити свій сміливий втечу. Усі ймовірності становитимуть цілі відсотки від 1% до 100% включно. Перша діаграма показує початковий стан (стоячи на чомусь твердому, стоячи поруч із деяким порожнім простором). Друга діаграма показує стан терміналу (переміщений у порожній простір). Немає вимог до того, щоб будь-які невизначені комірки (пробіли ) зліва (початковий стан) були будь-якими особливостями. Не визначені клітини (простір,
) праворуч (стан терміналу) має бути таким же, як вони були раніше (наприклад, те, що було за втечею, або те, що я трапляю на нього (будь то порожній простір чи іншим чином). ) діаграми змінять клітинки лише з руйнуючих на порожні, ніяких інших змін не може відбутися. "1 стор." означає, що це коштує 1 ст.: ми визначаємо "stp" як кількість енергії, необхідної для кроку.
"дзеркало" означає, що ця дія має дві форми. Показано дію "праворуч", дія "ліворуч" - це точно дзеркало, наприклад:
.o
.|
#
є дзеркальною (лівою) формою
o.
|.
#
Права дія називається "Право" (наприклад, "Крок вправо") Ліва дія називається "Ліворуч" (наприклад, "Крок вліво")
На цих діаграмах втікач показаний
o
|
при стоянні (2 одиниці заввишки) і
%
при присіданні (1 одиниця заввишки). Клітини , які повинні бути твердими або руйнуються позначені хеш, #
. Клітини, які не повинні бути твердими або руйнуючими, позначаються крапкою .
. Клітини, які повинні бути руйнівними, позначаються чубком !
. Новостворене порожнє місце відображається підкресленням _
.
x
є опорною точкою, яка не рухається (вона не існує, жодних обмежень щодо того, якою повинна бути ця комірка (як пробіл )).
Примітка: ми ігноруємо питання швидкого уповільнення, коли ви потрапляєте на підлогу, і так, у цій грі ви можете робити абсолютно епічні стрибки на сходах)
Крок
1 ст.п., 100%, дзеркало
o. o
|. --> |
x# x#
Піднятися
1 ст.п., 100%, дзеркало
= =
o. --> o
|. |
x= x=
Перемішати
3 ст.п., 100%, дзеркало
%. %
x# --> x#
Піднятися вгору
10 ст.п., 95%, дзеркало
o. %
|# --> #
x# x#
Крапля
0 стп, 100%
o
| --> o
x. x|
Падіння (підставка)
0 стп, 100%
% o
x. --> x|
Залазити
2 ст., 100%
= o
o --> |
x| x
Крауч
2 ст., 100%
o
| --> %
x# x#
Підставка
4 ст., 100%
. o
% --> |
x# x#
Короткий стрибок
4 ст.п., 95%, дзеркало
o.. o
|.. --> |
x# x#
Довгий стрибок
7 ст.п., 75%, дзеркало
o... o
|... --> |
x# x#
Стрибок у висоту
12 ст.п., 90%, дзеркало
.. o
o. --> |
|
x# x#
Покладіть спину в неї!
20 ст.п., 80%, дзеркало
o!. _o
|!. --> _|
x# x#
Удар
8 ст.п., 90%, дзеркало
o! o_
| --> |
x# x#
Удар
8 ст.п., 85%, дзеркало
o o
|! --> |_
x# x#
Штамп
8 ст., 90%
o o
| --> |
x! x_
Плани
План - це послідовність дій, визначених вище. Наприклад:
Step Left
High Jump Left
Crouch
Shuffle Left
Shuffle Left
Stand
Long Jump Left
Put your back into it! Left
Step Left
Зверніть увагу на включення крапель. Правила повинні бути встановлені, щоб перешкоджати вам робити що-небудь, окрім ухилення, але все ж таки планувати це потрібно!
Будь-який план вимагає зусиль, що становить суму зусиль для кожного кроку. Існує також ймовірність успіху, яка є результатом ймовірності успіху кожної дії. Простий приклад:
Step Right: 1stp, 100%
Long Jump Right: 7stp, 75%
Step Right: 1stp, 100%
Stamp: 8stp, 90%
Drop: 0stp, 100%
Drop: 0stp, 100%
Drop: 0stp, 100%
Drop: 0stp, 100%
Step Left: 1stp, 100%
Step Left: 1stp, 100%
High Jump Left: 12stp, 90%
Effort = 1+7+1+8+1+1+12 = 31
Success Probability = 75%*90*90% = 60.75%
"Опрацьований приклад" для карти вгорі сторінки можна знайти як суть .
Вхідні дані
Вхід складається з двох частин: ціле число та масив чи рядок символів.
Ціле число - це ваша мінімально прийнятна (відсоткова) ймовірність успіху. Це слід інтерпретувати як відсоток, тому 80 означає, що ваш план повинен досягти успіху з вірогідністю не менше 80%.
Дійсна карта - це прямокутник, який включає стоячий рятувальний рядок (мінімальний розмір 1x2) та відсутність визначених символів. Всі ряди будуть однакової довжини. Ви можете прийняти введення як одновимірний розмічений рядок (роздільник повинен бути єдиним послідовним символом або одним із пар CRLF та LFCR), як подібний 1-мірний масив або двовимірний масив. Якщо обраний формат введення певним чином не вказує ширину чи висоту карти, ви можете прийняти додаткові аргументи для цього (ви повинні чітко вказати це у своїй відповіді). Ви можете змішувати аргументи командного рядка та стандартний ввід, якщо він вам підходить (наприклад, карта зі stdin, мінімальна ймовірність успіху від argv). Нижче наведено приклад дійсних та недійсних карт.
Дійсний:
o
|
Дійсний:
# #
! o #
! | #
#########
Недійсний (без втечі):
# #
! #
! #
#########
Недійсний (втеча завжди починає стояти):
# #
! #
! % #
#########
Недійсний (недійсний символ):
# #
! ~ #
! #
#########
Недійсний (не прямокутник / рядки різної довжини):
# #
! o #
! | #
#########
Ви можете вважати, що ваше введення дійсне (мені байдуже, що робить ваша програма, якщо вона введена недійсною).
Вихід
Вихід - текст (ASCII). Може бути повернуто у вигляді рядка або надруковано до стандартного виводу. План повинен бути розмежований LF, CRLF або LFCR. Аналогічно, після необхідних зусиль повинен бути ще один НЧ, КНР або ЛФР. Розрив кінцевої лінії необов’язковий.
Ви повинні створити оптимальний план разом із необхідними зусиллями, або "Надії немає!" якщо такого плану не існує. Вам не потрібно виводити ймовірність успіху. Цей текст може мати або не мати розриву кінцевої лінії.
Оптимальний план визначається як план (див. Вище), що вимагає мінімальних зусиль з принаймні заданою ймовірністю успіху. Зауважте, що ваші обчислення ймовірності повинні бути точними, ви можете не вважати, що плаваюча точка досить хороша (саме тому я не очікую, що ви їх виведете). Я спробую розробити тестові випадки, щоб це справедливо перевірити (якщо ви передаєте їх і не робите жодних припущень, то ви можете вважати ваше подання дійсним).
Формат:
Required Effort: <effort>
<plan>
Наприклад, для введення
50
# #
! o #
! | #
#########
Відповідним результатом буде:
Required Effort: 23
Step Left
Step Left
Step Left
Kick Left
Punch Left
Step Left
Step Left
Step Left
Step Left
Імовірність успіху тут становить 76,5%.
Для тієї ж карти, але мінімальною вірогідністю успіху 80%, вам доведеться "Покладіть спину в неї", що вимагало б більше зусиль, але виконало б критерії ймовірності успіху. Якби мінімальна ймовірність успіху була більшою за 80%, вам потрібно було б подумати трохи важче (або вдаритись, або пробити частину дверей, і переміститись). Якби мінімальна ймовірність успіху була 100%, вам доведеться роздрукувати "Надії немає!"
Приклади
Можливо, що для введення є кілька дійсних планів, виводити їх не потрібно саме так, але він повинен докладати правильні необхідні зусилля та бути дійсним планом. Ви можете скористатися верифікатором для перевірки своїх рішень (див. Нижче)
Вхід:
100
o
|
Вихід:
Required Effort: 0
Drop
Вхід:
5
# = #
# = !
# = ! ! !
# =#######
# = #
# = o #
# = ! | #
##########
Вихід:
Required Effort: 57
Step Left
Kick Left
Step Left
Step Left
Step Left
Climb Up
Climb Up
Climb Up
Climb Up
Climb off Right
High Jump Right
Long Jump Right
Step Right
Drop
Kick Right
Crouch
Shuffle Right
Shuffle Right
Вхід:
60
#########
# ! # #
! ! ! o #
! # ! | #
#########
Вихід:
Required Effort: 58
Step Left
Kick Left
Crouch
Shuffle Left
Shuffle Left
Stand
Punch Left
Clamber Up Left
Shuffle Left
Drop (Stand)
Kick Left
Crouch
Shuffle Left
Shuffle Left
Для тієї ж карти, але на 80%, вихід повинен бути:
There is no hope!
Для тієї ж карти, але 50%, необхідні зусилля стають 56 з іншим планом)
Вхід:
50
#######################
# # = #
! # = !
# # = #
###### #####!## =### #
#= ## # = #
#=############# = #
#= = #
#= o = #
#!!| = #
#######################
Вихід:
Required Effort: 121
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Climb Up
Climb Up
Climb Up
Climb Up
Climb Up
Climb Up
Climb off Right
Long Jump Left
Step Left
Step Left
Stamp
Drop
Drop
Crouch
Shuffle Left
Shuffle Left
Shuffle Left
Shuffle Left
Shuffle Left
Shuffle Left
Stand
Clamber Up Left
Stand
Clamber Up Left
Stand
Step Left
Step Left
Step Left
Step Left
Punch Left
Clamber Up Left
Shuffle Left
Вхід:
66
######
# ###
#o ! !
#| ! !
### ##
######
Вихід:
Required Effort: 37
Step Right
Put your back into it! Right
Kick Right
Crouch
Shuffle Right
Shuffle Right
Вхід:
Цей пристрій призначений для перевірки кількості помилкових припущень, до яких можна стати жертвою, і, отже, може виглядати трохи дивно
30
###################
# ## # # # # = #
! ## # # # = #
# # # = #
## ############= #
# ## # #= #
# = # #= #
! = # #= #
# = # #= #
#o= ! ==#
#|= ! =#
#!= # ==########==#
# # ! !! =#
# # !! ! = #
# # !!!!#########
# # # #
# # # #
###################
Вихід з обмеженням шансу на успіх 30:
Required Effort: 199
Long Jump Right
Put your back into it! Right
<snip>
Вихід з обмеженням шансу на успіх 32:
Required Effort: 200
Long Jump Right
Punch Right
<snip>
Використовуючи карту вгорі в якості вхідного даних, з ймовірністю обмеження успіху 1%, ви повинні отримати Необхідні зусилля 116 (шанс на успіх ~ 32%, для запуску в моїй тестовій програмі було потрібно 20 секунд).
Критерії перемоги
Це код-гольф, можливо найкоротший код виграє.
Щоб мати право, ваша функція або програма повинні працювати і мати можливість вирішувати кожну з перерахованих вище тестів протягом менше 30 хвилин на розумній машині. Мій вирішувач робить їх кожен за 30 секунд. Якщо тестовий сценарій (нижче) працює менше 30 хвилин, ви, звичайно, готові йти.
Приклад Solver, Verifier, Test Script і TestCases (з рішеннями)
Код C # для рішення та перевірки рішення доступний тут як суть . Також міститься суть file.txt
, яка є машиночитаною (достатньою) формою описаних вище дій та необхідна для виконання програми. Будь-яке розбіжність між цим файлом та специфікацією не є навмисним.
Суть також містить ряд тестових випадків (включаючи всі наведені вище приклади) та сценарій PowerShell для автоматичного запуску подання проти них. Якщо сценарій повідомляє, що певний тест не вдався, ви можете запустити, OfficeEscapeSolver.exe testcase<n>.txt outputFromYourProgram.txt
щоб переглянути докладніші відомості. Приклади рішень для цих тестових випадків є в іншій суті .
Весь код є повним безладом (хоч і без вогків), але вам не потрібно відхилятися від static void Main(...)
зміни обсягу випуску (не соромтесь використовувати цю інформацію, я надав її на вашу користь!).
Проходження тестового випадку не обов'язково означає, що ваш результат добре сформований, оскільки сценарій та перевіряючий пристрій дуже щедрі. Висновок повинен відповідати вищевказаній специфікації, щоб ваше подання було дійсним.
Якщо ви думаєте, що ви знайшли помилку з розв’язувачем чи тестовим сценарієм, помилкою чи тестовою випискою file.txt
, то, будь ласка, прокоментуйте цей пост або іншим чином надішліть мені повідомлення в SE Chat; Я, мабуть, не помітив жодної іншої спроби спілкування.
Я не надаю тестовий сценарій у Bash або Batch, тому що я їх не знаю, але я радий включити переклад і напишу версію C #, якщо люди хочуть її.
Пост Амбл
Є питання? Не зволікайте, запитайте їх сьогодні!
Це завдання має на меті вимагати зусиль , дати серйозним гольфістам щось, у що зануриться.
Дякую ais523 за відгуки про вхід / вихід.
Я можу надати більше тестів у файлі суті, якщо люди хочуть більше (не хочу, щоб ця публікація більше не ставала) або хочуть надати деякі свої.