ฉันจะทำให้มันออกมาทันเวลาหรือไม่?


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

2
ฉันไม่เห็นว่าทำไมมีคนลงคะแนน
Oliver Ni

3
สำหรับผู้ลงแข่งขันทั้งสองโปรดอธิบายว่าทำไมความท้าทายของฉันจึงไม่ดี
PurkkaKoodari

6
@DeadPossum เพราะฉันรู้สึกว่ามันจะทำให้การท้าทายง่ายขึ้นมากและทำให้มันกว้างเกินไป แม้ว่าคุณจะไม่เห็นด้วยก็ตาม หากคนอื่นเห็นด้วยกับคุณฉันอาจเปลี่ยนข้อ จำกัด
PurkkaKoodari

2
ฉันเห็นด้วยกับ Pietu1998 ฉันก็รู้สึกว่าข้อ จำกัด มีความเหมาะสมสูง
Mr. Xcoder

2
@ LuisMendo หากเป็นไปได้ที่จะหลบหนีเมื่อชาวนาเลี้ยวจะเป็นไปได้เสมอที่เขา / เธอจะหลบหนีเป็นเส้นตรง ตัวอย่างเช่นสมมติว่าเกษตรกรพยายามหนีไปทางด้านขวาของทุ่ง เมื่อชาวนาเคลื่อนหนึ่งช่องว่างลงบางไฟก็จะกระจายลงไป จากนั้นสถานการณ์ของเกษตรกรจะเหมือนกับตำแหน่งเริ่มต้น (บวกกับไฟเพิ่มเติม)
JungHwan Min

คำตอบ:


28

หอยทาก 15 ไบต์

\Oo!{.,fee7.,\F

ลองออนไลน์!

1หมายถึงการอยู่รอดในขณะที่0หมายถึงความตาย

เนื่องจากเป็นไปไม่ได้ที่จะเอาชนะไฟได้ดังนั้นจึงไม่มีประโยชน์ที่จะลองใช้งานดู เส้นทางที่ดีที่สุดคือเส้นตรงเสมอ ดังนั้นจึงมีเพียงสี่ทางเลือกที่เป็นไปได้ในการหลบหนี เพื่อตรวจสอบว่าทิศทางนั้นปลอดภัยหรือไม่เราจะตรวจสอบหาสิ่งใดFใน "กรวยไฟ" ที่ชี้ไปในทิศทางนั้น


1
O_o คุณสามารถให้ลิงค์ทดสอบหรือไม่ ดูเหมือนจะสั้นมาก
Mr. Xcoder

10
รหัสกำลังจะพูดว่า: "Oy!" ... "phew" ...
Magic Octopus Urn

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

หากทุกทิศทางมีไฟคุณตายมิฉะนั้นจะมีทางหนี

แก้ไข: กลับไปที่การใช้สตริงเป็นอินพุตและตอนนี้ตรวจสอบเฉพาะขึ้น / ขวา แต่ยังตรวจสอบอินพุตย้อนกลับ (ให้ลง / ซ้าย)

บันทึกจำนวนมากต้องขอบคุณMr. XcoderและFelipe Nardi Batista


@FelipeNardiBatista ขอบคุณ :)
TFeld

ขอให้เรายังคงอภิปรายนี้ในการแชท
Mr. Xcoder

2

จาวาสคริปต์, 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)

รูปแบบอินพุต:

  • Array of Array of Integers
  • 2 สำหรับF, 1 สำหรับ., 0 สำหรับO

เอาท์พุท:

  • ค่าความจริง (1) เพื่อความอยู่รอด
  • ค่า Falsy (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))

ลองออนไลน์!

หรือ

ตรวจสอบกรณีทดสอบทั้งหมด!

รูปแบบอินพุต:

  • อาร์เรย์จำนวนเต็ม 2 มิติ
  • 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 (หรือสามารถใช้อักขระ regexp ที่ปลอดภัยอื่น ๆ ได้) คำอธิบาย:

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

หากมีOขอบใด ๆ ลบทุกอย่างอื่น (กรณีการอยู่รอด)

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

วาง#ในพื้นที่ใด ๆ Oดังกล่าวข้างต้นที่มีอยู่

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

และ#ในพื้นที่ด้านล่างใด ๆ Oที่มีอยู่

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

เปลี่ยน#เพื่อOs Oและยังพื้นที่ใดไปทางซ้ายหรือขวาของที่มีอยู่

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

สถาน#s ข้างต้นที่มีอยู่Fของ สิ่งเหล่านี้สามารถเขียนทับOs และช่องว่าง

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

วางที่#ด้านล่างของ s ที่มีอยู่ใด ๆFรวมทั้งแทนที่Os และช่องว่าง

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

เปลี่ยน#เพื่อFs และยังใด ๆหรือพื้นที่ไปทางซ้ายหรือขวาของที่มีอยู่O Fทำซ้ำจนกว่าFจะหมดทุกอย่าง

O

กลับไป1เพื่อความอยู่รอด0ถ้าไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.