Apakah saya bisa keluar tepat waktu?

37

Terinspirasi oleh ini .

Latar Belakang

The petani jahat telah memutuskan untuk membakar ladang gandum Anda ke bawah untuk menaikkan harga. Untuk memastikan kehancuran total, ia juga merendam ladang Anda dengan bensin. Yang lebih sialnya, Anda kebetulan berjalan di lapangan saat dinyalakan, dan Anda harus keluar dengan cepat untuk bertahan hidup.

Tantangan

Mengingat ladang yang berisi gandum, api, dan lokasi Anda, tentukan apakah Anda bisa keluar dari ladang tepat waktu.

Ladang terdiri dari gandum (diwakili oleh .) dan api ( F). Di sini lokasi Anda ditandai dengan a O. Sebagai contoh:

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

Setiap detik Anda pindah ke sel yang berdekatan (tetapi tidak secara diagonal), dan setiap api menyebar ke setiap sel yang berdekatan. Jika Anda tidak bisa pindah ke sel yang tidak akan terbakar, Anda mati. Jika Anda berhasil keluar dari lapangan, Anda bertahan hidup. Mari kita lihat apa yang terjadi dalam contoh ini:

...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

Aturan

  • Input Anda adalah bidang sebagai kisi. Anda dapat memilih format input apa pun, termasuk string dengan pemisah garis atau array 2D.
    • Anda tidak boleh memasukkan lokasi untuk kebakaran dan / atau diri Anda sebagai masukan.
    • Anda dapat menggunakan 3 nilai berbeda seperti gandum, api, dan posisi Anda, termasuk non-string untuk input array.
    • Bidang selalu berukuran setidaknya 1x1, persegi panjang dan tidak mengandung karakter yang tidak valid.
    • Setiap bidang akan berisi persis salah satu nilai yang mewakili lokasi Anda, dan setiap posisi lainnya mungkin atau mungkin tidak terbakar.
  • Keluaran Anda adalah salah satu dari dua nilai berbeda untuk "Anda bertahan hidup" atau "Anda mati", seperti biasa dalam .
  • Aturan standar berlaku.

Uji kasus

Selamat

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

Tidak bertahan

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
sumber
2
Saya tidak mengerti mengapa seseorang diturunkan suara
Oliver Ni
3
Untuk kedua downvoters, tolong jelaskan mengapa tantangan saya buruk.
PurkkaKoodari
6
@DeadPossum Karena saya merasa itu akan menyederhanakan tantangan terlalu banyak dan membuatnya agak terlalu luas. Namun, jangan ragu untuk tidak setuju; jika orang lain setuju dengan Anda, saya mungkin mengubah batasannya.
PurkkaKoodari
2
Saya setuju dengan Pietu1998, saya juga merasa bahwa batasannya sangat tepat.
Tn. Xcoder
2
@LuisMendo Jika memungkinkan untuk melarikan diri ketika petani berbalik, selalu memungkinkan baginya untuk melarikan diri dalam garis lurus. Sebagai contoh, misalkan petani mencoba melarikan diri ke kanan ladang. Ketika petani memindahkan satu ruang ke bawah, api akan menyebar ke bawah; kemudian, situasi petani sama dengan posisi awal (ditambah lebih banyak kebakaran).
JungHwan Min

Jawaban:

28

Siput, 15 byte

\Oo!{.,fee7.,\F

Cobalah online!

1berarti bertahan hidup sementara 0berarti mati.

Karena tidak mungkin untuk berlari lebih cepat dari api, tidak pernah berguna untuk mencoba mengelilinginya. Rute terbaik selalu berupa garis lurus. Jadi hanya ada empat kemungkinan pilihan rute pelarian. Untuk menentukan apakah arah aman, kami memeriksa ada Fdi "kerucut api" yang menunjuk ke arah itu.

feersum
sumber
1
O_o Bisakah Anda memberikan tautan pengujian? Ini sepertinya sangat singkat.
Tn. Xcoder
10
Kode itu hampir mengatakan: "Oy!" ... "Fiuh" ...
Magic Octopus Urn
26
Karena siput adalah pilihan yang sempurna untuk, Anda tahu, kehabisan api ...
Timtech
6
@feersum Di tautan "coba online", saya mencoba ladang gandum 3 baris berikut, yang seharusnya mati, tetapi program tersebut berpikir Anda dapat selamat: "F..F", ".O ..", " FF .. "
Xantix
12

Python 2 , 283 218 209 208 byte

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]])

Cobalah online!

Mengambil input sebagai string yang dipisahkan baris baru, dan kembali True/FalseuntukDead/Alive

Bekerja dengan memeriksa setiap arah (udlr) untuk Fire in dengan melihat ke luar:

Contoh:

Memasukkan:

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

Pemeriksaan kebakaran:

Up:       Down:     Left:     Right:

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

Jika semua arah mengandung api Anda mati, jika tidak ada jalan keluar.

Sunting: Kembali untuk mengambil string sebagai input, dan sekarang hanya memeriksa atas / kanan, tetapi juga memeriksa input ke belakang (menyerah / kiri)

Menyimpan banyak byte berkat Tn. Xcoder dan Felipe Nardi Batista

TFeld
sumber
@FelipeNardiBatista terima kasih :)
TFeld
Mari kita lanjutkan diskusi ini dalam obrolan .
Tn. Xcoder
2

JavaScript, 174 byte

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)

Masukkan format:

  • Array of Array of Integers
  • 2 untuk F, 1 untuk ., 0 untukO

Keluaran:

  • Nilai kebenaran (1) untuk bertahan hidup
  • Nilai palsu (NaN) untuk mati

Cobalah:

Pertimbangkan otomat seluler. Ada 3 status untuk sel O(dapat dijangkau oleh orang-orang), F(tangkapan ditembakkan), .(tidak ada yang terjadi begitu saja). Aturan untuk membuat generasi berikutnya adalah:

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 `.`

Begitu ada sel di tepi memiliki Onegara, orang-orang bertahan hidup. Jika ini tidak terjadi dalam jumlah generasi yang cukup, maka orang-orang mati.

// 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)
tsh
sumber
2

Oktaf, 71 byte

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

Cobalah online!

atau

Verifikasi semua kasus uji!

Masukkan format:

  • 2D array integer
  • 1untuk ., 2untuk Odan 3untukF

Keluaran:

  • true dan false

Penjelasan:

Penjelasan:

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
sumber
1

Retina , 243 byte

^.*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

Cobalah online! Membutuhkan latar belakang menjadi spasi daripada .s (atau karakter regexp-safe lainnya dapat digunakan). Penjelasan:

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

Jika ada Odi tepi manapun, hapus semua yang lain (survival case)

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

Tempatkan #di ruang mana pun di atas yang sudah ada O.

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

Dan #di setiap ruang di bawah yang sudah ada O.

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

Mengubah # s ke Os, dan juga ruang di sebelah kiri atau kanan yang sudah ada O.

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

Tempat # di atas semua yang ada F. Ini dapat menimpa Oruang dan juga s.

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

Tempat # di bawah setiap yang ada F, juga timpa Oserta spasi.

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

Ubah #s ke Fs, dan juga apa sajaO ruang di sebelah kiri atau kanan yang sudah ada F. Ulangi sampai semua Ftelah dikonsumsi.

O

Kembali 1untuk bertahan hidup, 0jika tidak.

Neil
sumber