Apa yang ada di saku saya?

16

Sinopsis: Temukan karakter yang dilampirkan oleh MYPOCKET.

Contoh Input

MYPHEIF
YFOCKVH
MBNDEIF
TEUFTMY
ESNDUWP
KBOVUVO
CENWFKC
OPYMTEB

Contoh Output

F   
BND 
EUF   
SNDUW 
BOVUV 
ENWF  

Hah? Bagaimana kami mendapatkannya sebagai output? "Kantung" terkadang sulit dilihat. Ini akan membuatnya lebih jelas:

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

Huruf-huruf tebal menunjukkan lingkaran karakter yang terhubung secara orthogonal satu sama lain yang terdiri dari string yang MYPOCKETdiulang-ulang. Program Anda harus menampilkan karakter yang ada di dalam lingkaran itu.

Catatan:

  • Hanya akan ada satu "saku".
  • Mengejar garis atau spasi baru setelah garis diizinkan.
  • Sisa kotak juga dapat berisi karakter dari MYPOCKET, tetapi tidak dengan cara yang membuat bentuk cincin menjadi ambigu.
  • Tidak Mselalu di sudut kanan atas.
  • "Kantung" dapat bergerak searah jarum jam atau berlawanan arah jarum jam.
  • "Kantung" tidak akan bergerak ke arah diagonal - artinya, setiap huruf terhubung ke kiri, kanan, atas, atau bawah ke yang berikutnya.

Berikut input lain yang dapat Anda uji dengan program Anda.

Contoh Input

EKCYMOPD
KCOPHAYM
EKNDSEST
JETHACKE
KRMYPOBN

Contoh Output

  HA
NDSES
 HA
Absinth
sumber
14
Apa yang ada di kantong kecilnya yang jahat?
Gagang Pintu
Apakah ini terinspirasi oleh tantangan dari Anarchy Golf ini?
xnor
@xnor Tidak, tidak. (Meskipun agak mirip ...)
absinthhe

Jawaban:

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

Penggunaan: simpan sebagai pocket.pl dan jalankan dengan:

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

Saya menggunakan fungsi rekursif untuk memaksa jalur, yang mungkin bukan yang terbaik, tetapi merupakan pendekatan pertama yang saya pertimbangkan.

Sementara itu berfungsi untuk kedua kasus uji saat ini ada beberapa peringatan:

  • itu termasuk ruang utama (yang saya tidak lihat disebutkan dalam aturan ...); dan
  • itu pasti tidak akan berfungsi dengan 'kantung' yang berisi karakter di tengah (katakanlah berbentuk U atau serupa).

Saya ingin terus mengerjakan ini, tetapi ingin menunjukkan bahwa ada minat pada pertanyaan! Senang mendokumentasikan proses saya jika membantu.

Dom Hastings
sumber
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:]])

Bekerja sebagai program (perbankan pada fungsi rekursif) dan menerima input dari stdin.
Demo di sini.
Mengujinya ( ex1.txtdan ex2.txtmerupakan contoh dari pertanyaan) -

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

Versi tidak dikolomisasi dengan komentar -

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

Beri tahu saya, jika saya melakukan sesuatu yang bodoh atau sesuatu dapat dilakukan dengan lebih baik.
Saya tahu ini terlalu panjang, tapi itu yang terbaik yang bisa saya lakukan: P.

Kamehameha
sumber
Eh, aku sangat buruk di Python. Aku mungkin akan memaksanya dengan kasar // Aku tidak punya pengetahuan tentang lambdas di Python ... // tapi solusi bagus! Masih lebih baik daripada tidak sama sekali.
Kurousagi