가능한 모든 사이클 길이


21

입력을 받아서 출력을 제공하는 함수 (또는 프로그램)는 함수를 자체 출력으로 반복해서 호출하면 결국 원래 번호에 도달하면주기를 갖는다 고 할 수 있습니다. 예를 들어 다음 기능을 수행하십시오.

Input:  n    1 2 3 4 5 6
Output: f(n) 5 7 1 3 4 9

우리가 시작하면 n=1, f(n)=5, f(f(n))=f(5)=4, f(f(f(n)))=f(4)=3, f(f(f(f(n))))=f(3)=1.

이것이 쓰여졌습니다 (1 5 4 3). 이 루프에는 4 개의 고유 한 숫자가 있기 때문에 길이 4의주기입니다.


당신의 도전은 가능한 모든 길이의 사이클을 가진 프로그램이나 함수를 작성하는 것입니다. 즉, 길이 1, 길이 2 등의주기가 있어야합니다.

또한 함수 / 프로그램은 양의 정수에서 양의 정수까지 여야하며 bijective 이어야합니다 . 즉, 모든 양의 정수에 대해 가능한 모든 출력 값마다 정확히 하나의 입력 값이 있어야합니다. 달리 말하면 함수 / 프로그램은 양의 정수의 순열을 계산해야합니다.


세부 사항 : STDIN, STDOUT, 함수 인수, 리턴 등을 포함한 모든 표준 입력 / 출력 시스템이 허용됩니다. 표준 허점은 금지됩니다.

데이터 유형의 제한에 대해 걱정할 필요가 없습니다. 위의 속성 은 예를 들어 int또는 float값을 보유 할 수 있다는 가정 하에서 만 유지하면 됩니다.

양의 정수가 아닌 입력에 대한 함수의 동작에는 제한이 없으며 해당 입력 / 출력은 무시됩니다.


점수는 바이트 단위의 코드 골프이며, 가장 짧은 코드가 이깁니다.


"길이 1, 길이 2 등 의 사이클 이 있어야합니다"이것은 " 길이 1 이상의 사이클, 길이 2 이상의 사이클이 있어야합니다"또는 " 길이 1, 길이 2 중 하나의주기 여야 합니다 . "
Bakuriu

@Bakuriu 각 양의 길이의 최소 한주기.
isaacg

답변:


11

Pyth, 11 8 바이트

.<W-0zz1

이전 답변보다 훨씬 지루합니다.

0 자리를 포함하는 모든 숫자는 그 자체로 매핑됩니다. 다른 숫자는 숫자가 1 씩 회전 한 숫자에 매핑됩니다. 예를 들어 :

1 -> 1
10 -> 10
15 -> 51 -> 15
104 -> 104
123 -> 231 -> 312 -> 123

8

파이썬 2, 56 55 54 바이트

n=input()
a=b=1
while a+b<=n:a+=b;b+=1
print(n+~a)%b+a

처음 21 개의 출력은 다음과 같습니다.

[1, 3, 2, 6, 4, 5, 10, 7, 8, 9, 15, 11, 12, 13, 14, 21, 16, 17, 18, 19, 20]

목록을 다음과 같이 덩어리로 나누면 패턴이 분명합니다.

 1    2  3    4  5  6    7  8  9  10    11  12  13  14  15    16  17  18  19  20  21
[1]  [3, 2]  [6, 4, 5]  [10, 7, 8, 9]  [15, 11, 12, 13, 14]  [21, 16, 17, 18, 19, 20]

젠장, 이것은 나도 가고있는 패턴이지만 닫힌 형태입니다.
orlp

1
재미있는 .. a- 값은 순서 A000124를 따릅니다 . 그러나 나는 당신이 이미 그것을 알고 있다고 생각합니다 : P
Kade

이 순서는 oeis.org/A066182 입니다.
orlp

8

Pyth, 25 바이트

+hK/*J/h@h*8tQ2 2tJ2%-QKJ

이것은 @ Sp3000과 동일하지만 닫힌 형식입니다. 닫힌 형태는 다음과 같습니다.

M (n) = 바닥 ((1 + sqrt (1 + 8 * (n-1))) / 2) B (n) = M (n) * (M (n)-1) / 2 f (n) = B (n) + ((n-B (n) + 1) 모드 M (n))


5

Python3, 40 바이트

n=input();print([n[1:]+n[0],n]['0'in n])

0 자리를 포함하는 모든 숫자는 그 자체로 매핑됩니다. 다른 숫자는 숫자가 1 씩 회전 한 숫자에 매핑됩니다. 예를 들어 :

1 -> 1
10 -> 10
15 -> 51 -> 15
104 -> 104
123 -> 231 -> 312 -> 123

1
데자뷰! 두 언어로 볼 수 있습니다.
Denham Coote

3

루비, 22 + 1 = 23

명령 행 플래그 -p를 사용하여

~/(.)(.?)/
$_=$1+$'+$2

(후미로 바꿈) 입력으로 다수의 스트링 표현을 부여 할 때, 그렇다면, 남은 잔여 회전, 제 자리 상수를 유지 1234하게된다 1342.

를 사용하면 21 자로 줄일 수 $_=$1+$'+$2if/(.)(.)/있지만 경고가 표시됩니다.


3

루비, 16 + 1 = 17

명령 행 플래그 -p를 사용하여

$_=$_[/.0*$/]+$`

이것은 내 다른 대답보다 더 복잡한 기능이지만 더 골프 타기 가능합니다 (후행 줄 바꿈에 견딜 수 있음). 입력의 마지막 0이 아닌 숫자와 후행 0을 가져 와서 숫자의 시작 부분으로 이동합니다. 이렇게 9010300됩니다 3009010. n이 아닌 숫자가 n 인 숫자는 n 길이주기의 일부입니다.

입력은 STDIN을 통한 모든베이스의 문자열이고 출력은 해당베이스의 문자열입니다.


2

파이썬, 43

Sp3000 기능역은 재귀 적으로 구현되었습니다.

f=lambda n,k=1:n>k and k+f(n-k,k+1)or n%k+1

이 기능은 1 사이클, 2 사이클, 3 사이클입니다.

(1)(2 3)(4 5 6)(7 8 9 10)(11 12 13 14 15)...

이 작업 n%k+1k숫자에 대한 주기 역할을 합니다 1..k. 적절한 찾으려면 k사용에 의해 시프트 모든 것을 내려 k=1다음, k=2때까지, 등등을 n<=k.


2

Pyth, 15 바이트

문자열 연산 대신 숫자 연산을 사용하는 지금까지 가장 짧은 대답.

.|.&Q_=.&_=x/Q2

    Q                input
            /Q2      input div 2
           x   Q     that XOR input
          =          assign that to Q
         _           negate that
       .&       Q    that AND Q
      =              assign that to Q
     _               negate that
  .&                 input AND that
.|               Q   that OR Q

이진 표현에 대한이 함수의 효과는 1의 가장 오른쪽 블록을 다음 0으로 확장하는 것입니다. 또는 0이 없으면 다시 단일 1로 재설정하십시오.

10010110100000 ↦  
10010110110000 ↦  
10010110111000 ↦  
10010110111100 ↦  
10010110111110 ↦  
10010110111111 ↦
10010110100000  

Pyth, 26 바이트, 재미있는 변형

.|.&Q_h.&/Q2+Qy=.&/Q2_h.|y

    Q                           input
         /Q2                    input div 2
             Q                  input
                  /Q2           input div 2
                         yQ     twice input
                       .|  Q    that OR input
                     _h         NOT that
                .&              (input div 2) AND that
               =                assign that to Q
              y                 twice that
            +                   input plus that
       .&                       (input div 2) AND that
     _h                         NOT that
  .&                            input AND that
.|                          Q   that OR Q

비트 단위 및 산술 연산 만 사용하여 맨 오른쪽 블록뿐만 아니라 1의 모든 블록에 대해 동시에 위의 연산을 수행합니다 .

1000010001001 ↦
1100011001101 ↦
1110011101001 ↦
1111010001101 ↦
1000011001001 ↦
1100011101101 ↦
1110010001001 ↦
1111011001101 ↦
1000011101001 ↦
1100010001101 ↦
1110011001001 ↦
1111011101101 ↦
1000010001001

1

스위프트 1.2, 66 바이트

func a(b:Int){var c=0,t=1,n=b
while n>c{n-=c;t+=c++}
print(n%c+t)}
Input:  1,   2, 3,  4, 5, 6,   7, 8, 9, 10,   11, 12, 13, 14, 15
Output: 1,   3, 2,  5, 6, 4,   8, 9, 10, 7,   12, 13, 14, 15, 11

1

Brachylog , 5 바이트

∋0&|↺

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

@orlp의 Pyth 답변 포트. 간단하고 깔끔하게 나옵니다.

∋0    % If input contains a 0 (since input is a single number, "contains" ∋ treats it as an array 
      %   of its digits, so this means "if any of input's digits are 0")
&     % Then output is the input
|     % Otherwise
↺     % Circularly shift the input once, and unify that with the output

원래 @ Sp3000의 Python 솔루션을 이식하고 싶었지만 23 바이트 가 걸렸습니다 .

⟧∋B-₁⟦++₁A≤?;A--₁;B%;A+

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


0

자바 스크립트 (ES6), 43 바이트

f=(n,i=1,j=1)=>n>j?f(n,++i,j+i):n++<j?n:n-i

0

MATLAB (189)

  function u=f(n),if(~n|n==1)u=n;else,u=n;y=factor(n);z=y(y~=2);if ~isempty(z),t=y(y~=max(y));if isempty(t),u=y(end)*2^(nnz(y)-1);else,g=max(t);e=primes(g*2);u=n/g*e(find(e==g)+1);end,end,end

  • 함수:

    숫자가 0이거나 2 또는 1로 인수 분해 된 경우 소수에 따라 정수를 맵핑합니다. 그렇지 않으면이 숫자가 자신에 맵핑됩니다. 더 큰 주요 요인은 우리가 숫자에 도달 할 때까지 우리는 그 금액에 도달하면 모든 요소의 모든 지수의 합을, 우리는 차례 우리는 다시 같은 사이클을 재현.biggest_prime^nnmax_prime*2^(n-1)


0

MATLAB (137)

  function u=h(n),if(~n|n==1)u=n;else,u=n;y=factor(n);z=y(y~=2);if~isempty(z),e=nnz(y);f=nnz(z);if(~mod(e,f)&e-f)u=n/2^(e-f);else,u=u*2;end

  • 2우리가 지수를 우연히 발견 할 때까지 {0,1,2 ^ n}과 같지 않은 숫자를 점진적으로 곱할 때의 약간 유사한 접근법 2은 다른 주요 요인의 지수의 합으로 나눌 수 있습니다. 사이클의 시작 부분으로 나누어집니다 2^(sum of exponents of other primes). 다른 숫자는 자신에게 매핑됩니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.