พิมพ์ตัวเลข Super Collatz


22

Collatz ลำดับ (ที่เรียกว่าปัญหา 3x + 1) เป็นที่ที่คุณเริ่มต้นด้วยจำนวนเต็มบวกใด ๆ สำหรับตัวอย่างนี้เราจะใช้ 10 และใช้ชุดของขั้นตอนไปนี้:

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 ครึ่งหนึ่งของ 4 คือ 2 และครึ่งหนึ่งของ 2 คือ 1 เนื่องจากเราใช้ 6 ขั้นตอนเราบอกว่า 10 มีระยะหยุด 6

หมายเลข Super Collatz เป็นตัวเลขที่มีระยะการหยุดมากกว่าระยะทางหยุดของหมายเลขน้อยกว่านั้น ตัวอย่างเช่น 6 เป็นจำนวน Super Collatz เนื่องจาก 6 มีระยะหยุด 8, 5 มีระยะหยุด 5, 4 มี 2, 3 มี 7, 2 มี 1 และ 1 มี 0 ( A006877ใน OEIS) คุณต้อง ใช้จำนวนnเป็น input และ output ออกทุกหมายเลขซูเปอร์ Collatz ถึงn

กฎระเบียบ

  • โปรแกรมหรือฟังก์ชั่นเต็มรูปแบบเป็นที่ยอมรับ

  • คุณไม่สามารถคำนวณล่วงหน้าหรือรหัสยากในลำดับ Super Collatz

  • คุณสามารถป้อนข้อมูลในรูปแบบที่เหมาะสม

  • เอาต์พุตสามารถส่งคืนเป็นรายการจากฟังก์ชันหรือพิมพ์ไปยัง STDOUT หรือไฟล์ แล้วแต่จำนวนใดจะสะดวกที่สุด

  • อินพุตที่ไม่ถูกต้อง (ไม่ใช่ตัวเลขทศนิยมจำนวนลบเป็นต้น) ส่งผลให้เกิดพฤติกรรมที่ไม่ได้กำหนด

ไพ ธ อนตัวอย่าง

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

นอกจากนี้ยังมีตัวเลข Super Collatz 44 หมายเลขแรก:

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ɪᴋᴇʀ

ที่เกี่ยวข้อง: codegolf.stackexchange.com/q/12177/3808
Doorknob

5
นี่เป็นเพียงการคาดเดา แต่ฉันสงสัยว่ากฎที่ 2 นั้นเป็นข้อเท็จจริงทางคณิตศาสตร์แทนที่จะเป็นเพียงข้อจำกัดความท้าทาย
trichoplax

1
"คุณต้องนำตัวเลข n เป็นอินพุตและส่งออกตัวเลข Super Collatz ทั้งหมดสูงสุด n" ดังนั้นหากฉันเข้าใจอย่างถูกต้องคุณไม่ต้องขอให้ส่งออกหมายเลข n super collatz แรก? เพราะนั่นคือสิ่งที่คำตอบของ Pyth ทำขึ้นมาดังนั้นฉันคิดว่ามันไม่ชัดเจนพอ
ทำให้เสียชีวิต

คำตอบ:


1

Pyth, 23 ไบต์

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

สาธิต

วิธีนี้ใช้งานได้โดยนำช่วงสูงสุดมาที่แต่ละหมายเลขตามระยะการหยุด Collatz ของพวกเขาและตรวจสอบว่าจำนวนสูงสุดนั้นเป็นจำนวนที่เป็นปัญหาหรือไม่


2

Python 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 สำหรับจำนวนเต็มที่กำหนด แลมบ์ดาที่ไม่มีชื่อนั้นเป็นฟังก์ชั่นหลักซึ่งคำนวณตัวเลข super 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])

แก้ไข: บันทึก 3 ไบต์โดยเปลี่ยนจากfilterเป็นความเข้าใจอาร์เรย์


1

Haskell, 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

มุมมอง v คำนวณระยะทางหยุด

มุมมอง m ใช้เวอร์ชันการวิเคราะห์ของ MAX เพื่อนำไปใช้กับทุกแถวก่อนหน้ายกเว้นแถวปัจจุบัน วิธีนั้นสำหรับจำนวนเต็มแต่ละตัวเรารู้ว่ามันหยุดระยะทางและระยะหยุดที่ยิ่งใหญ่ที่สุดในปัจจุบัน

แบบสอบถามสุดท้ายตรวจสอบว่าระยะทางหยุดยาวกว่าระยะหยุดสูงสุดหรือไม่ และเพิ่มเทคนิคเล็กน้อยในการจัดการ 1 และกรณีพิเศษของ: 1 ที่มีค่าเป็น 0


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 ในอาร์เรย์ที่ว่างเปล่าและ⋎⟮aꝈ-1⟯>ɐใช้อาร์เรย์ของหมายเลข Collatz เพื่อให้ได้ระยะทางหยุดและตรวจสอบว่ามากกว่าระยะทางหยุดสูงสุดก่อนหน้านี้หรือไม่ ถ้าเป็นเช่นนั้น⅋(ɐ=Ⅰ,ᵖ$ทำให้ระยะการหยุดปัจจุบันเป็นระยะการหยุดสูงสุดและผลักรายการปัจจุบันในช่วงไปยังสแต็ก หลังจากนั้นรายการของสแต็กจะถูกพิมพ์โดยปริยาย


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.