Super Collatz 번호 인쇄


22

Collatz 시퀀스 는, 양의 정수로 시작이 예를 들어 우리가 10를 사용하고, 그것에 단계의 설정을 적용 할 경우 (도 3 배 + 1 문제라고합니다)입니다 :

if n is even:
    Divide it by 2
if n is odd:
    Multiply it by 3 and add 1
repeat until n = 1

10은 짝수이므로 2로 나누어 5를 구합니다. 5는 홀수이므로 3을 곱하고 1을 더하여 16을 구합니다. 16은 짝수이므로 8을 반으로 자르면 8이됩니다. 4는 2, 2의 절반은 1입니다.이 과정에서 6 단계를 수행 했으므로 10의 정지 거리는 6입니다.

Super Collatz 숫자는 정지 거리가 그보다 작은 모든 숫자의 정지 거리보다 큰 숫자입니다. 예를 들어, 6의 정지 거리는 8, 5의 정지 거리는 5, 4는 2, 3은 7, 2는 1, 1은 0을 갖기 때문에 6은 Super Collatz 수 입니다. (OEIS의 A006877 ) 숫자 n 을 입력으로 취하고 모든 Super Collatz 숫자를 n 까지 출력하십시오 .

규칙

  • 전체 프로그램 또는 기능이 허용됩니다.

  • Super Collatz 시퀀스를 사전 계산하거나 하드 코딩 할 수 없습니다.

  • 합리적인 형식으로 입력 할 수 있습니다.

  • 출력은 함수에서 목록으로 리턴되거나 STDOUT 또는 파일로 인쇄 될 수 있습니다. 가장 편리한 방법입니다.

  • 유효하지 않은 입력 (숫자, 소수, 음수 등)으로 인해 정의되지 않은 동작이 발생합니다.

ungolfed python 샘플

def collatzDist(n):
    if n == 1:
        return 0
    if n % 2 == 0:
        return 1 + collatzDist(n / 2)
    return 1 + collatzDist((n * 3) + 1)

n = input()

max = -1
superCollatz = []
for i in range(1, n + 1):
    dist = collatzDist(i)
    if dist > max:
        superCollatz.append(i)
        max = dist 

print superCollatz

샘플 IO :

#in       #out
 4     --> 1, 2, 3
 50    --> 1, 2, 3, 6, 7, 9, 18, 25, 27
 0     --> invalid
 10000 --> 1, 2, 3, 6, 7, 9, 18, 25, 27, 54, 73, 97, 129, 171, 231, 313, 327, 649, 703, 871, 1161, 2223, 2463, 2919, 3711, 6171

또한 첫 44 개의 Super Collatz 번호가 있습니다 :

1, 2, 3, 6, 7, 9, 18, 25, 27, 54, 73, 97, 129, 171, 231, 313, 327, 649, 703, 871, 1161, 2223, 2463, 2919, 3711, 6171, 10971, 13255, 17647, 23529, 26623, 34239, 35655, 52527, 77031, 106239, 142587, 156159, 216367, 230631, 410011, 511935, 626331, 837799

6
또한, 누군가가 정지 거리가 무한대 (1에 도달하지 않음) 인 숫자를 찾을 수 있다면 내가 제공 할 수있는 가장 큰 현상금을 줄 것입니다. = D
DJMcMayhem

1
많은 수학자들이 그렇게 할 것입니다 ... : P
Rɪᴋᴇʀ


5
이것은 추측 일 뿐이지 만, 규칙 2는 단순한 도전 제한이 아니라 수학적 사실이라고 생각합니다.
trichoplax

1
"숫자로 n을 입력으로 가져 와서 모든 Super Collatz 숫자를 n까지 출력해야합니다."이것을 올바르게 이해하면 첫 번째 n super collatz 숫자를 출력하도록 요청하지 않습니까? 예를 들어 Pyth 답변이 그렇게하기 때문에 충분하지 않다고 생각합니다.
Fatalize

답변:


1

Pyth, 23 바이트

q#eol.u@,/N2h*N3NN)STSQ

데모

이것은 Collatz 정지 거리만큼 범위의 최대 값을 각 숫자까지 가져오고 해당 최대 값이 해당 숫자인지 확인하여 작동합니다.


2

파이썬 2, 104 바이트

c=lambda x:x>1and 1+c([x/2,x*3+1][x%2])
lambda n:[1]+[x for x in range(2,n)if c(x)>max(map(c,range(x)))]

c주어진 정수에 대한 Collatz 거리를 계산하는 도우미 함수입니다. 명명되지 않은 람다는 주요 함수이며, 입력까지 최대 Collatz 수를 계산합니다.


2

Dyalog APL , 41 바이트

(∪⊢⍳⌈\)≢∘{1=⍵:⍬⋄2|⊃⌽⍵:⍵,∇1+3×⍵⋄⍵,∇⍵÷2}¨∘⍳

명명되지 않은 함수. 적용 할 이름 또는 괄호.

테스트 사례 :

       ((∪⊢⍳⌈\)≢∘{1=⍵:⍬ ⋄ 2|⊃⌽⍵:⍵,∇ 1+3×⍵ ⋄ ⍵,∇ ⍵÷2}¨∘⍳)¨4 50 10000
┌─────┬────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────┐
│1 2 3│1 2 3 6 7 9 18 25 27│1 2 3 6 7 9 18 25 27 54 73 97 129 171 231 313 327 649 703 871 1161 2223 2463 2919 3711 6171│
└─────┴────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┘

0은 정의되지 않은 동작을 초래합니다.


1

ES6, 86 83 바이트

n=>(i=m=0,c=n=>n<3?n:c(n&1?n*3+1:n/2)+1,[for(x of Array(n))if(c(++i)>m&&(m=c(i)))i])

편집 : filter배열 이해 로 전환하여 3 바이트를 절약했습니다 .


1

하스켈, 84 바이트

c 1=0;c x|odd x=1+c(3*x+1)|0<1=1+c(div x 2)
f x=[n|n<-[1..x],all(c n>)$c<$>[1..n-1]]

물론 이것은 매우 느리지 만 작동합니다!


1

Oracle SQL 11.2, 329 바이트

WITH q(s,i)AS(SELECT LEVEL s,LEVEL i FROM DUAL CONNECT BY LEVEL<=:1 UNION ALL SELECT s,DECODE(MOD(i,2),0,i/2,i*3+1)i FROM q WHERE i<>1),v AS(SELECT s,COUNT(*)-1 d FROM q GROUP BY s),m AS(SELECT s,d,MAX(d)OVER(ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)m FROM v)SELECT s FROM m WHERE(d>m OR s=1)AND:1>0ORDER BY 1;

골프 용 버전

WITH q(s,i) AS 
  (
    SELECT LEVEL s, LEVEL i 
    FROM DUAL CONNECT BY LEVEL <= :1
    UNION ALL 
    SELECT q.s, DECODE(MOD(i,2),0,i/2,i*3+1)i FROM q WHERE q.i <> 1
  )
, v AS (SELECT s, COUNT(*)-1 d FROM q GROUP BY s)
, m AS (SELECT s, d, MAX(d)OVER(ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) m FROM v)
SELECT * FROM m WHERE (d>m OR s=1) AND :1>0
ORDER BY 1;

q 뷰는 1과 : 1 사이의 모든 정수에 대해 1을 향한 모든 단계를 계산하는 진정한 재귀 뷰 (CONNECT BY를 사용하는 계층 적 쿼리가 아님)입니다.

v 뷰는 정지 거리를 계산합니다.

m보기는 분석 버전의 MAX를 사용하여 현재 행을 제외한 모든 행에 적용합니다. 이렇게하면 각 정수마다 정지 거리와 현재 최대 정지 거리를 알 수 있습니다.

최종 쿼리는 정지 거리가 최대 정지 거리보다 큰지 확인합니다. 그리고 1을 처리하기위한 몇 가지 트릭과 값이 0 인 특수 경우 : 1을 추가합니다.


0

MATL , 37 바이트

:"@tqX`t0)t2\?3*Q}2/]ht0)q]n]N$htY>=f

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

:         % vector [1,2,...N], where N is implicit input
"         % for each number in that range
  @       %   push that number, k
  tq      %   truthy iff k is not 1
  X`      %   while...do loop
    t0)   %     pick first number of array
    t2\   %     is it odd?
    ?     %     if so:
      3*Q %       multiply by 3 and add 1
    }     %     else
      2/  %       divide by 2
    ]     %     end if
    h     %     concatenate into array with previous numbers
    t0)q  %     duplicate, pick last number, is it 1? Leave that as while condition
  ]       %   end while
  n       %   number of elements of array. This is the stopping distance for k
]         % end for
N$h       % concatenate all stopping distances into an array
tY>       % duplicate and compute cumulative maximum
=f        % indices of matching elements. Implicitly display

0

𝔼𝕊𝕄𝕚𝕟, 30 자 / 38 바이트

⩥ïⓜМȬ⧺$,a=[])⋎⟮aꝈ-1⟯>ɐ⅋(ɐ=Ⅰ,ᵖ$

Try it here (Firefox only).

내가 이것을 이전에 게시하지 않은 유일한 이유는 사양에 대해 명확하지 않았기 때문입니다. 10 비트 문자를 인코딩하는 사용자 지정 인코딩을 사용합니다.

설명

⩥ïⓜ[0,input)매핑 할 범위 를 만듭니다 . МȬ⧺$,a=[])빈 배열에서 Collatz 숫자를 생성하고 Collatz 숫자 ⋎⟮aꝈ-1⟯>ɐ배열을 사용하여 정지 거리를 얻고 이전 최대 정지 거리보다 큰지 확인합니다. 그렇다면, ⅋(ɐ=Ⅰ,ᵖ$현재 정지 거리를 최대 정지 거리로 만들고 범위 내에서 현재 항목을 스택에 밀어 넣습니다. 그런 다음 스택의 항목이 암시 적으로 인쇄됩니다.


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