चक्रव्यूह में क्रमचय का वर्णन करें


15

एक प्रसिद्ध प्रमेय है कि किसी भी क्रमचय को चक्र के एक सेट में विघटित किया जा सकता है । आपका काम ऐसा करने के लिए सबसे कम संभव कार्यक्रम लिखना है।

इनपुट:

दो लाइनें। पहले में एक संख्या होती है N, दूसरे में रिक्त स्थान द्वारा अलग की गई Nसीमा में [0,N-1]अलग- अलग पूर्णांक होते हैं । ये पूर्णांक Nतत्वों के क्रमचय का प्रतिनिधित्व करते हैं।

आउटपुट:

क्रमचय में प्रत्येक चक्र के लिए एक पंक्ति। प्रत्येक पंक्ति को चक्र क्रम में पूर्णांकों की एक अलग-अलग सूची होनी चाहिए।

चक्र किसी भी क्रम में आउटपुट हो सकते हैं, और प्रत्येक चक्र किसी भी स्थिति में शुरू हो सकता है।

उदाहरण 1:

8
2 3 4 5 6 7 0 1

यह इनपुट क्रमचय 0-> 2, 1-> 3, 2-> 4, 3-> 5, 4-> 6, 5-> 7, 6-> 0, 7-> 1 को एन्कोड करता है। यह इस तरह चक्र में विघटित होता है:

0 2 4 6
1 3 5 7

समान रूप से मान्य आउटपुट होगा

5 7 1 3
2 4 6 0

उदाहरण 2:

8
0 1 3 4 5 6 7 2

मान्य आउटपुट:

0
1
4 5 6 7 2 3

@ कीथ एन का अधिकतम मूल्य क्या है?
fR0DDY

3
J में 3 वर्ण:>C.
इब्राक्स

मान लीजिए एन <1000।
कीथ रान्डेल

क्रमपरिवर्तन को आम तौर पर 1 से नहीं, 0 से गिना जाता है।
डॉ। बेलिसरियस

6
गणितज्ञों की गिनती 1 से होती है, कंप्यूटर वैज्ञानिक 0 :) से गिनती करते हैं
कीथ रान्डेल

जवाबों:


4

C 145 134 अक्षर

N,A[999],i,j,f;main(){gets(&i);for(;~scanf("%d",A+N);)N++;for(;j<N;j++,f=f&&!puts(""))while(i=A[j]+1)f=printf("%d ",j),A[j]=-1,j=--i;}

http://www.ideone.com/BrWJT


क्या यह कथित रूप से घोषित रूप से भिन्न कार्यों के लिए कानूनी है? क्या पहले छोड़ना कानूनी है int?
6502

जब तक कोड काम करता है तब तक कुछ भी करना कानूनी है। हालांकि यह चेतावनी दे सकता है, जब तक कि यह त्रुटियां नहीं देता है, यह ठीक होना चाहिए।
fR0DDY

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

+1: मुझे gets(&i)उस बेकार पहली पंक्ति से छुटकारा पाने का विचार पसंद है , हालांकि यह स्पष्ट रूप से 16-बिट सिस्टम पर काम नहीं करेगा यदि 10 से अधिक तत्व पारित हो गए हैं। लेकिन एक बार फिर अगर नियम "कम से कम एक प्रोग्राम है जो एक सी संकलक होने का दावा करता है जो एक निष्पादन योग्य बनाता है जहां कम से कम एक मामला लगता है - कम से कम मुझे - एक वैध प्रतिक्रिया देने के लिए" तो यह एक सुधार है: - )
६५०२

2

पायथन 131 वर्ण

input();d=dict((i,int(x))for i,x in enumerate(raw_input().split()))
while d:
 x=list(d)[0]
 while x in d:print x,;x=d.pop(x)
 print

अंतिम नई पंक्ति की आवश्यकता नहीं है


1

हास्केल, 131 अक्षर

n%l|all(>n)l=(n:l>>=(++" ").show)++"\n"|1<3=""
c(_:a)=a>>=(\n->n%(takeWhile(/=n)$iterate(a!!)$a!!n))
main=interact$c.map read.words
  • संपादित करें: (135 -> 131) >=बन गया >, दो सफाया tailकॉल हालांकि पैटर्न मिलान और के पूर्व आवेदन a!!

1

सी (प्रकार), 139 वर्ण

n,j,t,a[999];main(){scanf("%*i");for(;scanf("%i",a+n)>0;)n++;while(n--)if(a[j=n]+1){for(;t=a[j]+1;a[j]=-1,j=t)printf("%i ",--t);puts("");}}

अंतिम न्यूलाइन शामिल नहीं है।

मैंने कहा "सॉर्ट-ऑफ" क्योंकि AFAIK उदाहरण के लिए

  1. यह चर कार्यों के लिए घोषणा को वैध नहीं है (ANSI C89: 3.3.2.2)
  2. int चर घोषणा के लिए छोड़ा नहीं जा सकता है (मुझे नहीं पता था कि यह कहां कहा गया है कि इसे छोड़ा जा सकता है और अंतर्निहित प्रकार की घोषणा कार्यों के लिए वर्णित है। मानक में व्याकरण विनिर्देश मूल रूप से बेकार है क्योंकि मान्य सी घोषणाओं की तुलना में बहुत अधिक है। double double void volatile x; )
  3. एक गैर-रिक्त स्रोत फ़ाइल के अंत में एक नई लाइन अनिवार्य है (ANSI C89: A.6.2)

लेकिन उपरोक्त कोड gcc -ocycles cycles.cवैसे भी स्पष्ट रूप से काम करता है।


यह एक मान्य C प्रोग्राम है, लेकिन यह C99 नहीं है।
क्विक्सोटिक

@ डीबन: नहीं, यह एएनएसआई सी नहीं है (89 भी नहीं)। उदाहरण के लिए मानक कहते हैं (3.3.2.2) कि यदि कोई फ़ंक्शन किसी चर संख्या के तर्कों का उपयोग करता है, तो इसे फ़ंक्शन कॉल साइट पर स्पष्ट रूप से घोषित नहीं किया जा सकता है (दूसरे शब्दों में आप पैरामीटर को सही scanfकिए बिना #include <stdio.h>भी कॉल नहीं कर सकते हैं और रूपांतरण की आवश्यकता नहीं है ):<<If the function is defined with a type that includes a prototype, and the types of the arguments after promotion are not compatible with the types of the parameters, or if the prototype ends with an ellipsis ( ", ..." ), the behavior is undefined.>>
६५०२

1

J (2 से 32 के बीच)

मैं i / o प्रारूप पर बिल्कुल स्पष्ट नहीं हूं, लेकिन मुझे लगता है कि C.यदि निम्न आउटपुट को स्वीकार किया जाएगा, तो मैं करूंगा:

   C. 0 1 3 4 5 6 7 2
┌─┬─┬───────────┐
│0│1│7 2 3 4 5 6│
└─┴─┴───────────┘

(यह जे टर्मिनल में बेहतर दिखता है।)

यदि इसे एक नामित फ़ंक्शन होना चाहिए, जो i / o प्रारूप की मेरी सबसे अच्छी समझ के लिए अनुपालन करता है, तो यह 32 वर्ण होगा, जिनमें से 30 आउटपुट स्वरूप रूपांतरण के लिए हैं ...

g=:>@(":L:0)@(C.@".@}.~>:@i.&LF)

कार्रवाई में:

   g=:>@(":L:0)@(C.@".@}.~>:@i.&LF)
   g
>@(":L:0)@(C.@".@}.~ >:@i.&(10{a.))
   t
8
0 1 3 4 5 6 7 2
   g t
0          
1          
7 2 3 4 5 6

स्पष्टीकरण:

J को दाएं से बाएं (व्यावहारिक रूप से) निष्पादित किया जाता है। @एक 'फ़ंक्शन' है (तकनीकी रूप से एक फ़ंक्शन नहीं है, लेकिन फ़ंक्शन को संयोजित करने के लिए पर्याप्त है)।

  • i.&LF- के पहले सूचकांक को खोजें LF, एक पूर्वनिर्धारित चर जिसमें ASCII वर्ण संख्या 10, रेखा फ़ीड है।
  • >:- पहले खोजें LF, और वेतन वृद्धि यह एक के बाद एक सूचकांक है। हम वास्तव में लाइनफीड नहीं चाहते हैं, हम उस सरणी को चाहते हैं जो इसका अनुसरण करती है।
  • }.~ - उस इनपुट के भाग का चयन करता है जिसे हम चाहते हैं।
  • ".- चूंकि इनपुट प्रारूप वैध है J ( * \ \ / * ) हम evalक्रिया का उपयोग कर सकते हैं (मुझे पता है कि इसे वास्तव में नहीं कहा जाता है eval।) इसे एक सरणी में बदलने के लिए।
  • C.- शुद्ध जादू। मुझे वास्तव में पता नहीं है कि यह क्या करता है, लेकिन यह काम करने लगता है!
  • ":L:0- प्रतिनिधित्व। का आउटपुट चालू करता हैC.स्ट्रिंग्स के बॉक्सिंग अनुक्रम में
  • >- अनबॉक्स। वास्तविक आउटपुट वास्तव में एक स्ट्रिंग सरणी है (उदाहरण के नंबरों के पीछे रिक्त स्थान हैं)।

0

लौंग, 145

(let[v(vec(repeatedly(read)read))](loop[a(set v)b 0](cond(a(v b))(do(print" "b)(recur(disj a(v b))(v b)))(seq a)(do(prn)(recur a(first a)))1"")))

कुछ हद तक असंयमित, और एक फंक्शन में टूट गया (इनपुट एक वेक्टर होना चाहिए, जो कि क्या है (वीसी (बार-बार पढ़ा गया)) ऊपर से उत्पन्न होता है):

(defn p [v]
  (loop [a (set v) b 0]
    (cond
     (a (v b)) (do (print" "b) (recur (disj a (v b)) (v b)))
     (seq a) (do (prn) (recur a (first a)))
     1 "")))

(वाह, सिर्फ इस चुनौती को देखा 3 साल से अधिक पुराना है। ओह, यह वैसे भी करने में मज़ा आया!)

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