Hapishanem güvende mi?


58

Mücadelenize, mahkumlardan herhangi birinin kaçıp kaçamayacağına karar vermek için bir hapishane düzeni girişi verildi.

Giriş

Girdi böyle bir dize, dizi, bu durumda girdi üç karakterden oluşacak vb Dizilerin dizisi, herhangi bir makul biçimde olabilir #, Pve uzayda. Giriş mutlaka üç karakterin tümünü içermeyecek.

  • #: Bir duvar
  • P: Bir mahkum
  • boşluk: Boş alan

Örnek bir giriş şöyle görünür:

#####
#   #
# P #
#   #
#####

Çıktı

Cezaevinin güvende olup olmadığına dair bir gerçeği / falsey değeri. Hapishane, ancak bütün mahkumları tutabildiği takdirde güvendedir . Herhangi bir mahkum kaçabilirse güvenli değildir.

Bir duvar tarafından tamamen kapalı değilse, bir mahkum kaçabilir. Çapraz bir birleştirme tamamen kapalı.

Test durumları

############# Truthy
# P #  P#   #
#   #   # P #
#############

############# Truthy
# P    P    #
#   #   # P #
#############

############# Falsey
# P #  P#   #
#   #   # P #
########## ##

####          Truthy
#   #
 #   #
  # P ####
  ####

P             Falsey

###           Falsey
# #
# #
### P

8
Bunun yinelenen ya da en azından benzer bir sorun olduğunu hissediyorum. Zaten iyi meydan okuma.
John Dvorak

2
@JanDvorak Olabilir ama sınırlı Google Fu'mda bir kopyasını bulamadım.
TheLethalCoder

2
ilgili (2B ızgarayı doldurma)
Esolanging Fruit

3
Kaçmak için hem yatay hem de dikey hareketin gerekli olduğu Falsey örneklerine sahip olmak iyi olurdu.
xnor

2
@tfbninja Gerçekten bir kopya değil. Bu, kelimenin kutunun içinde olup olmadığını belirlemek için programın verilen verilerden fazladan hesaplanmasını denemeyi ister. Bu, BFS taşkın dolgusu olup, işaretli değerleri tutan kapalı alanların olup olmadığını görmek için kullanılır.
HyperNeutrino,

Yanıtlar:


54

Salyangoz , 13 bayt

!(t\P(o\ ),o~

Çevrimiçi deneyin!

0Güvenli olmayan hapishaneler ve güvenli hapishaneler için girişin sınırlama kutusunun boyutlarını yazdırır .

Buradaki fikir, yalnızca dikey olan ( ) boşluklar arasında hareket eden bir Psınır dışı hücre ( ~) arasında bir yol bulamamamızdır o. Bu tbir ışınlanma noktasıdır, böylece maçı nereden denediğimize bakılmaksızın, tüm olası başlangıç ​​konumlarını bulmaya çalışır P.


23
Doğru alet
Jonathan Allan

16

C # (.NET Core) , 485 480 474 470 421 408 bayt

Kesinlikle yanlış araç ve yaklaşım, ama yine de ...

  • TheLethalCoder'ın faydalı ipuçlarıyla kaydedilen 7 bayt (ve daha fazlası).
  • Bir tamsayı döndürerek kaydedilen 4 bayt.
  • 4 daha byte değiştirerek TheLethalCoder (yine) sayesinde kaydedilen ' 'ile 32karşılaştırmalarda.
  • Kodu yeniden aktararak kaydedilmiş bayt sayısı.
  • 13 bayt daha sayesinde (tahmin et kim?) TheLethalCoder. :) İpuçlarını unutmaya devam ediyorum ve bana hatırlatıyor.
m=>{var p='P';int a=m.Length,b=m[0].Length,i=0,j,x,y;var c=new System.Collections.Stack();for(;i<a;i++)for(j=0;j<b;j++)if(m[i][j]==p)c.Push(new[]{i,j});while(c.Count>0){var t=(int[])c.Pop();x=t[0];y=t[1];if(x<1|x>a-2|y<1|y>b-2)return 0;foreach(var v in new[]{-1,1}){var z=x>0&x<a-1&y>0&y<b-1;if(z&m[x+v][y]==32){m[x][y]=p;c.Push(new[]{x+v,y});}if(z&m[x][y+v]==32){m[x][y]=p;c.Push(new[]{x,y+v});}}}return 1;}

Çevrimiçi deneyin!

Temel olarak, P'lerin pozisyonlarını, beyaz bir boşluk etrafında olduğu zaman mizanpajın sınırına ulaşana (veya erişmeyene) kadar genişletirim.

Bazı lisanslar:

  • char[][]Düzen için girdi olarak bir kullanıyorum .
  • İade 0kadar güvensiz ve 1güvenli olarak.

İşleve fazladan girdi alamazsınız, böylece boyutları üstlenebilirsiniz ... Beni başka şekilde ikna etmek için bir meta gönderisi bulamazsanız.
TheLethalCoder

1>0ve 1<0daha kısadır trueve false.
TheLethalCoder

1
Can ==0haline <1? En az 1 bayt alakasız boşluk var. new[]S kaldırabilir misin ? (Her zaman işe yaramaz ama bazen içeri girer int[] n = {1,2,3};).
TheLethalCoder

1
{m[x][y]= p; c.Push(new[]->{m[x][y]=p;c.Push(new[]
TheLethalCoder 14:17

1
S'yi chars ile karşılaştırabilirsiniz , intböylece baytları kaydetmek ==' 'için değiştireceğinize inanıyorum ==32. Bunu benzer karşılaştırmalarda da yapabilmelisiniz.
TheLethalCoder

15

Perl 5 , 69 bayt

-Grimy sayesinde -10 bayt .

@Neil sayesinde -2 bayt .

77 bayt kodu + -p0bayrakları.

/
/;$_=s/(P| )(.{@{-}})?(?!\1)(?1)/P$2P/s?redo:!/\A.*P|P.*\Z|^P|P$/m

Çevrimiçi deneyin!

Bazı kısa açıklamalar:
Fikir, Pmahkumların gidebileceği her yere koymak . Eğer Pilk / son satırda veya ilk / son sütunda herhangi biri varsa , o zaman mahkumlar oraya gidebilir ve oradan kaçabilir, bu da cezaevinin güvende olmadığı anlamına gelir.
s/(P| )(.{@{-}})?(?!\1)(?1)/P$2P/sa'nın sağındaki veya altındaki bir boşluğu Pa Pveya solundaki veya üstündeki bir boşlukla değiştirir P.
Son olarak, /\A.*P|P.*\Z|^P|P$/mbir çizginin a ile mi başlayıp bitmediğini Pveya Pilk satırda mı yoksa son satırda mı olduğunu kontrol eder.


Regexps kullanarak serin bir yaklaşım! (ama alan büyüdüğünde çok ÇOK pahalı)
Olivier Dulac

Aslında o kadar verimsiz değil . Özellikle, çok fazla geri izleme gerektirmiyor, mümkün değil *ya +da yapabileceği en uzun eşleşme çizginin büyüklüğüdür. , o zaman evet oldukça verimsiz!
Dada

1
İki ikameleri birleştirerek -6 bayt: s/P(.{@{-}})? | (.{@{-}})?P/P$1$2P/s.
Grimmy

1
Birleştirilmiş ikame golf ile -2 bayt: s/(P| )(.{@{-}})?(?!\1)(?1)/P$2P/s.
Grimmy

2
@Grimy regex çok güzel golf! Thanks :)
Dada

7

JavaScript (ES6), 134 133 bayt

Girdiyi karakter dizisi olarak alır. İade 0(güvensiz) veya 1(güvenli).

f=a=>a.map((r,y)=>r.map((c,x)=>c>'O'&&[-1,1,0,0].map((X,i)=>(R=a[y+1-'1102'[i]])&&R[X+=x]?R[X]<'!'?R[o=2,X]=c:0:o=0)),o=1)|o&2?f(a):o

Test durumları


Can &&ler sadece olmak &?
TheLethalCoder 14:17

@TheLethalCoder Birincisi değil, ikincisi ile değiştirilebilir |. Teşekkürler!
Arnauld,

Yayılma operatörünün dizelerde çalıştığını bilmiyordum. Güzel!
aebabis,

6

JavaScript (ES6), 121 bayt

f=s=>s==(s=s.replace(eval('/( |P)([^]{'+s.search`
`+'})?(?!\\1)[ P]/'),'P$2P'))?!/^.*P|P.*$/.test(s)&!/^P|P$/m.test(s):f(s)

Girdiyi yeni satırla sınırlanmış dikdörtgen dize olarak alır. Güvenli değil için 0, güvenli için 1 döndürür. Başarısız Kaleleri Tespit Etme cevabımı temel alarak , kaçan bir mahk formu test etmek, hapishaneyi incelemeyi bir kez bitirmek yerine, her adımda test etmek daha etkili olacaktır.


2

Octave, 64 55 bayt

@(a,z=padarray(a,[1 1]))~nnz(bwfill(z==35,1,1,4)&z>35);

Çevrimiçi deneyin!

veya

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

Açıklama:

z=padarray(a,[1 1])       %add a boundary(of 0s) around the scene
F = bwfill(z==35,1,1,4)   %flood fill the prison starting from the boundary
~nnz(F&z>35);             %if position of at least a prisoner  is filled then the prison is not secure 

2

APL (Dyalog Klasik) , 40 bayt

{⊃2≠(××{1⊃⌈/⍵,⍉⍵}⌺3 3)⍣≡(⌽1,⍉)⍣4'# '⍳⍵}

Çevrimiçi deneyin!

'# '⍳⍵kodlamak '#', ' ', 'P'0 1 2 olarak

(⌽1,⍉)⍣4 1s ile çevreleyen

(××{1⊃⌈/⍵,⍉⍵}⌺3 3)⍣≡ sıfır komşu hücrelerin taşkın dolgusu

⊃2≠ Sol üstte 2 yok mu?


1

Stax , 35 bayt CP437

ä¬my■╡╤▲l@┤êr*⌠\¶ƒläå─▄¶√¿ [Uy⌠Só4↔

Çevrimiçi deneyin!

Elbette yol bulma işini halletmek için bir iç olmadan golf dili de bunu yapabilir!

açıklama

Açıklamak için paketlenmemiş formatı kullanır.

zLz]Y+Mys+y+{{{" P|P ""PP"Rm}Y!My!Mgphh' =
zLz]Y+Mys+y+                                  Surround the original matrix with four borders of whitespaces
            {                      gp         Iterate until a fixed point is found, return the single fixed point
             {              }Y!               Store the block in register Y and execute it
              {" P|P ""PP"Rm                  For each row, flood every space adjacent to a P with P.
                               My!            Transpose the matrix and do the flooding again
                                     hh' =    The final matrix has a space on the upper left corner that has not been flooded by P 

1

SmileBASIC, 154 146 bayt

Sel dolgusu kullanarak bir cevabın bundan daha kısa olacağını umuyordum.

DEF S P
FOR J=0TO 1X=1Y=1FOR I=0TO LEN(P)-1GPSET X,Y,-(P[I]=="#")GPAINT X,Y,-1,-J*(P[I]>@A)X=X*(P[I]>"31")+1INC Y,X<2NEXT
NEXT?!GSPOIT(0,0)GCLS
END

31Karşılık gelen ASCII karakteriyle değiştirin .

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.