Чи захищена моя в'язниця?


58

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

Вхідні дані

Вхідні дані можуть бути в будь-якому зручному форматі , такі як рядок, масив, масив масивів і т.д. Вхідний буде складатися з трьох символів, в даному випадку #, Pі в просторі. Вхід не обов'язково містить усі три символи.

  • #: Стіна
  • P: В’язень
  • простір: порожній простір

Приклад введення виглядатиме так:

#####
#   #
# P #
#   #
#####

Вихід

Достовірне значення / фальси, незалежно від того, захищена в'язниця чи ні. В'язниця безпечна лише в тому випадку, якщо в ній можуть утримуватися всі в’язні. Якщо будь-який в'язень може втекти, це не безпечно.

В'язень може втекти, якщо їх повністю не закрити стіною. Діагональне з'єднання повністю укладено.

Тестові кейси

############# Truthy
# P #  P#   #
#   #   # P #
#############

############# Truthy
# P    P    #
#   #   # P #
#############

############# Falsey
# P #  P#   #
#   #   # P #
########## ##

####          Truthy
#   #
 #   #
  # P ####
  ####

P             Falsey

###           Falsey
# #
# #
### P

8
У мене таке відчуття, що це дублікат або хоча б подібний виклик. Гарний виклик у будь-якому випадку.
Джон Дворак

2
@JanDvorak Можливо, але за умови мого обмеженого Google Fu я не міг знайти дубліката.
TheLethalCoder

2
споріднені (заповнення 2D сітки)
Esolanging Fruit

3
Було б добре мати приклади Фальсі, де для втечі потрібно як горизонтальний, так і вертикальний рух.
xnor

2
@tfbninja Насправді не дублікат. Той просить спробувати програму екстраполювати з даних, щоб визначити, чи є слово у вікні. Це заливка BFS, щоб побачити, чи є незамкнені пробіли, що містять позначені значення.
HyperNeutrino

Відповіді:


54

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

!(t\P(o\ ),o~

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

Відбитки 0для небезпечних в'язниць та розмір обмежувальної коробки для вхідних в'язниць.

Ідея полягає у тому, щоб ми не змогли знайти шлях від Pклітини a до поза межами ( ~), що рухається лише ортогонально ( o) через пробіли. Це tтелепорт, так що незалежно від того, де ми намагаємося відповідати, він намагається знайти всі можливі стартові позиції P.


23
Правильний інструмент.
Джонатан Аллан

16

C # (.NET Core) , 485 480 474 470 421 408 байт

Абсолютно неправильний інструмент та підхід, але тим не менше ...

  • 7 байт (і більше) збережені корисними порадами від TheLethalCoder.
  • 4 байти збережено, повернувши ціле число.
  • Ще 4 байта врятовані завдяки (ще раз) , щоб TheLethalCoder шляхом заміни ' 'з 32в порівняннях.
  • Багато байтів, збережених шляхом рефакторингу коду.
  • Ще 13 байт завдяки (вгадайте, хто?) TheLethalCoder. :) Я постійно забуваю його поради, і він продовжує нагадувати мені про них.
m=>{var p='P';int a=m.Length,b=m[0].Length,i=0,j,x,y;var c=new System.Collections.Stack();for(;i<a;i++)for(j=0;j<b;j++)if(m[i][j]==p)c.Push(new[]{i,j});while(c.Count>0){var t=(int[])c.Pop();x=t[0];y=t[1];if(x<1|x>a-2|y<1|y>b-2)return 0;foreach(var v in new[]{-1,1}){var z=x>0&x<a-1&y>0&y<b-1;if(z&m[x+v][y]==32){m[x][y]=p;c.Push(new[]{x+v,y});}if(z&m[x][y+v]==32){m[x][y]=p;c.Push(new[]{x,y+v});}}}return 1;}

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

В основному я розширюю позиції P, коли є пробіл навколо, поки він не досягне (або не буде) межі макета.

Деякі ліцензії:

  • Я використовую a char[][]як вхід для макета.
  • Повертається 0як незахищений та 1безпечний.

Ви не можете взяти додатковий вхід до функції, щоб ви могли припустити розміри ... Якщо ви не знайдете мета-пост, щоб переконати мене в іншому.
TheLethalCoder

1>0і 1<0коротші за trueта false.
TheLethalCoder

1
Може ==0стати <1? У вас є щонайменше 1 байт неактуального пробілу. Чи можете ви видалити new[]s? (Не завжди працює, але іноді так подобається int[] n = {1,2,3};).
TheLethalCoder

1
{m[x][y]= p; c.Push(new[]->{m[x][y]=p;c.Push(new[]
TheLethalCoder

1
Ви можете порівняти charз до intS , так що я вірю , що можна замінити ==' 'на , ==32щоб зберегти байти. Ви повинні бути в змозі зробити це і на подібних порівняннях.
TheLethalCoder

15

Perl 5 , 69 байт

-10 байт завдяки @Grimy .

-2 байти завдяки @Neil .

77 байт коду + -p0прапори.

/
/;$_=s/(P| )(.{@{-}})?(?!\1)(?1)/P$2P/s?redo:!/\A.*P|P.*\Z|^P|P$/m

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

Деякі короткі пояснення:
Ідея полягає у тому, щоб розмістити Pвсюди, куди в'язні можуть їхати. Якщо хтось Pзнаходиться на першому / останньому рядку або першому / останньому стовпчику, то ув'язнені можуть туди й туди втекти, що означає, що в'язниця не захищена.
s/(P| )(.{@{-}})?(?!\1)(?1)/P$2P/sзамінює пробіл праворуч або внизу a Pз a Pабо пробіл зліва або вгорі а P.
Нарешті, /\A.*P|P.*\Z|^P|P$/mперевіряє, чи починається чи закінчується рядок з a P, чи є Pна першому чи останньому рядку.


класний підхід з використанням регулярних виразів! (але, напевно, ДУЖЕ дорого, коли простір зростає)
Олів'є Дулак

На насправді, це не так, що неефективно. Зокрема, для цього не потрібно багато зворотних трекінгів, їх немає *або +, найдовший збіг, який він може зробити, - це розмір рядка ... Тепер, звичайно, якщо ви порівняєте з підходом більш посібник, наприклад, на основі масивів, наприклад , то так, це зовсім неефективно!
Дада

1
-6 байт шляхом злиття двох замін: s/P(.{@{-}})? | (.{@{-}})?P/P$1$2P/s.
Grimmy

1
-2 байта по іграх в гольфі злитої заміни: s/(P| )(.{@{-}})?(?!\1)(?1)/P$2P/s.
Grimmy

2
@Grimy дуже приємний гольф від регулярного вигулу! Дякую :)
Дада

7

JavaScript (ES6), 134 133 байт

Вводить введення як масив масивів символів. Повертається 0(небезпечно) або 1(безпечно).

f=a=>a.map((r,y)=>r.map((c,x)=>c>'O'&&[-1,1,0,0].map((X,i)=>(R=a[y+1-'1102'[i]])&&R[X+=x]?R[X]<'!'?R[o=2,X]=c:0:o=0)),o=1)|o&2?f(a):o

Тестові кейси


Чи може &&просто бути &?
TheLethalCoder

@TheLethalCoder Не перший, але другий може бути замінений на |. Дякую!
Арнольд

Не знав, що оператор розповсюдження працює над рядками. Класно!
аебабіс

6

JavaScript (ES6), 121 байт

f=s=>s==(s=s.replace(eval('/( |P)([^]{'+s.search`
`+'})?(?!\\1)[ P]/'),'P$2P'))?!/^.*P|P.*$/.test(s)&!/^P|P$/m.test(s):f(s)

Вводиться в якості прямокутного рядка з обмеженим рядком. Повертає 0 для небезпечних та 1 для безпечних. Виходячи з моєї відповіді на " Виявити невдалих замків" , хоча було б ефективніше перевіряти в'язня, що втік, на кожному кроці, а не після того, як вони закінчили вивчення в'язниці.



2

APL (Dyalog Classic) , 40 байт

{⊃2≠(××{1⊃⌈/⍵,⍉⍵}⌺3 3)⍣≡(⌽1,⍉)⍣4'# '⍳⍵}

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

'# '⍳⍵кодувати '#', ' ', 'P'як 0 1 2

(⌽1,⍉)⍣4 оточити з 1s

(××{1⊃⌈/⍵,⍉⍵}⌺3 3)⍣≡ максимум сусідів заповнюють ненульові комірки

⊃2≠ у нас немає 2 у верхньому лівому куті?


1

Stax , 35 байт CP437

ä¬my■╡╤▲l@┤êr*⌠\¶ƒläå─▄¶√¿ [Uy⌠Só4↔

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

Безумовно, мова про гольф без внутрішньої справи для пошуку шляху також може це зробити!

Пояснення

Використовує розпакований формат для пояснення.

zLz]Y+Mys+y+{{{" P|P ""PP"Rm}Y!My!Mgphh' =
zLz]Y+Mys+y+                                  Surround the original matrix with four borders of whitespaces
            {                      gp         Iterate until a fixed point is found, return the single fixed point
             {              }Y!               Store the block in register Y and execute it
              {" P|P ""PP"Rm                  For each row, flood every space adjacent to a P with P.
                               My!            Transpose the matrix and do the flooding again
                                     hh' =    The final matrix has a space on the upper left corner that has not been flooded by P 

1

SmileBASIC, 154 146 байт

Я сподівався, що відповідь із використанням заливної заливки буде коротшою за цю.

DEF S P
FOR J=0TO 1X=1Y=1FOR I=0TO LEN(P)-1GPSET X,Y,-(P[I]=="#")GPAINT X,Y,-1,-J*(P[I]>@A)X=X*(P[I]>"31")+1INC Y,X<2NEXT
NEXT?!GSPOIT(0,0)GCLS
END

Замініть 31відповідним символом ASCII.

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