我的口袋里有什么?


16

简介:查找由括起来的字符MYPOCKET

输入示例

MYPHEIF
YFOCKVH
MBNDEIF
TEUFTMY
ESNDUWP
KBOVUVO
CENWFKC
OPYMTEB

示例输出

F   
BND 
EUF   
SNDUW 
BOVUV 
ENWF  

??我们如何将其作为输出?有时很难看清“口袋”。这将使其更加清晰:

MYP HEIF
 ÿ ˚F OCK VH
 中号 BND Ë IF
 Ť EUF TMY 
Ë SNDUW P 
ķ BOVUV ö 
Ç ENWF KC 
OPYMTE

粗体字母表示一圈相互正交的字符环,由MYPOCKET一遍又一遍重复的字符串组成。您的程序应输出该圆环内的字符。

笔记:

  • 只有一个“口袋”。
  • 允许在行后尾随新行或空格。
  • 网格的其余部分也可能包含来自的字符MYPOCKET,但不能使环的形状不明确。
  • M在右上角是并非总是如此。
  • “口袋”可以沿顺时针方向或逆时针方向移动。
  • “口袋”不会沿对角线方向移动-也就是说,每个字母都左,右,上或下连接到下一个字母。

这是您可以用来测试程序的另一项输入。

输入示例

EKCYMOPD
KCOPHAYM
EKNDSEST
JETHACKE
KRMYPOBN

示例输出

  HA
NDSES
 HA

14
它的小口袋里有什么?
门把手

这是受到无政府高尔夫挑战的启发吗?
xnor

@xnor不,不是。(尽管有点相似...)
苦艾酒

Answers:


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

用法:另存为pocket.pl并运行:

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

我使用了递归函数来强行执行路径,这可能不是最好的方法,但这是我考虑的第一种方法。

尽管它适用于两个当前测试用例,但也有一些警告:

  • 它包括前导空格(规则中未提及……);和
  • 它绝对不能与中间包含字符(例如U形或类似字符)的“口袋”一起使用。

我想继续努力,但想表明对此问题有兴趣!如果有帮助,很高兴记录我的过程。


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

作为程序工作(基于递归函数)并接受来自stdin的输入。
演示在这里。
测试它(ex1.txtex2.txt从问题的例子) -

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

带注释的非高尔夫版本-

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

让我知道,如果我做了一些愚蠢的事情或可以做得更好的事情。
我知道这很放心,但这是我所能做到的最好的:P


恩,我对Python很不好,我可能会蛮力地// //我对Python中的lambda毫无任何了解... //但是很好的解决方案!总比没有好。
Kurousagi 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.