Cebimde ne var?


16

Özet: Çevresindeki karakterleri bulun MYPOCKET.

Örnek Giriş

MYPHEIF
YFOCKVH
MBNDEIF
TEUFTMY
ESNDUWP
KBOVUVO
CENWFKC
OPYMTEB

Örnek Çıktı

F   
BND 
EUF   
SNDUW 
BOVUV 
ENWF  

Ha? Bunu çıktı olarak nasıl elde ettik? "Cep" görmek bazen zor olabilir. Bu daha net hale getirecektir:

MYP HEIF
 Y F OCK VH
 M BND E EĞER
 T EUF TMY 
E SNDUW P 
K BOVUV O 
C ENWF KC 
OPYMTE B

Kalın harflerle yazılmış harfler, MYPOCKETtekrar tekrar tekrarlanan dizeden oluşan dikey olarak birbirine bağlı bir karakter halkasını gösterir . Programınız o zil içindeki karakterlerin çıktısını almalıdır.

Notlar:

  • Sadece bir "cep" olacak.
  • Satırlara izin verildikten sonra yeni satırların veya boşlukların sonlandırılması.
  • Izgaranın geri kalanı da MYPOCKEThalkanın şeklini belirsiz hale getirecek şekilde olabilir , ancak karakter içerebilir .
  • Her Mzaman sağ üst köşede değildir.
  • "Cep" saat yönünde veya saat yönünün tersine hareket edebilir.
  • "Cep" diyagonal yönlerde hareket etmez - yani her harf bir sonraki sola, sağa, yukarı veya aşağı bağlanır.

İşte programınızı test edebileceğiniz başka bir giriş.

Örnek Giriş

EKCYMOPD
KCOPHAYM
EKNDSEST
JETHACKE
KRMYPOBN

Örnek Çıktı

  HA
NDSES
 HA

14
Kötü küçük ceplerinde ne var?
Kapı tokmağı

Bu Anarchy Golf'teki bu meydan okumadan ilham aldı mı?
xnor

@xnor Hayır, değildi. (Her ne kadar biraz benzer olsa da ...)
Absinthe

Yanıtlar:


1

Perl 5, 414

map{$y=0;push@{$h{$_}},[$-,$y++]for@$_;$-++}@l=map[/./g],<>;sub n{($a,$b,$c,$d)=@_;$a==$c&&1==abs$b-$d||$b==$d&&1==abs$a-$c}sub c{my($x,$y,$n)=@_;for(grep{($f=defined$x)?n$x,$y,@$_:1}@{$h{(MYPOCKET=~/./g)[$n%8]}}){($m,$l)=@$_ if!$f;return@r=([@$_],@r)if$n>2&&n(@$_,$m,$l)||c(@$_,$n+1)}''}c;$l[$_->[0]][$_->[1]]=$" for@r;($l[$_]=join'',@{$l[$_]})=~s/^(\w+)\s|\s(\w+)$/$"x($1||$2)=~y%%%c/eg for 0..@l;print join$/,@l

Kullanımı: pocket.pl olarak kaydedin ve ile çalıştırın:

perl pocket.pl <<< '<grid>'

En iyisi olmayabilir, ama ilk düşündüğüm yolu kaba kuvvet uygulamak için özyinelemeli bir işlev için gittim.

Mevcut test durumlarının her ikisi için de çalışırken bazı uyarılar vardır:

  • önde gelen boşlukları içerir (ki bu kurallarda belirtilmiş görmedim ...); ve
  • kesinlikle ortada karakterler içeren bir 'cep' ile çalışmayacaktır (U şeklinde veya benzeri deyin).

Bunun üzerinde çalışmaya devam etmek istiyorum, ancak soruya ilgi olduğunu göstermek istedim! Yararlıysa sürecimi belgelemekten mutluluk duyuyorum.


5

Python 2.7 571 542 509

import sys
o,l,v,k,w="MYPOCKET",[list(e)for e in sys.stdin],[],enumerate,len
def f(z,q,t):
 for r,c in(z,q+1),(z,q-1),(z+1,q),(z-1,q):
  if w(l)>r>=0 and 0<=c<w(l[r])and o[t]==l[r][c]:
    v.append((r,c))
    if f(r,c,(t+1)%w(o)):return 1
    else:v.pop()
 if z==1 and(0,q)in v or z==0 and(z,q+1)in v:return 1
for i,x in k(l[0]):
 v=[(0,i)]
 if x==o[0]and f(0,i,1):break
for i in range(1,w(l)-1):b=[y for x,y in sorted(v)if x==i];print"".join(["".join(e)if w(e)>0 else" "for e in[l[i][b[j-1]+1:y]for j,y in k(b)][1:]])

Bir program olarak çalışır (özyinelemeli bir işlev üzerinde bankacılık) ve stdin'den girdi kabul eder.
Burada demo.
Test etmek ( ex1.txtve ex2.txtsorudan örnekler) -

$ python pockets.py < ex1.txt
F
BND
EUF
SNDUW
BOVUV
ENWF
$ python pockets.py < ex2.txt 
  HA 
NDSES
 HA  

Yorumlar ile yorum yapılmamış sürüm -

s="""
EKCYMOPD
KCOPHAYM
EKNDSEST
JETHACKE
KRMYPOBN
"""
li2=[list(e.strip()) for e in s.split("\n") if e.strip()!='']
buf=[]
def find_precious(row, col, c_ind):
    for r,c in[(row,col+1),(row,col-1),(row+1,col),(row-1,col)]:
        if len(li2)>r>=0 and 0<=c<len(li2[r]) and seq[c_ind]==li2[r][c]:
            if (r,c)in buf:return True
            buf.append((r,c))
            if find_precious(r,c,(c_ind+1)%len(seq)):return True
            else:buf.pop()
    if row==1 and (row-1,col) in buf or row==0 and (row,col+1) in buf:return True
    return False

for i,x in enumerate(li2[0]):
    if x==seq[0]:
        buf=[(0,i)]
        if find_precious(0,i,1):break
if len(buf)==1:
    exit("Failed")

#Calculate the middle men
for i in range(1,len(li2)-1):
    b=[y for x,y in sorted(buf)if x==i]
    print "".join(["".join(e)for e in [li2[i][b[j-1]+1:y]for j,y in enumerate(b)][1:]if len(e)>0])

Aptalca bir şey yapsaydım ya da bir şey daha iyi yapılabilirse, bana bildirin.
Looong olduğunu biliyorum, ama yapabileceğim en iyisi: P


Eh, Python'da o kadar kötüyüm ki muhtemelen kaba kuvvet uygulayacağım // Python'da lambdas hakkında hiçbir bilgim yok ... // ama güzel bir çözüm! Hala hiç yoktan iyidir.
Kurousagi
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.