Я встигну розібратися вчасно?


37

Натхненний цим .

Фон

Злий фермер вирішив спалити своє пшеничне поле вниз, щоб під'їхати ціни. Щоб забезпечити повне знищення, він також намочив ваше поле в бензині. Ще більше, на жаль, вам трапилось гуляти по полю, коли воно було запалене вогнем, і ви повинні швидко вийти, щоб вижити.

Виклик

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

Поле складається з пшениці (тут представлена .) і вогню ( F). Тут ваше місцеположення позначено символом " O. Наприклад:

...F...F
F.......
........
.F......
....O...
...F....
........
.F....F.

Щосекунди ви переходите до будь-якої сусідньої комірки (але не по діагоналі), і кожен вогонь поширюється на кожну сусідню клітинку. Якщо ви не зможете переїхати до осередку, який не підпалить, ви загинете. Якщо ви зробите це з поля, ви виживаєте. Давайте подивимося, що відбувається в цьому прикладі:

...F...F
F.......
........
.F......
....O...
...F....
........
.F....F.

..FFF.FF
FF.F...F
FF......
FFF.....
.F.F.O..
..FFF...
.F.F..F.
FFF..FFF

FFFFFFFF
FFFFF.FF
FFFF...F
FFFF....
FF.FF.O.
.FFFFFF.
FFFFFFFF
FFFFFFFF

FFFFFFFF
FFFFFFFF
FFFFF.FF
FFFFF.FF
FFFFFFFO
FFFFFFFF
FFFFFFFF
FFFFFFFF

FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFFO <-- you made it out and survived, barely
FFFFFFFF
FFFFFFFF
FFFFFFFF

Правила

  • Ваше введення - поле у ​​вигляді сітки. Ви можете вибрати будь-який формат введення, включаючи рядок з роздільниками рядків або 2D масив.
    • Ви не можете брати для введення місця для пожежі та / або себе.
    • Ви можете використовувати будь-які 3 різних значення, як пшениця, вогонь та ваше положення, включаючи не рядки для введення масиву.
    • Поля завжди розміром не менше 1х1, прямокутні та не містять недійсних символів.
    • Будь-яке поле буде містити саме одне значення, яке відображає ваше місцезнаходження, і будь-яка інша позиція може бути, а може і не бути пожежею.
  • Ваш вихід є одним із двох відмінних значень для "виживаєш" або "ти вмираєш", як зазвичай у .
  • Діють стандартні правила .

Тестові справи

Вижили

O
....
.O..
....
FFFFF
.....
..O..
.....
FFFF
FFFO
FFFF
.F....
......
......
.F....
..O...
.FF...
.F....
..FF..
...F...F
F.......
........
.F......
....O...
...F....
........
.F....F.

Не вижили

FFF
FOF
FFF
F.F
.O.
F.F
....F
.....
..O..
.....
F....
.F....F.
........
........
F..O....
........
.....F..
...F...F
F......F
........
.F......
....O...
...F....
........
.F....F.
F..F
.O..
FF..

2
Я не бачу, чому хтось зголосився
Олівер Ні

3
Обом поточним людям, будь ласка, поясніть, чому мій виклик поганий.
PurkkaKoodari

6
@DeadPossum Оскільки я відчуваю, що це надто спростить виклик і зробить його трохи занадто широким. Однак не соромтеся погодитися; якщо інші згодні з вами, я можу змінити обмеження.
PurkkaKoodari

2
Я погоджуюся з Pietu1998, я також вважаю, що обмеження дуже доречне.
Містер Xcoder

2
@LuisMendo Якщо є можливість втекти, коли фермер повертається, йому завжди можна втекти прямолінійно. Наприклад, скажімо, фермер намагається втекти праворуч від поля. Коли фермер перемістить один простір вниз, якийсь вогонь пошириться вниз; то ситуація фермера така ж, як і вихідна позиція (плюс ще вогонь).
JungHwan Min

Відповіді:


28

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

\Oo!{.,fee7.,\F

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

1означає виживання, а 0означає смерть.

Оскільки пожежу неможливо розігнати, намагатися її обійти ніколи не корисно. Найкращий маршрут - це завжди пряма лінія. Тож існує лише чотири можливі варіанти маршруту втечі. Щоб визначити, чи безпечний напрямок, ми перевіряємо, чи є Fв конусі "вогневий конус", що вказує в цьому напрямку.


1
O_o Чи можете ви надати посилання для тестування? Це здається дуже коротким.
Містер Xcoder

10
Код майже говорить: "Ой!" ... "феу" ...
Чарівний восьминіг Урн

26
Тому що равлики - ідеальний вибір для, ви знаєте,
розгорання

6
@feersum У посиланні "спробуйте в Інтернеті" я спробував наступне 3-рядкове пшеничне поле, яке має бути смертю, але програма думає, що ви можете його пережити: "F..F", ".O ..", " FF .. "
Ксантікс


12

Python 2 , 283 218 209 208 байт

lambda F:f(F)&f(F[::-1])
def f(F):l=F.split();w=len(l[0])+1;i=F.index('O');x,y=i/w,i%w;r=range(len(l));return all('F'in''.join(n)for n in[[l[i][x+abs(i-y):]for i in r],[l[i][max(0,y+x-i):i+x-y+1]for i in r]])

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

Приймає введення як розділений рядок для нових рядків і повертає True/FalseдляDead/Alive

Працює, перевіряючи кожен напрямок (udlr) на Fire у, дивлячись назовні:

Приклад:

Вхід:

FFFFF
.....
..O..
.....

Протипожежні перевірки:

Up:       Down:     Left:     Right:

FFFFF               F             F
 ...                ..           ..
  O         O       ..O         O..
           ...      ..           ..

Якщо всі вказівки містять вогонь, ви гинете, інакше відбувається втеча.

Редагувати: повернутися до взяття рядка як вхідного даних, і тепер перевіряє лише вгору / вправо, але також перевіряє вхід назад (даючи вниз / вліво)

Зберегли багато байтів завдяки містеру Xcoder та Феліпе Нарді Батісті


@FelipeNardiBatista дякую :)
TFeld


2

JavaScript, 174 байти

a=>+(t=>g=a=>t--?g(a.map((l,y)=>l.map((c,x)=>(h=v=>[(a[y-1]||[])[x],(a[y+1]||[])[x],a[y][x+1],a[y][x-1],c].includes(v),!c&&h()?p=1:[2,0,1].find(h))))):p)((p=a+'!').length)(a)

Формат введення:

  • Масив масиву цілих чисел
  • 2 за F, 1 за ., 0 заO

Вихід:

  • Ціннісне значення (1) для виживання
  • Помилкове значення (NaN) для штампу

Спробуй це:

Розглянемо стільниковий автомат. Існують 3 стани для клітини O(доступної людям), F(вистрілення), .(нічого просто не сталося). Правило створення наступного покоління:

for each cell:
  me and my 4 neighborhoods,
    if anyone is `F` then result is `F`,
    otherwise, if anyone is `O` then result is `O`
    otherwise, keep state `.`

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

// check for all neighbors:
h=v=>[(a[y-1]||[])[x],(a[y+1]||[])[x],a[y][x+1],a[y][x-1],c].includes(v)
// if me == 'O' and i'm edge (neighbors contain _undefined_), then survive
!c&&h()?p=1
// Otherwise apply the given rule
:[2,0,1].find(h)

2

Октава, 71 байт

@(a)(A=blkdiag(0,a,0))<3||any((bwdist(A>2,'ci')>bwdist(A==2,'ci'))(!A))

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

або

Перевірте всі тестові випадки!

Формат введення:

  • 2D масив цілих чисел
  • 1за ., 2за Oі 3заF

Вихід:

  • true і false

Пояснення:

Пояснення:

A=blkdiag(0,a,0)    % add a boundary of 0s around the array
A<3                 % return truthy when there is no fire
bwdist(A>2,'ci')    % city block distance transform of binary map of fire
bwdist(A==2,'ci')   % city block distance transform of binary map of your location
any(...)(!A)        % check if there is at least one element on the boundary of 
                    % the fire distance map has its distance greater than 
                    % that of distance map of your location

1

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

^.*O(.|¶)*|(.|¶)*O.*$|(.|¶)*(¶O|O¶)(.|¶)*
O
m`^((.)*) (.*¶(?<-2>.)*(?(2)(?!))O)
$1#$3
m`^((.)*O.*¶(?<-2>.)*(?(2)(?!))) 
$1#
T`p`\O`#| ?O ?
+m`^((.)*)[O ](.*¶(?<-2>.)*(?(2)(?!))F)
$1#$3
+m`^((.)*F.*¶(?<-2>.)*(?(2)(?!)))[O ]
$1#
}T`p`F`#|.?F.?
O

Спробуйте в Інтернеті! Потрібно, щоб фоном були пробіли, а не .s (або може бути використаний інший символ, безпечний для регулярних виразів). Пояснення:

^.*O(.|¶)*|(.|¶)*O.*$|(.|¶)*(¶O|O¶)(.|¶)*
O

Якщо Oна будь-якому краю є, видаліть усе інше (випадок виживання)

m`^((.)*) (.*¶(?<-2>.)*(?(2)(?!))O)
$1#$3

Розташуйте а #в будь-якому просторі над існуючим O.

m`^((.)*O.*¶(?<-2>.)*(?(2)(?!))) 
$1#

І #в будь-якому просторі нижче існуючого O.

T`p`\O`#| ?O ?

Змініть #s на Os, а також будь-який пробіл зліва або справа від існуючого O.

+m`^((.)*)[O ](.*¶(?<-2>.)*(?(2)(?!))F)
$1#$3

Розмістіть #s над будь-якими існуючими Fs. Вони можуть замінювати і Os, і пробіли.

+m`^((.)*F.*¶(?<-2>.)*(?(2)(?!)))[O ]
$1#

Розташуйте #s під будь-якими існуючими Fs, також заміняючи Os, а також пробіли.

}T`p`F`#|.?F.?

Змініть #s на Fs, а також будь-яке Oабо пробіл зліва або справа від існуючого F. Повторюйте, поки Fs не споживають усе.

O

Поверніться 1до виживання, 0якщо ні.

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