मुझे अपनी जेब में क्या मिला है?


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
इसकी छोटी छोटी जेबों में क्या मिला है?
दरवाज़े

क्या यह अराजकता गोल्फ की इस चुनौती से प्रेरित था ?
xnor

@xnor नहीं, यह नहीं था। (हालांकि यह कुछ ऐसा ही है ...)
absinthe

जवाबों:


1

पर्ल 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

जेब के रूप में बचाने के लिए।

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

मैं मार्ग को बल देने के लिए एक पुनरावर्ती कार्य के लिए गया, जो शायद सबसे अच्छा नहीं था, लेकिन पहला दृष्टिकोण जो मैंने माना था।

जब भी यह वर्तमान परीक्षण के दोनों मामलों के लिए काम करता है तो कुछ चेतावनी हैं:

  • इसमें प्रमुख स्थान शामिल हैं (जो मैंने नियमों में उल्लेख नहीं किया था ...); तथा
  • यह निश्चित रूप से एक 'पॉकेट' के साथ काम नहीं करेगा जिसमें मध्य में वर्ण होते हैं (यू आकार या इसी तरह के)।

मैं इस पर काम करना जारी रखना चाहता हूं, लेकिन यह दिखाना चाहता हूं कि सवाल में दिलचस्पी है! अगर मददगार हो तो मेरी प्रक्रिया का दस्तावेजीकरण करने में खुशी होगी।


5

पायथन 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:]])

एक कार्यक्रम के रूप में काम करता है (एक पुनरावर्ती कार्य पर बैंकिंग) और स्टड से इनपुट स्वीकार करना।
यहां डेमो करें।
इसका परीक्षण ( ex1.txtऔर ex2.txtप्रश्न से उदाहरण हैं) -

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

टिप्पणियों के साथ Ungolfed संस्करण -

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

मुझे पता है, अगर मैंने कुछ बेवकूफी की या कुछ बेहतर किया जा सकता है।
मुझे पता है कि यह लूंग है, लेकिन यह सबसे अच्छा मैं कर सकता हूं: पी


एह, मैं पायथन में बहुत बुरा हूँ, मैं शायद इसे बलपूर्वक बाध्य करूँगा / करूँगी। मुझे पाइथन में लैम्ब्डा का कोई ज्ञान नहीं है ... // लेकिन अच्छा समाधान! फिर भी किसी से बेहतर नहीं।
कुरासगी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.