ฉันได้อะไรในกระเป๋าของฉัน


16

: เรื่องย่อMYPOCKETตัวละครพบว่าจะถูกล้อมรอบด้วย

ตัวอย่างอินพุต

MYPHEIF
YFOCKVH
MBNDEIF
TEUFTMY
ESNDUWP
KBOVUVO
CENWFKC
OPYMTEB

ตัวอย่างผลลัพธ์

F   
BND 
EUF   
SNDUW 
BOVUV 
ENWF  

ฮะ? เราได้รับสิ่งนั้นในฐานะผลลัพธ์ได้อย่างไร บางครั้ง "กระเป๋า" อาจมองเห็นได้ยาก สิ่งนี้จะทำให้ชัดเจนยิ่งขึ้น:

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

ตัวอักษรที่เป็นตัวหนาหมายถึงวงแหวนของตัวละครที่เชื่อมต่อกันซึ่งประกอบด้วยสตริงMYPOCKETซ้ำแล้วซ้ำอีก โปรแกรมของคุณควรแสดงอักขระที่อยู่ในวงแหวนดังกล่าว

หมายเหตุ:

  • จะมีเพียง "กระเป๋า" เท่านั้น
  • ลากเส้นบรรทัดใหม่หรือเว้นวรรคหลังบรรทัดที่ได้รับอนุญาต
  • ส่วนที่เหลือของตารางอาจมีอักขระจากMYPOCKETแต่ไม่ใช่ในลักษณะที่ทำให้รูปร่างของวงแหวนไม่ชัดเจน
  • Mไม่ได้เสมอในมุมบนด้านขวา
  • "กระเป๋า" สามารถเคลื่อนที่ในทิศทางตามเข็มนาฬิกาหรือทวนเข็มนาฬิกา
  • "กระเป๋า" จะไม่ย้ายไปในทิศทางทแยงมุม - นั่นคือตัวอักษรแต่ละตัวมีการเชื่อมต่อซ้ายขวาขึ้นหรือลงต่อไป

นี่คืออินพุตอื่นที่คุณสามารถทดสอบโปรแกรมด้วย

ตัวอย่างอินพุต

EKCYMOPD
KCOPHAYM
EKNDSEST
JETHACKE
KRMYPOBN

ตัวอย่างผลลัพธ์

  HA
NDSES
 HA

14
มันมีอะไรอยู่ในกระเป๋าเล็ก ๆ ที่น่ารังเกียจ?
Doorknob

นี่เป็นแรงบันดาลใจจากความท้าทายนี้จาก Anarchy Golf หรือไม่?
xnor

@ xnor ไม่มันไม่ใช่ (แม้ว่ามันจะค่อนข้างคล้ายกัน ... )
absinthe

คำตอบ:


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>'

ฉันไปหาฟังก์ชั่นวนซ้ำเพื่อบังคับให้เส้นทางเดินซึ่งอาจไม่ดีที่สุด แต่เป็นวิธีแรกที่ฉันพิจารณา

ในขณะที่มันใช้ได้กับกรณีทดสอบทั้งสองในปัจจุบันมีข้อแม้บางประการ:

  • มันมีช่องว่างนำหน้า (ซึ่งฉันไม่ได้เห็นในกฎ ... ); และ
  • มันจะไม่ทำงานกับ 'pocket' ที่มีตัวละครอยู่ตรงกลาง (พูดรูปตัว 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.txtและex2.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])

แจ้งให้เราทราบหากฉันทำสิ่งที่โง่หรือสิ่งที่สามารถทำได้ดีกว่า
ฉันรู้ว่ามันเป็น looong แต่สิ่งที่ดีที่สุดที่ฉันสามารถทำได้: P


เอ๊ะฉันแย่มากที่ Python ฉันอาจดุร้ายกับมัน // ฉันไม่มีความรู้เกี่ยวกับ lambdas ใน Python ... // แต่มันเป็นทางออกที่ดี! ยังดีกว่าไม่มีเลย
Kurousagi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.