Zamanında halledecek miyim?


37

Esinlenen bu .

Arka fon

Kötülük çiftçi fiyatları artırmayı sırayla buğday alanını yakmaya karar verdi. Tam yıkımı sağlamak için, alanınızı benzine batırdı. Daha da yazık ki, ateş yakıldığında tarlada yürürdünüz ve hayatta kalmak için hızla çıkmalısınız.

Meydan okuma

Buğday, ateş ve yerinizi içeren bir alan göz önüne alındığında, zaman içinde tarladan çıkıp çıkamayacağınıza karar verin.

Bir tarla buğday (burada temsil edilir .) ve ateş ( F) den oluşur. Burada konumunuz bir ile işaretlenmiştir O. Örneğin:

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

Her saniye herhangi bir bitişik hücreye (ancak çapraz olarak değil) taşınır ve her yangın her bitişik hücreye yayılır. Yanmayacak bir hücreye gidemezseniz, ölürsünüz. Sahadan çıkarsan hayatta kalırsın. Bu örnekte ne olduğunu görelim:

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

kurallar

  • Girişiniz ızgara olarak alandır. Çizgi ayırıcıları olan bir dize veya 2D dizi de dahil olmak üzere herhangi bir giriş biçimini seçebilirsiniz.
    • Sen olabilir değil girdi olarak yangın ve / veya kendiniz için yerlerini alır.
    • Dizi girişi için ip olmayanlar da dahil olmak üzere, buğday, ateş ve konumunuz olarak 3 farklı değer kullanabilirsiniz.
    • Alanlar her zaman en az 1x1 boyutunda, dikdörtgendir ve geçersiz karakter içermez.
    • Herhangi bir alan, konumunuzu temsil eden değerden tam olarak birini içerecektir ve diğer tüm pozisyonlar yangın olabilir veya olmayabilir.
  • Çıktınız, olduğu gibi, “hayatta kalırsınız” veya “ölürsünüz” için iki ayrı değerden biridir .
  • Standart kuralları geçerlidir.

Test durumları

atlattı

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

Hayatta kalmadım

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
Neden birinin indirilmediğini anlamıyorum
Oliver Ni

3
Her iki katılımcıya da, benim mücadelemin neden kötü olduğunu açıkla.
PurkkaKoodari

6
@DeadPossum Çünkü mücadeleyi çok kolaylaştıracağını ve biraz fazla genişleyeceğini hissediyorum. Yine de aynı fikirde olmaktan çekinmeyin; diğerleri sizinle aynı fikirdelerse, kısıtlamayı değiştirebilirim.
PurkkaKoodari

2
Pietu1998 ile aynı fikirdeyim, ayrıca sınırlamanın oldukça uygun olduğunu düşünüyorum.
Bay Xcoder

2
@LuisMendo Çiftçi döndüğünde kaçmak mümkün ise, her zaman düz bir çizgide kaçması mümkündür. Mesela çiftçinin tarlanın sağına kaçmaya çalıştığını varsayalım. Çiftçi bir boşluk aşağı hareket ettiğinde, bazı yangınlar aşağıya doğru yayılır; o zaman çiftçinin durumu başlangıç ​​pozisyonuyla aynıdır (artı daha fazla ateş).
JungHwan Min

Yanıtlar:


28

Salyangoz, 15 bayt

\Oo!{.,fee7.,\F

Çevrimiçi deneyin!

10ölüm demek, hayatta kalmak demektir.

Yangını söndürmek imkansız olduğundan, etrafta dolaşmaya çalışmak hiçbir zaman yararlı olmaz. En iyi rota her zaman düz bir çizgidir. Bu yüzden, sadece dört olası kaçış yolu seçeneği var. Bir yönün güvenli olup olmadığını belirlemek için F, o yöne işaret eden “ateş koni” içindeki herhangi birini kontrol ederiz .


1
O_o Bir test linki sağlayabilir misiniz? Bu çok kısa görünüyor.
Bay Xcoder

10
Kod neredeyse söylüyor: "Oy!" ... "phew" ...
Magic Octopus Urn

26
Çünkü salyangozlar ateş yakmak için mükemmel bir seçimdir ...
Timtech

6
@feersum "Çevrimiçi deneyin" bağlantısında, ölüm olması gereken şu 3 satırlı buğday tarlasını denedim, ancak program hayatta kalabileceğinizi düşünüyor: "F..F", ".O ..", " FF .. "
Xantix


12

Python 2 , 283 218 209 208 bayt

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

Çevrimiçi deneyin!

Bir satırsonu ayrılmış dize olarak girişi alır ve iadeler True/FalseiçinDead/Alive

Her yöne (udlr) Fdışa doğru bakacak şekilde kontrol ederek çalışır :

Örnek:

Giriş:

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

Yangın kontrolleri:

Up:       Down:     Left:     Right:

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

Tüm yönlerde ateş varsa, ölürsün, aksi takdirde bir kaçış olur.

Düzenleme: Girdi olarak bir dize almaya geri döndüm ve şimdi yalnızca yukarı / sağa denetliyor, aynı zamanda girişi geriye doğru denetliyor (aşağı / sola verme)

Bay Xcoder ve Felipe Nardi Batista sayesinde çok fazla bayt kurtardı


@FelipeNardiBatista teşekkürler :)
TFeld


2

JavaScript, 174 bayt

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)

Giriş formatı:

  • Tam Sayı Dizisi
  • 2 için F, 1 için ., 0 içinO

Çıktı:

  • Hayatta kalmak için Truthy değeri (1)
  • Kalıp için sahte değer (NaN)

Dene:

Hücresel bir otomat düşünün. Bir hücre için 3 durum vardır O(insanlar tarafından erişilebilir), F(kovulmaktan ateşlenir), .(henüz hiçbir şey olmadı). Yeni nesil oluşturma kuralı:

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

Kenarda bir hücre olduğu zaman, Odurumu olan insanlar hayatta kalır. Bu yeterli miktarda üretimde olmazsa, insanlar öldü.

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

Octave, 71 bayt

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

Çevrimiçi deneyin!

veya

Tüm test durumlarını doğrulayın!

Giriş formatı:

  • 2B tam sayı dizisi
  • 1için ., 2için Ove 3içinF

Çıktı:

  • true ve false

Açıklama:

Açıklama:

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

Retina , 243 bayt

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

Çevrimiçi deneyin! Arka planın .s yerine boşluk olmasını gerektirir (veya başka bir regexp güvenli karakter kullanılabilir). Açıklama:

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

Herhangi Obir kenarında bir şey varsa, diğer her şeyi silin (hayatta kalma durumu)

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

Bir koyun #Varolan üzerindeki herhangi uzayda O.

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

Ve var #olanın altındaki herhangi bir alanda O.

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

S'yi #s ile Oaynı zamanda var olanın solunda veya sağında bulunan herhangi bir alanı değiştirin O.

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

Yeri #s varolan herhangi yukarıda Fs. Bunlar Oboşluklar kadar s üzerine yazabilir .

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

S'yi #mevcut alanların altına yerleştirin F, aynı zamanda Oboşlukların üzerine yazın.

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

#S yi Fs olarak değiştirin, ayrıca var olanın Osoluna veya sağına herhangi bir veya boşluk bırakın F. FS her şeyi tüketene kadar tekrarlayın .

O

Değilse 1, hayatta kalmak için geri dönün 0.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.