Чи вода в кінцевому підсумку досягає бака?


30

У мистецькому світі ASCII є вода, хеш-стіни та буквені механізми.

Ви знаходитесь в кімнаті, що складається з хеш-стін ( #знаків):

#######
#     #
#     #
#     #
# ### #
#     #
#######

Ви встановлюєте джерело води S ( Sзнак) та резервуар для води E ( Eзнак), який може отримувати воду з будь-якого напрямку, але у вас є лише один джерело S та один резервуар E.

#######
#  S  #
#     #
#     #
# ### #
#  E  #
#######

Тож вам доведеться розумно вибрати, де розмістити джерело. Ось де ви витягуєте свої навички .

Завдання

Ви отримуєте вхід, що складається з рядка, що представляє приміщення з джерелом і резервуаром:

#######
#  S  #
#     #
#     #
# ### #
#  E  #
#######

Ви повинні з'ясувати, чи вода в кінцевому підсумку потрапляє в бак. Вода тече вниз, якщо це можливо, ще вліво і вправо, якщо це можливо. Вода не накопичується, тому що не піднімається.

Отже, для вищевказаного вводу результат:

#######
#  *  #
#  *  #
#*****#
#*###*#
#**O**#
#######

Вода щасливо доходить до резервуару, тому ви повинні виводити назовні значення.

Але якщо вода не потрапить до бака:

#######
#S    #
#     #
#  E  #
# ### #
#     #
#######

#######
#*    #
#*    #
#* X  #
#*### #
#*****#
#######

Тоді ви повинні вивести помилкове значення.

Напишіть програму, щоб вирішити, чи вода в кінцевому підсумку потрапляє в бак. Ваш код повинен бути якомога коротшим.

Припущення

  • Припустимо, що вхід завжди дійсний (вся кімната - це вкладена прямокутна область із S та E).

  • Припустимо, що в якості входу передбачено лише одне приміщення.

Випробування

Ваша програма повинна повернути триєдине значення для таких тестових випадків:

#######
#  S  #
#     #
#     #
# ### #
#  E  #
#######

#######
#  S  #
#     #
#  E  #
#     #
#     #
#######

#######
#     #
#     #
# SE  #
# ### #
#     #
#######

###############################################
#                      S                      #
#                                             #
#                                             #
#                                             #
#               ###############               #
#                                             #
#  ##################     ##################  #
#                                             #
#                                             #
#                    #####                    #
#                      E                      #
###############################################

#######
#  S  #
#     #
#     #
# ### #
#   # #
### ###
## E ##
#     #
#######

Але хибне значення для наступних тестових випадків:

#######
#S    #
#     #
#  E  #
# ### #
#     #
#######

#######
#     #
# SE  #
#     #
#     #
#     #
#######

#######
#     #
#  E  #
#     #
#  S  #
#     #
#######

####################################
#                                  #
#                                  #
#                                  #
#S             #                  E#
####################################

Другу до останньої кімнати в категорії «Правда» та останню кімнату в категорії «Хибні» було безсоромно викрадено позиками у Koth: Jump and Run by Manu (який видалив посаду з пісочниці).

Остання кімната в категорії «Правда» - це відповідь Мартіна Баттнера в «Retina» .


Примітка: Я видалив свою публікацію з пісочного одягу KOTH, ваше завдання виглядає набагато краще :)
CommonGuy

Чи не буде накопичена вода, поки вона не заповнить жодне приміщення? Таким чином, вода завжди потрапляє до резервуара, якщо і лише в тому випадку, якщо вони знаходяться в одному приміщенні.
Боб

1
Порада щодо форматування тестових випадків у справжніх / помилкових викликах (або класифікаційних викликах з кількома класами): групуйте тестові випадки за результатами та розділіть групи, щоб ви могли уникнути from / to/ дійсно бітів (що полегшує учасникам обробку всіх тестів справи одразу).
Мартін Ендер

1
Отже, в основному логіка потоку рідини Minecraft. Хоча в Minecraft я думаю, що третій у ваших справжніх тестових випадках повернеться помилковим, оскільки вода піде лише вліво.
Патрік Робертс

1
Нагадує про фізику падіння піщаної води.
користувач253751

Відповіді:


15

Равлики , 20 байт

\S{d(=\#n)?^#},!(t\E

Друк 0для значення falsey і 1для значення truthy.

Спробуйте в Інтернеті!

  • \Sматчі Sна старті
  • d задає напрямок вниз
  • {...}, відповідає вмісту в дужках 0 або більше разів
  • =\#це твердження, яке досягає успіху, якщо #перед равликом стоїть знак , але не рухає його
  • n обертається на 90 градусів в будь-якому напрямку
  • (...)? відповідає узор в дужках 0 або 1 раз
  • \ ​ відповідає пробілу і переміщує равлика на нього
  • !(... є негативним твердженням
  • t телепортується до будь-якого незрівняного квадрата в сітці
  • \E сірники E

Я не хочу складати цю мову самостійно. Чи є для цього інтернет-перекладач?
user48538

@ zyabin101 Ні, немає онлайн-перекладача.
feersum

Гаразд, час зателефонувати Деннісу. : P Де мій проектор?
user48538

5
i.imgur.com/dvWrAwP.png Я зробив це сам.
user48538

Ну, я спробував , але він друкує 0 для всіх тестових випадків, але один для мене. Що я роблю неправильно?
Денніс

11

Ковзання , 20 + 2 = 22 байти

S>( ^4|^4(?|`#)^T)*E

Тож Сліп як і раніше зламаний, але колись це було справді викликом. Насправді він ніколи не був розроблений таким гольфістом, тому він ніколи не бив Равликів нічим: P

Потрібно, щоб rпрапор (немає повторюваних комірок) припинявся.

Спробуйте в Інтернеті . Вихід - це шлях, який береться за правду, порожній для помилки.

S                 Match S
>                 Rotate pointer downward
(                 Either...
 <space>^4          Match a space and point downwards
 |                  or
 ^4                 Point downwards
 (?|`#)             Match # below then reset pointer
 ^T                 Either turn left or right
)*                ... 0+ times
E                 Match E

6

Сітківка , 87 байт

Кількість байтів передбачає кодування ISO 8859-1.

+mT`E `S`(?<=^(?(1)!)(?<-1>.)*S.*¶(.)*)[E ]|.?S(?=(.)*¶.*#(?<-2>.)*(?(2)!)$)[E ]?
M`E
0

Спробуйте в Інтернеті!

Наскільки можлива обробка 2D-рядків у Retina (або .NET регулярний вираз), це не зовсім стисло ...

Пояснення

+mT`E `S`(?<=^(?(1)!)(?<-1>.)*S.*¶(.)*)[E ]|.?S(?=(.)*¶.*#(?<-2>.)*(?(2)!)$)[E ]?

Це заливна заливка, яка позначає всі клітини, до яких потрапляє вода S. Вона робить це шляхом зіставлення символів , які можуть бути досягнуті , а потім транслітерації їх Sз T-mode. Ця заливна заливка проходить через обидва простори та E. На +початку це повторюється, поки вихід не перестане змінюватися.

Що стосується фактичного регулярного виразу, то він містить два окремих випадки:

(?<=^(?(1)!)(?<-1>.)*S.*¶(.)*)[E ]

Це збігається з пробілом або Eсаме на одну клітинку нижче S. Вертикальне узгодження проводиться шляхом підрахунку префікса в поточному рядку за допомогою балансуючих груп, щоб ми могли переконатися, що горизонтальне положення однакове. Цей дбає про падіння води.

.?S(?=(.)*¶.*#(?<-2>.)*(?(2)!)$)[E ]?

Це дуже схоже: воно відповідає Sсимволу і, якщо є, до і після нього, за умови, що персонаж безпосередньо під знаком " Sa" #. Це дбає про поширення води по землі.

Коли ми закінчимо, дуже легко визначити, чи досягла вода E. Якщо так, то Eвін був видалений із рядка в заливці, а якщо ні, то Eвсе ще є. Тож давайте порахуємо кількість Es:

M`E

Але тепер це 0(що я вважаю фальшивим) для пробних справ і 1(що я вважаю бідним) для фальшивих тестових випадків. Ми можемо перетворити це дуже легко, підрахувавши кількість 0s в цьому результаті:

0

Зроблено.


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