Я сделаю это вовремя?

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 различных значения, такие как пшеница, огонь и ваша позиция, включая не строки для ввода массива.
    • Поля всегда имеют размер не менее 1x1, прямоугольные и не содержат недопустимых символов.
    • Любое поле будет содержать ровно одно из значений, представляющих ваше местоположение, а любая другая позиция может быть или не быть пожарной.
  • Ваш вывод является одним из двух различных значений «ты выжил» или «ты умрешь», как обычно в .
  • Применяются стандартные правила .

Контрольные примеры

переживший

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..
PurkkaKoodari
источник
2
Я не понимаю, почему кто-то проголосовал
Оливер Ни
3
Обеим пользователям, пожалуйста, объясните, почему мой вызов плохой.
PurkkaKoodari
6
@DeadPossum Потому что я чувствую, что это слишком упростит задачу и сделает ее слишком широкой. Не стесняйтесь не соглашаться, хотя; если другие согласятся с вами, я могу изменить ограничение.
PurkkaKoodari
2
Я согласен с Pietu1998, я также чувствую, что ограничение весьма уместно.
г-н Xcoder
2
@LuisMendo Если возможно убежать, когда фермер поворачивает, он всегда может бежать по прямой линии. Например, скажем, фермер пытается сбежать справа от поля. Когда фермер перемещается на одно пространство вниз, огонь распространяется вниз; тогда ситуация с фермером такая же, как и в исходной позиции (плюс больше огня).
JungHwan Мин.

Ответы:

28

Улитки, 15 байт

\Oo!{.,fee7.,\F

Попробуйте онлайн!

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

Поскольку невозможно обогнать огонь, никогда не стоит пытаться обходить его. Лучший маршрут - это всегда прямая линия. Таким образом, есть только четыре возможных варианта пути эвакуации. Чтобы определить, является ли направление безопасным, мы проверяем наличие F«огненного конуса», указывающего в этом направлении.

feersum
источник
1
О_о Можете ли вы предоставить ссылку для тестирования? Это кажется очень коротким.
Мистер Кскодер
10
Код почти гласит: «Ой!» ... «фу» ...
Волшебная Осьминога Урна
26
Потому что улитки - это идеальный выбор для того, чтобы обогнать огонь ...
Timtech
6
@feersum В ссылке «попробуй онлайн» я попробовал следующее 3-строчное поле пшеницы, которое должно быть смертью, но программа думает, что ты сможешь выжить: «F..F», «.O ..», « FF .. "
Xantix
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) для Fпоиска, глядя наружу:

Пример:

Входные данные:

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

Пожарные проверки:

Up:       Down:     Left:     Right:

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

Если все направления содержат огонь, вы умрете, в противном случае есть выход.

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

Благодаря г-ну Xcoder и Фелипе Нарди Батисте сэкономлено много байтов

TFeld
источник
@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
rahnema1
источник
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. Повторяйте, пока все Fне поглотят.

O

Вернитесь 1на выживание, 0если нет.

Нил
источник