순열을 순환으로 분해


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

@Keith N의 최대 값은 얼마입니까?
fR0DDY

3
J에 3 개의 문자 :>C.
Eelvex

N <1000이라고합시다.
Keith Randall

순열은 일반적으로 0이 아닌 1부터 계산됩니다.
belisarius 박사

6
수학자 1에서 계산, 컴퓨터 과학자 0에서 계산 :)
Keith Randall

답변:


4

C 145134 문자

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

코드가 작동하는 한 아무 것도하지 않는 것이 합법입니다. 오류가 발생하지 않는 한 경고를 표시 할 수 있지만 Ok 여야합니다.
fR0DDY

요점은 "작품"의 의미에있다. 어쨌든 저는이 규칙을 사용하는 답변 (139 자)을 추가했습니다. 즉, "works"는 "생성 된 머신 코드가 작동하는 최소한 하나의 자체 선언 된 C 컴파일러가 있음"을 의미합니다.
6502

+1 : gets(&i)쓸모없는 첫 줄을 없애는 아이디어가 마음에 들지만 10 개 이상의 요소가 전달되면 16 비트 시스템에서는 작동하지 않습니다. 그러나 규칙이 "적어도 하나의 경우-적어도 나에게-유효한 응답을주는 것처럼 보이는 실행 파일을 만드는 C 컴파일러라고 주장하는 프로그램을 찾는 경우"는 다음과 같이 개선되었습니다. )
6502

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

C (정렬), 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변수 선언의 경우 생략 할 수 없습니다 (나는 생략 할 수있는 곳을 찾지 못했으며 암시 적 유형 선언은 함수에 대해서만 설명됩니다. 표준의 문법 사양은 기본적으로 유효한 C 선언보다 훨씬 많은 것을 허용하므로 쓸모가 없습니다 double double void volatile x;)
  3. 비어 있지 않은 소스 파일 끝에 줄 바꿈이 필수입니다 (ANSI C89 : A.6.2).

그러나 위의 코드 gcc -ocycles cycles.c는 어쨌든 작동합니다.


이것은 유효한 C 프로그램이지만 C99는 아닙니다.
Quixotic

@ Debanjan : 아니요 ANSI C가 아닙니다 (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.>>
6502

1

J (2와 32 사이)

나는 I / O 형식에 대해 명확하지 않지만 C.다음 출력이 허용되면 그렇게 할 것이라고 생각 합니다.

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

(J 터미널에서 더 좋아 보입니다.)

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.&LFLF-ASCII 문자 번호 10, 줄 바꿈을 포함하는 사전 정의 된 변수 의 첫 번째 색인을 찾습니다 .
  • >:-첫 번째를 찾아 LF색인을 하나씩 증가시킵니다. 우리는 실제로 줄 바꿈을 원하지 않고 그 뒤에 오는 배열을 원합니다.
  • }.~ -원하는 입력 부분을 선택합니다.
  • ".-입력 형식이 유효한 J ( * \ õ / * ) eval이므로 동사를 사용하여 실제로 호출되지는 않습니다 eval. 배열로 바꿉니다.
  • C.-순수한 마법. 나는 이것이 무엇을하는지 전혀 모른다. 그러나 그것은 효과가있는 것처럼 보인다!
  • ":L:0-대표. 출력을 C.박스 화 된 문자열 시퀀스로 바꿉니다.
  • >-Unbox. 실제 출력은 실제로 문자열 배열입니다 (예제에서 첫 번째 숫자부터 공백이 있습니다).

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 살이 넘었습니다. 아, 어쨌든 재미있게 놀았습니다!)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.