打印超级Collat​​z号码


22

在Collat​​z序列(也称为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。因为这花了我们6步,所以我们说10的停止距离为6。

Super Collat​​z数是一个数字,其停止距离大于每个数字的停止距离。例如,6是Super Collat​​z数,因为6的停止距离为8,5的停止距离为5,4的为2,3的为7,2的为1,1的值为 0。(OEIS中的A006877)您必须以数字n作为输入,并输出直到n的所有Super Collat​​z数字。

规则

  • 完整程序或功能是可以接受的。

  • 您无法预先计算或对Super Collat​​z序列进行硬编码。

  • 您可以采用任何合理的格式输入。

  • 输出可以作为功能列表返回,也可以打印到STDOUT或文件中。以最方便的为准。

  • 无效的输入(非数字,小数,负数等)导致未定义的行为。

示例非高尔夫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 Collat​​z号码:

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作为输入,并输出最多n个的所有Super Collat​​z数字”。因此,如果我理解正确,您不要求输出第一个n super collat​​z数字吗?因为例如Pyth答案就是这样做的,所以我认为还不够清楚。
致命

Answers:


1

Pyth,23个字节

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

示范

这是通过将范围的最大值乘以其Collat​​z停止距离得出每个数字,然后检查该最大值是否为所讨论的数字来实现的。


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是用于计算给定整数的Collat​​z距离的辅助函数。未命名的lambda是主要函数,它计算直到(但不包括)输入的超级Collat​​z数。


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

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视图是真正的递归视图(不是使用CONNECT BY的分层查询),它为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=[])在空数组中生成Collat​​z数字,并⋎⟮aꝈ-1⟯>ɐ使用Collat​​z数字数组获取停止距离,并检查该距离是否大于先前的最大停止距离。如果是这样,则⅋(ɐ=Ⅰ,ᵖ$使当前停止距离成为最大停止距离,并将范围内的当前项目推入堆栈。之后,将隐式打印堆栈中的项目。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.