In số Super Collatz


22

Các Collatz trình tự (còn gọi là bài toán 3x + 1) là nơi mà bạn bắt đầu với bất kỳ số nguyên dương, ví dụ này, chúng ta sẽ sử dụng 10, và áp dụng này tập hợp các bước để nó:

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

10 là chẵn, vì vậy chúng ta chia cho 2 để nhận 5. 5 là số lẻ, vì vậy chúng ta nhân 3 và thêm 1 để nhận được 16. 16 là chẵn, vì vậy hãy cắt nó thành một nửa để có được 8. Một nửa số 8 là 4, một nửa 4 là 2 và một nửa của 2 là 1. Vì điều này đã đưa chúng tôi 6 bước, chúng tôi nói rằng 10 có khoảng cách dừng là 6.

Số Super Collatz là số có khoảng cách dừng lớn hơn khoảng cách dừng của mọi số nhỏ hơn số đó. Ví dụ: 6 là số Super Collatz vì 6 có khoảng cách dừng là 8, 5 có khoảng cách dừng là 5, 4 có 2, 3 có 7, 2 có 1 và 1 có 0. ( A006877 trong OEIS) Bạn phải lấy một số n làm đầu vào và xuất ra tất cả các số Super Collatz lên đến n .

Quy tắc

  • Chương trình đầy đủ hoặc chức năng được chấp nhận.

  • Bạn không thể tính toán trước hoặc mã hóa trình tự Super Collatz.

  • Bạn có thể lấy đầu vào ở bất kỳ định dạng hợp lý.

  • Đầu ra có thể được trả về dưới dạng danh sách từ hàm hoặc được in ra STDOUT hoặc tệp. Bất cứ điều gì là thuận tiện nhất.

  • Đầu vào không hợp lệ (không phải số, số thập phân, số âm, v.v.) dẫn đến hành vi không xác định.

Mẫu trăn không có lông

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

Mẫu 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

Ngoài ra đây là 44 số Super Collatz đầu tiên:

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
Ngoài ra, nếu bất cứ ai có thể tìm thấy một số có khoảng cách dừng vô cực (không bao giờ đạt tới 1) tôi sẽ cung cấp cho họ số tiền thưởng lớn nhất tôi có thể cung cấp. = D
DJMcMayhem

1
Nhiều nhà toán học cũng vậy ...: P
Rɪᴋᴇʀ 4/2/2016


5
Đây chỉ là phỏng đoán, nhưng tôi nghi ngờ rằng quy tắc 2 là một thực tế toán học chứ không chỉ là một hạn chế thách thức.
trichoplax

1
"Bạn phải lấy một số n làm đầu vào và xuất ra tất cả các số Super Collatz lên đến n" Vì vậy, nếu tôi hiểu chính xác điều này, bạn KHÔNG yêu cầu xuất số n super collatz đầu tiên? Bởi vì đó là những gì câu trả lời của Pyth chẳng hạn, nên tôi nghĩ nó không đủ rõ ràng.
Gây tử vong vào

Câu trả lời:


1

Bình thường, 23 byte

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

Trình diễn

Điều này hoạt động bằng cách lấy tối đa của phạm vi lên đến mỗi số theo khoảng cách dừng Collatz của chúng và kiểm tra xem max đó có phải là số trong câu hỏi hay không.


2

Python 2, 104 byte

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)))]

clà một hàm trợ giúp tính toán khoảng cách Collatz cho một số nguyên cho trước. Lambda không tên là chức năng chính, tính toán các số siêu Collatz lên đến (nhưng không bao gồm) đầu vào.


2

APL Dyalog , 41 byte

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

Một chức năng không tên. Tên hoặc dấu ngoặc đơn để áp dụng.

Các trường hợp thử nghiệm:

       ((∪⊢⍳⌈\)≢∘{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 kết quả trong hành vi không xác định.


1

ES6, 86 83 byte

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])

Chỉnh sửa: Đã lưu 3 byte bằng cách chuyển từ filterhiểu một mảng.


1

Haskell, 84 byte

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]]

Điều này là ồ ạt, tất nhiên, nhưng nó hoạt động!


1

Oracle SQL 11.2, 329 byte

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;

Phiên bản không chơi gôn

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;

Chế độ xem q là chế độ xem đệ quy thực (không phải là truy vấn phân cấp với CONNECT BY) tính toán tất cả các bước về 1 cho mọi số nguyên trong khoảng từ 1 đến: 1.

Chế độ xem v tính khoảng cách dừng.

Chế độ xem m sử dụng phiên bản phân tích của MAX để áp dụng nó cho mọi hàng trước đó, ngoại trừ hàng hiện tại. Theo cách đó, đối với mỗi số nguyên, chúng ta biết đó là khoảng cách dừng và khoảng cách dừng lớn nhất hiện tại.

Kiểm tra truy vấn cuối cùng nếu khoảng cách dừng lớn hơn khoảng cách dừng lớn nhất. Và thêm một vài thủ thuật để xử lý 1 và trường hợp đặc biệt: 1 có giá trị 0.


0

MATL , 37 byte

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

Hãy thử trực tuyến!

:         % 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 ký tự / 38 byte

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

Try it here (Firefox only).

Lý do duy nhất tôi không đăng bài này sớm hơn là vì tôi không rõ về thông số kỹ thuật. Sử dụng mã hóa tùy chỉnh mã hóa ký tự 10 bit.

Giải trình

⩥ïⓜtạo một phạm vi [0,input)để ánh xạ trên. МȬ⧺$,a=[])tạo số Collatz trong một mảng trống và ⋎⟮aꝈ-1⟯>ɐsử dụng mảng số Collatz để lấy khoảng cách dừng và kiểm tra xem nó có lớn hơn khoảng cách dừng tối đa trước đó không. Nếu vậy, ⅋(ɐ=Ⅰ,ᵖ$làm cho khoảng cách dừng hiện tại là khoảng cách dừng tối đa và đẩy vật phẩm hiện tại trong phạm vi đến ngăn xếp. Sau đó, các mục của ngăn xếp được in ngầm.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.