Hangi anahtarlar açık?


12

Giriş

İş arkadaşınızla oturuyorsunuz, öğle yemeği yiyorsunuz ve üzerinde çalıştığınız en son ve sözde en büyük proje hakkında övünüyorsunuz. Sürekli egoizm vitrininizden bıkmak ve yorulmak, sizi susturmak için size meydan okuma yapar. Egoist ve mutlu-şanslı bir kişi olarak, elbette kabul ediyorsunuz (çünkü her zorluğu kabul etmelisiniz ). Meydan , o / o açıkladığı gibi öyle, bir verilen giriş içinde 1 veya her karakterin daha içeren bir metin bloğunun !@#$^&*, çıkış anahtarı olan (ler) / koordinatları "on" makul bir biçimde.

İş arkadaşınıza göre, bir anahtar a'dır $ve yalnızca aşağıdaki ölçütlerden en az birini karşıladığında bir anahtar "açık" olarak sınıflandırılır:

  1. Herkesle çevrilidir ^. Yani...

    ^^^
    ^$^
    ^^^
    

    "on" anahtarıyla sonuçlanır.

  2. Herkesle çevrilidir &. Yani...

    &&&
    &$&
    &&&
    

    "on" anahtarıyla sonuçlanır.

  3. Tamamen en az iki tarafı ile kaplıdır *. Örneğin,

    ***
    &$&
    ***
    

    "açık" bir anahtarla sonuçlanır, ancak

    &*&
    &$&
    &*&
    

    Anahtar olmadığı için, değil tamamen örtülü tarafından herhangi iki tarafta *s.

  4. Etrafındaki köşelerden herhangi birinde en az 1 !ve / veya 1 @vardır. Bu mu değil bunlardan birini eğer saymak değil bir köşede. Yani...

    !&&
    ^$@
    @&!
    

    köşelerde en az 1 !ve / veya en az 1 olduğu için "açık" bir anahtar ile sonuçlanır @(yukarıdaki durumda 3 geçerli !s ve @3 köşede 1 geçerli ). Ve...

    &!&
    ^$@
    ^!&
    

    yapar değildir 2 olmasına rağmen, !s, 1 @hiçbiri içinde olduğu için, herhangi bir köşelerin.

  5. 1 veya daha fazla #olan olmayan üzerinde herhangi bir en az 1 sürece, anahtar çevresinde iki &anahtar çevreler. Başka bir deyişle, #bir tarafta en az 1 mevcutsa, bir hediye yoksa, diğer tüm kuralları geçersiz kılar &. Bu nedenle:

    #&*
    *$*
    !**
    

    anahtarın etrafında bir anahtar #bulunduğundan, bir "açık" anahtarla &sonuçlanır ve yukarıdaki kurallardan en az birini izler. Ancak, ünlem işareti şu şekilde mevcut değilse:

    #&*
    *$*
    ***
    

    Yukarıdaki kurallardan en az birine uymadığı için anahtar kapalı olacaktır. Bu nedenle, bir anahtar a #ve a ile çevrelenmiş olsa bile &, bu kurallardan bir veya daha fazlasına uymadıkça hala kapalı olacaktır. Ayrıca, anahtarın geçerli olması için her zaman& s ve #s arasında> = 1: 1 oranı olmalıdır. Örneğin,

    #&!
    *$*
    **#
    

    bu kurallardan 1'ini izlese de geçersiz bir anahtar olur, çünkü 2 #s'dir, ancak yalnızca 1'dir &ve bu nedenle &s ve #s arasında> = 1: 1 oranı yoktur . Bunu geçerli kılmak için &, #s ve &s sayısını dengelemek için herhangi bir kenara 1 veya daha fazla ek s eklemelisiniz , muhtemelen şöyle:

    #&!
    *$&
    &*#
    
    3:2 ratio between &s and #s
    

    En sonunda...

    #^^
    ^$*
    @^!
    

    bir "kapalı" anahtarıyla sonuçlanır, ancak yukarıdaki kurallardan 1 veya daha fazlasını izler, ancak etrafında en az 1 içerdiğinden ve# bu değeri &aşmak için hiçbir s içermez .

  6. Geçerli anahtarları olacak sadece olması içeride girdi ve bu nedenle, her geçerli $içine alınmalıdır tamamen geçerli karakterlerden herhangi 8 ile. Örneğin, girdinin tamamı şöyle olsaydı:

    *$*
    !$!
    !!!
    

    üst $kısım kesinlikle geçerli bir anahtar değildir , çünkü anahtar bir kenardadır ve bu nedenle anahtar tamamen 8 geçerli karakterle çevrili değildir. Bu durumda, anahtar bile dikkate alınmamalıdır. Bununla birlikte, ortadaki anahtar tamamen geçerlidir ve aslında yukarıdaki koşullardan en az birini karşıladığı için "açık" dır.

Göstermek için şu karakter bloğunu düşünün:

!@#^^$#!@
!@#$$*$&@
@$^!$!@&&

dikey ekseni yve yatay ekseni çağırarak böyle koordinatlar için etiketleyebiliriz x:

y

3 !@#^^$#!@
2 !@#$$*$&@
1 @$^!$!@&&

  123456789 x

Koordinatlar her zaman(x,y) iki boyutlu bir koordinat ızgarasına benzer bir biçimde döndürülmelidir . Şimdi, hangi anahtarlar açık? Önce hepsini bulalım. En üst sırada 1, en altta başka bir tane olduğunu zaten görebiliriz. Ancak, bunlar 8 karakterle tamamen çevrili olmadığından otomatik olarak işlem yapılmaz.

Sonra sıra 2'de yer alır. Özellikle, bu:

#^^
#$$
^!$

Burada 3 $işaret olduğunu görebiliriz , ancak sadece ortadaki bir işarete odaklanmak istiyoruz ve muhtemelen görebileceğiniz gibi, zaten geçersiz, çünkü onları dengelemek için s #yok &dışarı. Ayrıca, bu kuralların hiçbirine uymaz, bu yüzden geçerli bir anahtar olsa bile, yine de "kapalı" olur.

Sonra sıra 2'de bir tane daha gelir:

^^$
$$*
!$!

Yine, sadece ortadaki düğmeye odaklanın. O sahip olduğundan bu anahtar, "açık" olduğu , en az 1 !içinde en az 1 köşesinde. Bunun koordinatları (5,2).

Devam edince, sonunda son anahtara geçiyoruz. Bu da ikinci sıradadır ve şöyle görünür:

$#!
*$&
!@&

ve görebileceğiniz gibi, bu da geçerli bir anahtardır, ancak #onu çevreleyen bir durum olsa da, &dengesini aşmak için 2 tane daha vardır #. Buna ek olarak !, köşelerin en az 1'inde en az 1 tane vardır ve bu nedenle sadece anahtar geçerli değildir, aynı zamanda "açıktır". Bu anahtarın koordinatları (7,2).

Sonunda sona ulaştık ve metin üzerindeki tüm blokta 2 "açık" anahtar bulduk. Onların koordinatları (5,2)ve (7,2)bu bizim son cevabımız ve çıktının ne olması gerektiğidir. Ancak, bu girdi çok basitti. Metin bloğunun ne kadar büyük olabileceğine dair bir sınırlama olmadığından girdiler çok daha büyük olabilir. Örneğin, girdi rastgele bir 200x200metin bloğu olabilir .

contraints

  • Standart Loopholes yasaktır.

  • Orada olamaz muhtemelen yerleşik bir bunun için, ama sadece orada (sizin Mathematica bakarak) durumunda, doğrudan bu çözmek yerleşik ins kullanılması yasaktır olun.

Test Durumları:

Biçiminde verilen string input -> [array output]:

@#$$&^!&!# 
@*&!!^$&^@
$!#*$@#@$!   ->  [[7,3],[9,2]]
*@^#*$@&*#

#^&!$!&$@@#&^^&*&*&&
!^#*#@&^#^*$&!$!*^$$
#^#*#$@$@*&^*#^!^@&* -> [[19,3],[15,3],[8,2]]
#$@$!#@$$^!#!@^@^^*#

@!@!^&*@*@
*$*^$!*&#$
@$^*@!&&&#
**$#@$@@#!  -> [[2,8],[5,8],[6,6],[9,3]]
##*&*#!^&^
$&^!#$&^&@
^^!#*#@#$*
$@@&#@^!!&
#@&#!$$^@$


!!@##!$^#!&!@$##$*$#
$^*^^&^!$&^!^^@^&!#!
@*#&@#&*$!&^&*!@*&** -> [[9,4],[9,3]]
^!!#&#&&&#*^#!^!^@!$
&$$^*$^$!#*&$&$#^^&$

Daha fazlası çok yakında

ek Notlar

  • Girişin her zaman tam bir blok (yani bir dikdörtgen veya kare) şeklinde olacağını varsayabilirsiniz.
  • Girdide asla karakterdekinden başka bir karakter olmayacaktır !@#$^&*.

Unutmayın, bu bir yani kısa kod kazanıyor!


12
Biraz uzun ve keyfi görünüyor.
orlp

@orlp Ben bunun için gidiyorum. Zaten bir meydan okuma. Neden keyfi olduğunu söylüyorsun?
R. Kap

6
@ R.Kap Kuralların hiçbiri için bir gerekçe yoktur; sebepsiz yere karmaşıklık katmak için yapılmış gibi görünüyorlar.
Monica'nın Davası

6
@QPaysTaxes Bunun hangi gerekçeye ihtiyacı var? Bunlar edilir meydan uğruna yapılmış. Bu ise bir meydan okuma ve bir meydan okuma anlamıyla olabilir şey . Gerçekten ihtiyaç duyduğu tek şey bir dizi kural, bir girdi ve çıktının bu kurallara dayanması gerektiğidir.
R. Kap

1
Katılıyorum demiyorum, neden keyfi göründüğünü açıklıyorum. Örnek olarak en popüler mücadelemi ele alalım: Tüm içeriği elimden aldıysanız ve "Size bir dizi dizge verilir. Girintiye göre gruplandırın, grupları karıştırın, sonra iç grupları karıştırın, ancak üyelerini saklayın. alt gruplarda varsa iç gruplar ", bu pek mantıklı olmaz. Ancak, bağlamı olduğu için, tüm bu garip kurallar ve kısıtlamalar en azından mantıklı görünüyor.
Monica'nın Davası

Yanıtlar:


2

Haskell, 304 bayt

import Data.List
s!c=sum[1|a<-s,a==c]
f t|Just w<-elemIndex '\n't,h<-t!'\n'=[c|c<-mapM(\a->[2..a-1])[w,h],s<-[(\[x,y]->t!!((h-y-1)*(w+1)+x))<$>mapM(\a->[a-2..a])c],s!!4=='$',foldr1(-)((s!)<$>"#&")<1,or$("@!"/="@!"\\map(s!!)[0,2..8]):zipWith(\c i->all(==c)$(s!!)<$>[0..8]\\(4:i))"^&**"[[],[],[1,7],[3,5]]]

Bu f, verilen görevi gerçekleştiren işlevi tanımlar .


2

JavaScript (ES6), 363 339 312 309 298 bayt

Bu, girdiyi dize olarak alan ve bir koordinat listesi döndüren bir işlevdir. İki ana bölüme ayrılmıştır: anahtarların bir çift koordinat ve çevresindeki karakterlere dönüşmesi ve çevresindeki karakterlerin meydan okumasının kurallarına dayanan bir 'açık' kontrolüdür.

a=>[...a].map((z,p,m)=>(y-=z==B,z)=='$'&&(r=m[p-n-2]+m[p-n]+m[p+n]+m[p+n+2]+m[p-n-1]+m[p-1]+m[p+1]+m[p+n+1],r=r[L]<9?r:'')[T]`&`[L]>=r[T]`#`[L]&&(/(\^|&){8}|\*{4}(.\*\*.|\*..\*)/.exec(r)||/!|@/.exec(r.substr(0,4)))&&[1+(p-(w-y))%n,y],y=w=a[T='split'](B='\n')[L='length'],n=a.search(B)).filter(e=>e)

2

Python 2 , 299 297 279 275 261 259 bayt

m=input()
R=range
h=len(m)
for y in R(h-2):
 for x in R(len(m[0])-2):
	a=''.join(m[y+o][x:x+3]for o in R(3))
	if(a.count('&')>=a.count('#'))*(a[:4]+a[5:]in('^'*8,'&'*8)or'*'*6in(a[:3]+a[6:],a[::3]+a[2::3])or'!'in a[::2]or'@'in a[::2])*a[4]=='$':print x+2,h+~y

Çevrimiçi deneyin!

Dizeleri bir liste olarak alır

Çıktıyı her satıra bir çift x, y koordinatı olarak yazdırır

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.