スーパーコラッツの数字を印刷する


22

このCollat​​zシーケンスあなたが、任意の正の整数で始まるこの例では、我々は10を使用し、それへのステップのセットを適用する場所(も3X + 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は偶数です。 4は2であり、2の半分は1です。これは6ステップを要したため、10の停止距離は6であると言います。

Super Collat​​z番号は、停止距離がそれよりも小さいすべての番号の停止距離よりも大きい番号です。図6は、8の停止距離を有するので、例えば、図6は、2 1を有しており、1は0(持つ、3 7を有し、4 2を有し、5は5の停止距離を有し、スーパーこのCollat​​z番号A006877 OEISで)あなたが必要と番号を取るn個の入力として、及びまでのすべてのスーパーこのCollat​​z番号アウト出力のn

ルール

  • 完全なプログラムまたは機能が許容されます。

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


5
これは推測に過ぎませんが、ルール2は単なるチャレンジ制限ではなく数学的な事実であると思われます。
trichoplax

1
「入力として数値nを取得し、nまでのすべてのスーパーコラッツ数を出力する必要があります。」これを正しく理解している場合、最初のnスーパーコラッツ数を出力するよう要求しませんか。それは、たとえば、Pythの回答が行うことなので、十分に明確ではないと思います。
16

回答:


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数を計算します。


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ビューは、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=[])空の配列でCollat​​z数を生成し、Collat​​z数の配列を⋎⟮aꝈ-1⟯>ɐ使用して停止距離を取得し、それが以前の最大停止距離よりも大きいかどうかを確認します。その場合⅋(ɐ=Ⅰ,ᵖ$、現在の停止距離を最大停止距離にし、範囲内の現在のアイテムをスタックにプッシュします。その後、スタックのアイテムが暗黙的に印刷されます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.