반복 할 때까지 변환 횟수


12

정수의 시퀀스가 ​​주어 지거나 0..N 다음과 같이이 시퀀스 의 변환 순열이 더 구체적입니다 .

  • 출력 [x] = 역 (입력 [입력 [x]])
  • 반복

예를 들어 : [2,1,0]makes [0,1,2]and reversed is [2,1,0]입니다. [0,2,1]되고 [0,1,2]반전 [2,1,0]됩니다.

실시 예 1

In:   0 1 2
S#1:  2 1 0
S#2:  2 1 0
Output: 1

실시 예 2

In:   2 1 0
S#1:  2 1 0
Output: 0

실시 예 3

In:   3 0 1 2
S#1:  1 0 3 2
S#2:  3 2 1 0
S#3:  3 2 1 0
Output: 2

실시 예 4

In:   3 0 2 1
S#1:  0 2 3 1
S#2:  2 1 3 0
S#3:  2 0 1 3
S#4:  3 0 2 1
Output: 3

당신의 임무는 정수의 순열을 취하고 0..N이미 발생한 순열이 발생할 때까지 단계 수를 반환 (또는 출력) 하는 함수 (또는 프로그램)를 정의하는 것 입니다. 경우 X변환을 위해 X그 출력은 제로이어야하는 경우 X에 변형 YY행이 X(또는 Y) 그 출력이 1이어야한다.

Y -> Y: 0 steps
Y -> X -> X: 1 step
Y -> X -> Y: 1 step
A -> B -> C -> D -> C: 3 steps
A -> B -> C -> D -> A: 3 steps
A -> B -> C -> A: 2 steps
A -> B -> C -> C: 2 steps
A -> B -> C -> B: also 2 steps

테스트 케이스 :

4 3 0 1 2 -> 0 3 4 1 2 -> 4 3 2 1 0 -> 4 3 2 1 0: 2 steps 
4 3 2 1 0 -> 4 3 2 1 0: 0 steps
4 3 1 2 0 -> 4 1 3 2 0 -> 4 3 2 1 0 -> 4 3 2 1 0: 2 steps
1 2 3 0 4 -> 4 1 0 3 2 -> 0 3 4 1 2 -> 4 3 2 1 0 -> 4 3 2 1 0: 3 steps
5 1 2 3 0 4 -> 0 5 3 2 1 4 -> 1 5 3 2 4 0 -> 1 4 3 2 0 5 -> 
  5 1 3 2 0 4 -> 0 5 3 2 1 4: 4 steps

언어는 "기능"을 지원하지 않는 경우에는 공백이 정수의 목록을 구분으로 순서가 같은 주어진 것으로 가정 할 수 0 1 2또는 3 1 0 2한 줄에.

재미있는 사실:

  • 시퀀스 0,1,2,3, .., N은 항상 N, ..., 3,2,1,0으로 변환됩니다.
  • 시퀀스 N, .., 3,2,1,0은 항상 N, .., 3,2,1,0으로 변환됩니다.
  • 시퀀스 0,1,3,2, ..., N + 1, N은 항상 N, ..., 3,2,1,0으로 변환됩니다.

보너스 작업 : 수학 공식을 알아냅니다.

선택적 규칙 :

  • 언어의 첫 번째 색인이 0 대신 1 인 경우 순열을 사용할 수 있습니다 1..N(예와 테스트 사례에서 모든 정수에 1을 추가 할 수 있음).

나는 $ f (a_ {0}, a_ {1}, a _ {...}} = a_ {0} ^ a_ {1} + ... $와 같은 "닫힌 수식"과 같은 의미를 가졌습니다. 여기서 $ a_ { i} $는 주어진 순서에서 i 번째 요소입니다
mroman

"닫힌 수식"이 존재합니까?
Todd Sewell

" 는 이미 발생한 순열이 발생할 때까지 단계 수를 반환 (또는 출력)합니다. "이는 뒤에 나오는 모든 것과 거의 일치하지 않습니다. 시작으로, 그것은 0의 반환 값을 불가능하게합니다 ...
피터 테일러

세 번째 예가 맞습니까? 다음과 같이 3,0,1,22,3,0,1
바뀌어야

반복 전의 변환 횟수입니다.
mroman

답변:




3

Pyth, 10 9 8 바이트

tl.u@LN_

설명:

t               One less than
 l              the number of values achieved by
  .u            repeating the following lambda N until already seen value:
    @LN_N         composing permutation N with its reverse
         Q      starting with the input.

테스트 스위트 .


3

하스켈, 52 바이트

([]#)
a#x|elem x a= -1|n<-x:a=1+n#reverse(map(x!!)x)

온라인으로 사용해보십시오!

a # x                -- function '#' takes a list of all permutations
                     -- seen so far (-> 'a') and the current p. (-> 'x')
  | elem x a = -1    -- if x has been seen before, return -1 
  | n<-x:a =         -- else let 'n' be the new list of seen p.s and return
    1 +              -- 1 plus
       n #           -- a recursive call of '#' with the 'n' and
        reverse ...  -- the new p.

([]#)                -- start with an empty list of seen p.s 

3

펄 6 , 44 35 바이트

nwellnhof 덕분에 -9 바이트

{($_,{.[[R,] |$_]}...{%.{$_}++})-2}

온라인으로 사용해보십시오!

설명:

{                              }  # Anonymous code block
                  ...    # Create a sequence where:
  $_,  # The first element is the input list
     {.[[R,] |$_]} # Subsequent elements are the previous element reverse indexed into itself
                     {        }    # Until
                      %.{$_}       # The index of the listt in an anonymous hash is non-zero
                            ++     # Then post increment it
 (                            )-2  # Return the length of the sequence minus 2

2

J, 33 27 26 바이트

버블 러 덕분에 -7

_1(+~:i.0:)|.@C.~^:(<@!@#)

온라인으로 사용해보십시오!

어떻게

원래 설명. 나의 마지막 개선점은 "우리가 이미 본 첫 번째 요소의 색인"을 찾은 부분 만 변경합니다. 이제 더 적은 바이트로 "nub sieve"를 사용합니다.

1 <:@i.~ [: ({: e. }:)\ |.@C.~^:(<@!@#)
                        |.@C.~          NB. self-apply permutation and reverse
                              ^:        NB. this many times:
                                (<@!@#) NB. the box of the factorial of the
                                        NB. the list len.  this guarantees
                                        NB. we terminate, and the box means
                                        NB. we collect all the results
         [: ({: e. }:)\                 NB. apply this to those results:
                      \                 NB. for each prefix
             {: e. }:                   NB. is the last item contained in 
                                        NB. the list of previous items?
1 <:@i.~                                NB. in that result find:
1    i.~                                NB. the index of the first 1
  <:@                                   NB. and subtract 1

마지막 문구 전체 1<:@i.~[:({:e.}:)\는 "이미 본 첫 번째 요소의 색인"을 찾는 데 사용됩니다. 이것은 그것을 얻기 위해 끔찍하게 보인다, 그러나 나는 그것을 더 골프 수 없습니다. 제안을 환영합니다.




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