Tôi có gì trong túi?


16

Tóm tắt nội dung: Tìm các ký tự được bao quanh bởi MYPOCKET.

Ví dụ đầu vào

MYPHEIF
YFOCKVH
MBNDEIF
TEUFTMY
ESNDUWP
KBOVUVO
CENWFKC
OPYMTEB

Ví dụ đầu ra

F   
BND 
EUF   
SNDUW 
BOVUV 
ENWF  

Huh? Làm thế nào chúng ta có được điều đó như là một đầu ra? "Túi" đôi khi có thể khó nhìn thấy. Điều này sẽ làm cho nó rõ ràng hơn:

MYP HEIF
 Y F Ock VH
 M BND E NẾU
 T EUF TMY 
E SNDUW P 
K BOVUV O 
C ENWF KC 
OPYMTE B

Các chữ in đậm chỉ ra một vòng các ký tự được kết nối trực giao với nhau bao gồm các chuỗi MYPOCKETlặp đi lặp lại nhiều lần. Chương trình của bạn sẽ xuất ra các ký tự nằm trong vòng đó.

Ghi chú:

  • Sẽ chỉ có một "túi".
  • Trailing dòng mới hoặc không gian sau khi dòng được cho phép.
  • Phần còn lại của lưới cũng có thể chứa các ký tự từ MYPOCKET, nhưng không phải theo cách làm cho hình dạng của chiếc nhẫn mơ hồ.
  • Các Mkhông phải lúc nào cũng ở góc trên cùng bên phải.
  • "Túi" có thể di chuyển theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ.
  • "Túi" sẽ không di chuyển theo hướng chéo - nghĩa là, mỗi chữ cái được kết nối trái, phải, lên hoặc xuống tiếp theo.

Đây là một đầu vào khác mà bạn có thể kiểm tra chương trình của mình.

Ví dụ đầu vào

EKCYMOPD
KCOPHAYM
EKNDSEST
JETHACKE
KRMYPOBN

Ví dụ đầu ra

  HA
NDSES
 HA

14
Những gì nó có trong túi nhỏ khó chịu của nó?
Doorknob

Điều này có được truyền cảm hứng từ thử thách này từ Anarchy Golf không?
xnor

@xnor Không, không phải vậy. (Mặc dù nó có phần giống nhau ...)
absinthe

Câu trả lời:


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

Cách sử dụng: lưu dưới dạng Pocket.pl và chạy với:

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

Tôi đã tìm kiếm một hàm đệ quy để bắt buộc con đường, có thể không phải là tốt nhất, nhưng là cách tiếp cận đầu tiên tôi xem xét.

Trong khi nó hoạt động cho cả hai trường hợp thử nghiệm hiện tại, có một số cảnh báo:

  • nó bao gồm các không gian hàng đầu (mà tôi không thấy được đề cập trong các quy tắc ...); và
  • nó chắc chắn sẽ không hoạt động với một 'túi' có chứa các ký tự ở giữa (giả sử hình chữ U hoặc tương tự).

Tôi muốn tiếp tục làm việc này, nhưng muốn chứng tỏ rằng có sự quan tâm đến câu hỏi! Rất vui khi được ghi lại quá trình của tôi nếu hữu ích.


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

Hoạt động như một chương trình (ngân hàng trên một hàm đệ quy) và chấp nhận đầu vào từ stdin.
Demo tại đây.
Kiểm tra nó ( ex1.txtex2.txtlà ví dụ từ câu hỏi) -

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

Phiên bản Ungolfed với ý kiến ​​-

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

Hãy cho tôi biết, nếu tôi làm điều gì đó ngu ngốc hoặc điều gì đó có thể được thực hiện tốt hơn.
Tôi biết đó là looong, nhưng đó là điều tốt nhất tôi có thể làm: P


Ơ, tôi rất tệ với Python Tôi có lẽ sẽ vũ phu nó // Tôi không có kiến ​​thức gì về lambdas trong Python ... // nhưng giải pháp hay! Vẫn tốt hơn không có.
Kurousagi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.