एक क्रमचय पथ बनाएं


20

ऊर्ध्वाधर आड़ा-पार ट्यूबों के सेट के रूप में निम्नलिखित आरेखों की कल्पना करें।

1 2    1 2    1 2 3 4
\ /    \ /    \ / \ /
 X      |      |   |
/ \    / \    / \ / \
2 1    1 2   |   X   |
              \ / \ /
               X   X
              / \ / \
              3 1 4 2

बाईं ओर के आरेख में, 1और 2अपने संबंधित स्लैश को नीचे की ओर स्लाइड करें X, जहां से शुरू किया गया है, वहां से विपरीत दिशाओं में पार करें ।

मध्य आरेख में यह समान विचार है, लेकिन यह |दर्शाता है कि रास्ते पार नहीं करते हैं, इसलिए कुछ भी नहीं बदलता है।

सबसे दाहिनी आरेख एक अधिक जटिल ट्यूब मार्ग दिखाती है जो परमिट 1 2 3 4करता है 3 1 4 2

लक्ष्य

इस कोड गोल्फ चैलेंज में आपका लक्ष्य इन "ट्यूब राउटिंग डायग्राम" को तैयार करना है, जैसे कि एक क्रमपरिवर्तन 3 1 4 2। बाइट्स में सबसे छोटा कार्यक्रम जीत जाएगा।

विवरण

  1. इनपुट स्टड से आता है, 1 से n तक की संख्या के किसी भी क्रमपरिवर्तन के रूप में रिक्त स्थान द्वारा अलग किया जाता है, जहां n एक सकारात्मक पूर्णांक है। आप मान सकते हैं कि सभी इनपुट अच्छी तरह से बने हैं।
  2. मार्ग आरेख उत्पादन stdout के लिए चला जाता है।

    • "हटा कर" संख्या 1 के माध्यम से n आरेख के शीर्ष में क्रम में इनपुट क्रमचय तल पर बाहर आने में परिणाम चाहिए। (ऊपर और नीचे हमेशा स्लैश की परतें हैं।)
    • आरेख बेहतर छोटे होने की जरूरत नहीं है। यह जब तक यह सही है आवश्यक के रूप में कई स्तरों के रूप में हो सकता है।
    • आरेख में केवल वर्णों के \/ X|साथ-साथ newlines (संख्याएं) नहीं होनी चाहिए ।
    • |हमेशा सबसे बाहरी चौराहों पर इस्तेमाल किया जाना चाहिए क्योंकि उपयोग Xकरने से कोई मतलब नहीं होगा।
    • कुछ प्रमुख या अनुगामी रिक्त स्थान ठीक हैं जब तक कि आरेख सही ढंग से तैयार नहीं हो जाता है।

उदाहरण

की एक इनपुट 3 1 4 2शक्ति उपज (ऊपर के रूप में ही)

 \ / \ /
  |   | 
 / \ / \
|   X   |
 \ / \ /
  X   X 
 / \ / \

की एक इनपुट 1शक्ति का उत्पादन

 \
  |
 /
|
 \
  |
 /

की एक इनपुट 3 2 1शक्ति का उत्पादन

 \ / \
  X   |
 / \ /
|   X
 \ / \
  X   |
 / \ /

की एक इनपुट 2 1 3 4 6 5शक्ति का उत्पादन

\ / \ / \ /
 X   |   X
/ \ / \ / \

4
बड़ा अच्छा सवाल! मुझे विश्वास नहीं हो रहा है कि यह केवल दो सप्ताह है जिसमें आप शामिल हुए हैं - आप हर जगह प्रतीत होते हैं।
xnor

@xnor: डी एक गुच्छा धन्यवाद। लेकिन वास्तव में मैं यहाँ बहुत ज्यादा समय किया गया है ...
केल्विन के शौक

एक कर सकते हैं Xसीधे एक से कनेक्ट |तरीका एक /करता है? एक और करने के लिए X?
XNOR

1
@xnor नहीं। यह हमेशा में होना चाहिए row of slashes, row of X's and |'s, row of slashes, row of X's and |'s, ... प्रारूप।
केल्विन के शौक

कर सकते हैं n10 से भी बड़ा हो सकता है?
Οurous

जवाबों:


4

पायथन 2, 218 219 220 222 224 227 243 247 252 259 261 264

l=map(int,raw_input().split())
f=n=len(l)
o=s=n*' \ /'
while f+n%2:
 f-=1;i=f+n&1;a=s[2*i:][:2*n]+'\n|   '[::2-i]
 while~i>-n:a+='|X'[l[i+1]<l[i]]+'   ';l[i:i+2]=sorted(l[i:i+2]);i+=2
 o=a+f%2*'|'+'\n'+o
print o[:-2*n]

मैं एक अलग दृष्टिकोण लिया: मैं इनपुट सॉर्ट करने के लिए आवश्यक स्वैप मिल जाए, तो खड़ी है कि उलट इनपुट में क्रमबद्ध सूची चालू करने के लिए आवश्यक स्वैप मिलता है। इस दृष्टिकोण के एक अतिरिक्त बोनस के रूप में, यह संख्याओं की एक मनमानी सूची ले सकता है और इनपुट में इनपुट के प्रकार को चालू करने के लिए क्रमचय पथ दे सकता है।

उदाहरण:

$ python sort_path.py <<< '3 1 4 5 9 2 6 8 7'
 \ / \ / \ / \ / \
  |   |   |   |   |
 / \ / \ / \ / \ /
|   |   |   |   |   
 \ / \ / \ / \ / \
  |   |   |   |   |
 / \ / \ / \ / \ /
|   |   |   |   |   
 \ / \ / \ / \ / \
  |   |   |   |   |
 / \ / \ / \ / \ /
|   X   |   |   X   
 \ / \ / \ / \ / \
  |   X   |   X   |
 / \ / \ / \ / \ /
|   |   X   X   |   
 \ / \ / \ / \ / \
  X   |   X   |   |
 / \ / \ / \ / \ /
|   |   |   |   X   
 \ / \ / \ / \ / \

सुधार:

264 -> 261: जबकि करने के लिए से बाहरी पाश स्विच किया गया।

261 -> 259: f%2इसके बजाय इस्तेमाल किया जाता है (c^m), क्योंकि अजगर अंकगणितीय संचालकों में बिटवाइज़ ऑपरेटरों की तुलना में अधिक प्राथमिकता होती है।

259 -> 252: जबकि करने के लिए से भीतरी पाश स्विच किया गया। संयुक्त iऔर cचर।

252 -> 247: बदला गया निर्माण तो उलटे क्रम में बस का निर्माण करने के लिए रिवर्स।

247 -> 243: के बजाय में शामिल होने का उपयोग करने के लिए मैन्युअल रूप से जोड़ा नई-पंक्तियों,।

243 -> 227: स्लैश लाइन जनरेशन की grc की विधि को अपनाया (धन्यवाद grc!) और गयी s।

227 -> 224: %4विस्तारित स्लाइस का उपयोग करके एक चरित्र को हटाने और एक चरित्र को बचाने के लिए लूप में आने से पहले इनर स्लैश लाइन पीढ़ी तक ले जाया गया ।

224 -> 222: निकाले गए एम।

222 -> 220: f%2+n%2->f+n&1

220 -> 219: | 1<n-1|-> |~i>-n|(प्रमुख स्थान हटा दिया गया)

219 -> 218: के प्रारंभिक संकलनों को जोड़ा oऔर sअंत तक टुकड़ा को स्थानांतरित कर दिया।


9

पायथन, 290

def g(o,u=1):
 s=['|']*o
 for i in range(o,n-1,2):v=r[i+1]in a[:a.index(r[i])]*u;s+=['|X'[v]];r[i:i+2]=r[i:i+2][::1-2*v]
 print'  '*(1-o)+'   '.join(s+['|']*(o^n%2))*u+'\n'*u+(' / \\'*n)[2*o:][:n*2]
a=map(int,raw_input().split())
n=len(a)
r=range(1,n+1)
o=1
g(1,0)
g(0)
while r!=a:g(o);o^=1

मैं काफी बुनियादी दृष्टिकोण के लिए गया था, लेकिन मुझे उम्मीद थी कि यह थोड़ा लंबा हो गया। यह जोड़े में सूची पर विचार करता है और यह तय करता है कि प्रत्येक जोड़ी को स्वैप करना है या नहीं। जब तक सूची इनपुट से मेल नहीं खाती तब तक यह प्रत्येक इंटरसेक्टिंग पंक्ति के लिए दोहराया जाता है।

उदाहरण:

$ python path.py
5 3 8 1 4 9 2 7 6
 \ / \ / \ / \ / \
  |   |   |   X   |
 / \ / \ / \ / \ /
|   X   X   X   X
 \ / \ / \ / \ / \
  X   X   X   X   |
 / \ / \ / \ / \ /
|   X   X   |   X
 \ / \ / \ / \ / \
  X   X   X   |   |
 / \ / \ / \ / \ /
|   |   |   X   |
 \ / \ / \ / \ / \

2

HTML जावास्क्रिप्ट, 553 419

मेरी त्रुटियों को इंगित करने के लिए @izlin और @TomHart को धन्यवाद।

p=prompt();b=p.split(" "),l=b.length,d=l%2,o="",s=["","","\\/"],n="\n",a=[];for(i=0;i<l;i++){a[b[i]-1]=i+1;s[1]+=" "+s[2][i%2];s[0]+=" "+s[2][(i+1)%2];o+=" "+(i+1)}s[1]+=n,s[0]+=n;o+=n+s[1];f=1,g=2;do{var c="";for(var i=(f=f?0:1);i<l-1;i+=2)if(a[i]>a[i+1]){c+="  x ";g=2;t=a[i];a[i]=a[i+1];a[i+1]=t;}else c+="  | ";if(g==2){o+=(d?(f?"| "+c:c+"  |"):(f?"| "+c+"  |":c))+n;o+=(s[f]);}}while(--g);o+=" "+p;alert(o);

यहां टेस्ट करें: http://goo.gl/NRsXEj
यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें


आपने एक छोटी सी गलती की: पहली पंक्ति क्रमबद्ध संख्याओं की होनी चाहिए और अंतिम पंक्ति ऊपर के उदाहरणों की तरह आपका इनपुट होनी चाहिए।
izlin

तुम सही हो। धन्यवाद। मैंने @ grc के आउटपुट को देखा और सोचा कि संख्याएँ शुरुआती स्थिति हैं। उफ़।
जेएफएसबी

मैं इस गलत को देख सकता हूं, लेकिन आपने जो चित्र पोस्ट किया है, उसमें अंतिम पंक्ति निरर्थक नहीं है क्योंकि कुछ भी नहीं बदलता है?
TMH

हाँ आप सही है। मुझे पता था कि मैंने यह कैसे किया, इसकी सहमति थी। लेकिन यह शायद नहीं है। मैं इस बारे में सोचूंगा। टिप्पणी के लिए धन्यवाद।
जेएफएसबी

@ मिज़लिन - यह ध्यान देने के लिए धन्यवाद। मैंने यह त्रुटि ठीक की।
जेएफएसबी

1

जावास्क्रिप्ट - 395

378 अगर मैं अपने उत्पादन पर संख्या मुद्रित नहीं है, लेकिन यह ज्यादा बेहतर लग रहा है और पठनीयता में सुधार।
इसका परीक्षण यहां करें । (ungolfed संस्करण के साथ)

गोल्फ संस्करण:

a=prompt(),n=a.split(" "),l=n.length,k=[],s="",i=1;for(j=0;j<l;j++){k[n[j]-1]=j+1;s+=" "+(j+1)}s+="\n";while(i++){for(j=0;j<l;j++)s+=i%2?j%2?" \\":" /":j%2?" /":" \\";for(z=0,y=0;z<l-1;z++)if(k[z]>k[z+1])y=1;if(y==0&&i!=2)break;s+="\n";for(m=i%2;m<l;m+=2){s+=i%2&&m==1?"|":"";if(k[m]>k[m+1]){[k[m],k[m+1]]=[k[m+1],k[m]];s+=i%2?"   X":"  X "}else{s+=i%2?"   |":"  | "}}s+="\n"}s+="\n "+a;alert(s)

व्याख्या

पहले मैं इनपुट को इंडेक्स संख्या के साथ और सब कुछ बदल देता हूं। उदाहरण के लिए

3 1 4 2
v v v v substitude with
1 2 3 4

so the first line will become:
1 2 3 4
v v v v
2 4 1 3

sorting 1,2,3,4 to 3,1,4,2 is equivalent to 2,4,1,3 to 1,2,3,4

इस प्रतिस्थापन के साथ मैं एक बबल-सॉर्ट एल्गोरिथ्म का उपयोग 2,4,1,3 से 1,2,3,4 सॉर्ट करने के लिए कर सकता हूं और ग्राफ सबसे कम संभव होगा जिसे हम खोज रहे हैं।
यदि आपके पास कोई विचार है कि मैं कोड को कैसे छोटा कर सकता हूं तो टिप्पणी करें :)

उदाहरण

input: 3 4 2 1 7 5 6
output:
 1 2 3 4 5 6 7
 \ / \ / \ / \
  X   |   |   | 
 / \ / \ / \ /
|   X   |   X
 \ / \ / \ / \
  X   X   X   | 
 / \ / \ / \ /
|   X   |   |
 \ / \ / \ / \
 3 4 2 1 7 5 6


(1) मैं देखता हूं कि आप तीन स्थानों पर बीआर टैग का उपयोग करते हैं, और इसलिए आप इसे एक चर में डालकर थोड़ा बचा सकते हैं। इसके अलावा, आप शायद PRE के आउटपुट के बाद से \ n का उपयोग कर सकते हैं।
JeffSB

(2) मैं जावास्क्रिप्ट गोल्फ और भी सुविधाजनक इनपुट और आउटपुट होने से निपटने के लिए अलग अलग तरीकों से कोशिश कर रहा हूँ। मैं मैं अपने नवीनतम विधि से प्रेरित तरह लगता है कि आपके शीघ्र और सतर्क ... मैं शीघ्र और कोड में चेतावनी उपयोग करती हैं इसलिए एक कंसोल में चिपकाया जा सकता है और यह किसी के लिए भी काम करता है। लेकिन मैं यह भी एक पाठ क्षेत्र और पूर्व काम कर यह दिखाने के लिए के साथ एक वेबपृष्ठ बनाया है। वेबपेज शीघ्र और सतर्क पाठ क्षेत्र और पूर्व उपयोग करने के लिए ओवरराइड करता है - तो यह एक ही कोड है और वहाँ कम भ्रम की स्थिति है - हो सकता है?
JeffSB

@JeffSB मैं इस्तेमाल किया <br>, केवल jsfiddle पर टैग और पाठ क्षेत्र है क्योंकि यह ज्यादा बेहतर लग रहा है। चेतावनी नहीं फ़ॉन्ट Monospaced तो उत्पादन बुरा लग रहा है की है। मेरी golfed संस्करण मैं उपयोग चेतावनी में और \ n। अपने वेबपेज सार्वजनिक है?
izlin

1

कोबरा - 334 344 356 360

class P
    def main
        a,o,n=CobraCore.commandLineArgs[1:],['/','\\'],0
        c,l=a.count,a.sorted
        while (n+=1)%2or l<>a
            p,d='',(~n%4+4)//3
            for i in n%2*(c+1-c%2),p,o=p+o[1]+' ',[o.pop]+o
            for i in 1+d:c-n%2*c:2
                z=if(l[:i]<>a[:i],1,0)
                l.swap(i-z,i)
                p+=' ['|X'[z]]  '
            print[['','| '][d]+[p,p+'|'][d^c%2],p][n%2][:c*2]

यह बाईं से शुरू जगह में प्रत्येक तत्व को ले जाकर काम करता है। इस के कारण, यह अक्सर उत्पादन एक हास्यास्पद बड़ा (हालांकि अभी भी सही) पथ-नक्शा।

उदाहरण:

3 1 4 2

\ / \ / 
 X   X  
/ \ / \ 
|  X  |
\ / \ / 
 X   X  
/ \ / \ 
|  X  |
\ / \ / 
 X   X  
/ \ / \ 
|  X  |
\ / \ / 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.