反復ファイシーケンス


13

関連:繰り返しphi(n)関数

あなたの課題は、反復phi関数を計算することです。

f(n) = number of iterations of φ for n to reach 1.

どこφオイラーのφ関数は

関連OEIS

以下がそのグラフです。

enter image description here


ルール:

あなたの目標はからに出力f(n)するn=2ことn=100です。

これはコードゴルフなので、最短のコードが優先されます。

確認できる値は次のとおりです。

1, 2, 2, 3, 2, 3, 3, 3, 3, 4, 3, 4, 3, 4, 4, 5, 3, 4, 4, 4, 4, 5, 4, 5, 4, 4, 4, 5, 4, 5, 5, 5, 5, 5, 4, 5, 4, 5, 5, 6, 4, 5, 5, 5, 5, 6, 5, 5, 5, 6, 5, 6, 4, 6, 5, 5, 5, 6, 5, 6, 5, 5, 6, 6, 5, 6, 6, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 6, 5, 6, 7, 5, 7, 5, 6, 6, 7, 5, 6, 6, 6, 6, 6, 6, 7, 5, 6, 6

@LuisMendoを修正し、チェックするグラフと値を追加しました。:-)
単に美しいアート

1
これは本質的に固定値を出力しているため、kolmogorov-complexityタグで編集しました
caird coinheringaahing

1
@SimplyBeautifulArt最初に、特定の固定数であるxような有限の数の値があることを証明しますphi(x)
user202729

2
これはいい挑戦ですが、f(n)固定された数値の範囲で実行するのではなく、実装するソリューションを求める方が良いと思います。これにより、バイト数の少ない範囲に関数を適用できる言語間でも違いが生じます(一部カメレオンチャレンジ?)
Uriel

1
:P私はあなたに優位性を与えるために挑戦を変えるべきだとほのめかしていますか?これらの規則がどのように記載されているかに関係なく、いくつかの言語には利点があり、いくつかの言語には利点がありません。@ウリエル
単に美しいアート

回答:


10

Haskell53 52バイト

1バイトを節約してくれてありがとうnimi!

f<$>[2..100]
f 1=0
f n=1+f(sum[1|1<-gcd n<$>[1..n]])

オンラインでお試しください!

sum[1|1<-gcd n<$>[1..n]]与えるφ(n)flawrから取得、ありがとう!)

f計算する再帰関数であり1+φ(n)、nがない場合1、出力0場合がnある1到達するまですべきより多くの反復が存在しないように、1

最後にf<$>[2..100]、のf各要素に適用されるリストを作成します[2..100]


7

Haskell70 69 68バイト

この関数(\n->sum[1|1<-gcd n<$>[1..n]])はtotient関数であり、匿名関数で繰り返し適用されます。-1バイトありがとう@laikoni!

編集:@xnorが以前のチャレンジでこの正確なtotient関数を使用していることがわかりました。

length.fst.span(>1).iterate(\n->sum[1|1<-gcd n<$>[1..n]])<$>[2..100]

オンラインでお試しください!


1
これはtotientビルトインを持たないためにかなり短いです!
ルイスメンドー

1
@LuisMendo H.PWizは、さらに短いソリューションを見つけました!
flawr

7

MATL16 15バイト

99:Q"@`_Zptq}x@

オンラインでお試しください!

説明

99:       % Push [1 2 ... 99]
Q         % Add 1 element-wise: gives [2 3 ... 100]
"         % For each k in that array
  @       %   Push k
  `       %   Do...while
    _Zp   %     Euler's totient function
     tq   %     Duplicate, subtract 1. This is the loop condition
  }       %   Finally (execute on loop exit)
  x       %     Delete
  @       %     Push latest k
          %   End (implicit)
          % End (implicit)
          % Display stack (implicit)

古いバージョン、16バイト

99:Qt"t_Zp]v&X<q

オンラインでお試しください!

説明

99:       % Push [1 2 ... 99]
Q         % Add 1 element-wise: gives [1 2 ... 100]
t"        % Duplicate. For each (i.e. do the following 100 times)
  t       %   Duplicate
  _Zp     %   Euler's totient function, element-wise
]         % End
v         % Concatenate vertically. Gives a 100×100 matrix
&X<       % Row index of the first minimizing entry for each column.
          % The minimum is guaranteed to be 1, because the number of
          % iterations is more than sufficient.
q         % Subtract 1. Display stack (implicit)

1
出力される値は1つずれています。オンラインで試してみてください。それを修正します(しかし、以前にMATLを使用したことはありません...)
共編

投稿の終わりを確認してください。予想される出力が提供されますが、各出力に対して1つずれています。
単に美しいアート

あなたの現在の答えによって出力される最初の5つの値は2 3 3 4 3、チャレンジがそうすべきだと言うときです1 2 2 3 2
coinheringaahing caird

@cairdcoinheringaahingとSimplyBeautifulArtああ、なるほど。ありがとう!今修正
ルイスメンドー

6

ゼリー12 11 10 9バイト

³ḊÆṪÐĿ>1S

オンラインでお試しください!

HyperNeutrinoのおかげで-1バイト!

Xcoder氏のおかげで-1バイト!

デニスのおかげで-1バイト

使い方

³ḊÆṪÐĿ>1S - Main link. No arguments
³         - Yield 100
 Ḋ        - Dequeue. Creates the list [2, 3 ... 99, 100]
    ÐĿ    - For each element, while the results of the next function
          - aren't unique, collect the results...
  ÆṪ      -   Next function: Totient
      >1  - Greater than one?
        S - Sum the columns

これはデニスによって作成されたので、私は(理解できるように)これがなぜ機能するのわかりません。


1
すべての3つの答えの出力のリスト@dylnan f(n)から2100、質問私はこれが正しいバージョンだと思うので、入力を言及していない
caird coinheringaahing

@dylnan課題は、出力に尋ねるfためn=2n=100だけではなく一つの値、。
単に美しいアート

あなたは正しい、私は挑戦の始まりを読んでいたしていると明確にルールの一部を読んでいない
dylnan

そして、コードに関して#、この場合に使用することは可能でしょうか?このようなもの(これは明らかに機能しませんが、構文を明確に理解している人によって書かれました!)
dylnan

@dylnanおそらく、しかし固定リストを生成しているので、各要素に適用することは、通常よりも優れてい#ます。
コイナーリンガーをケア

6

APL(Dyalog)50 29 25バイト

まあ、ビルトイントーティエントはありません!

@ H.PWizのおかげで4バイト節約

{⍵=1:01+∇+/1=⍵∨⍳⍵}¨1+⍳99

オンラインでお試しください!

どうやって?

どうやら私は最初に、より長い(そしてより難しい)トーティエント式を採用したようです。改訂履歴を参照してください。

⍳⍵ - 1n

⍵∨ -gcdと n

1= -1に等しい?

+/ -すべてを合計する

これが目的です。残りはすべて(カウントのラッパーである1+∇)との範囲に適用します2..100¨1+⍳99)。



4

J REPL、23バイト

<:#@(5&p:^:a:)"0|2+i.99

私はチェックしていませんが、これをおそらく名詞として定義すると通常のJで機能します(REPLで自分の携帯電話でこれをゴルフしました)。

組み込み、よ。

少なくとも 2〜3バイトを削る必要があると思います(a:動作方法|、noopとして使用する必要があるなどの理由で1つずつ削る)。



将来の参照のため"+"0、の代わりにasoを使用することができますので、同様に<:#@(5&p:^:a:)"+i.99
Conor O'Brien

2
16バイト+/1<a:5&p:2+i.99
マイル

1
@ miles:a:コードでの使用について説明できますか?代わりにどのように機能し^:ますか?
ガレンイワノフ

1
@GalenIvanov (5&p:)^:a: mは、ダイアドが名詞と結合され、ダイアディックに呼び出されるときa: 5&p: mの他の定義を使用して実行できます&
マイル

4

JavaScript(ES6)、115 ... 104 99バイト

ハードコーディングはもっと短いかもしれませんが、純粋に数学的なアプローチを試してみましょう。

f=n=>n>97?6:(P=(n,s=0)=>k--?P(n,s+(C=(a,b)=>b?C(b,a%b):a<2)(n,k)):s>1?1+P(k=s):1)(k=n+2)+' '+f(-~n)

console.log(f())


ハードコーディングは90バイト(pastebin link
Herman L

@HermanLauensteinよくできました。
アーナルド


3

Python 2、82バイト

l=0,1
exec"n=len(l);p=2\nwhile n%p:p+=1\nl+=l[p-1]+l[n/p]-n%4%3/2,;print l[n];"*99

オンラインでお試しください!

これは、次の観察結果を使用します。

  • f(a*b) = f(a) + f(b) - 1、ただしとが両方とも偶数の-1場合は省略されますab
  • f(p) = f(p-1) + 1pが素数のときf(2)=1

これらは、暗示その場合n素因数分解持ってn = 2**a * 3**b * 5**c * 7**d * 11**e * ...、その後、f(n) = max(a,1) + b + 2*c + 2*d + 3*e + ...それぞれ、p>2因数分解の寄与でのf(p-1)

これらが過去を保持し続けるかどうかはわかりませんn=100が、もしそうであれば、fを使用せずに定義および計算する方法を提供しますφ



2

PowerShell、110バイト

$a=,0*101;2..100|%{$i=$_;for($z=$j=0;++$j-lt$i;$z+=$k-eq1){for($k=$j;$j%$k-or$i%$k;$k--){}};($a[$i]=$a[$z]+1)}

オンラインでお試しください!

数学的アプローチ。

実際、Cの回答と非常によく似ていますが、独立して開発されています。の配列を作成し、0から2までループし、定式化を使用して100計算phigcdます。最後の括弧内の部分は、結果を$a次の回遊のために保存し、パイプラインにコピーを配置します。その結果、暗黙的な出力が生成されます。


PowerShell、112バイト

"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"-split'(.)'

オンラインでお試しください!

ハードコードされています。うん 数学的なアプローチを得ることができるよりも約10〜15バイト短い。


すべての数字が1桁であるため、実際にセパレータが必要かどうか疑問に思います:)
flawr

1
数学的なアプローチを教えてください。それは確かにはるかに興味深いです:P
コナー・オブライエン

2
@ ConorO'Brien幸いなことに、私は今朝、新鮮な目でそれを見て、ハードコードされたアプローチの下に数学的なアプローチをゴルフすることができました。
AdmBorkBork

2

Python 2、83バイト

n=2
exec"print len(bin(n))-3+n%2-~n%9/8-(0x951a5fddc040419d4005<<19>>n&1);n+=1;"*99

オンラインでお試しください!

ヒューリスティック推定値を、各推定値を-0またはとして修正するハードコードされた定数と組み合わせます-1


2

10 17バイト

mö←LU¡Sȯṁε⌋ḣtḣ100

オンラインでお試しください!

編集:実際にA003434を計算する関数のみになる前に、要求された範囲で関数を実際にマッピングするための+7バイト。

説明

以下はA003434を計算します

←LU¡S(ṁ(ε⌋))ḣ -- takes a number as input, for example: 39
   ¡          -- iterate the following function on the input: [39,24,8,4,2,1,1,1..]
    S(     )ḣ --   with itself (x) and the range [1..x]..
      ṁ(  )   --   ..map and sum the following
        ε⌋    --     0 if gcd not 1 else 1
  U           -- longest unique prefix: [39,24,8,4,2,1]
 L            -- length: 6
←             -- decrement: 5

m(....)ḣ100一部はちょうど私が前にその部分を逃していないことを確認する方法、範囲[2..100]の上にその機能をマップ:Sを


1

PHP、98バイト

1,2,<?=join(',',str_split(unpack('H*','##3444E4DEEDEEUUEEVEUVUVVFUVVUfVfVVVVVegWVgVffgV')[1]))?>,6

オンラインでお試しください!

すべての数字をバイナリ文字列にパックしました。展開して配列に変換し、再び配列をマージした後、1,2を追加して6を追加するだけで、適合しないか、制御コードが表示されるようになりました。



1

05AB1E、11バイト

тL¦ε[DNs#sÕ

オンラインでお試しください!

説明

тL¦           # push range [2 ... 100]
   ε          # apply to each
    [         # start a loop
     D        # duplicate the current number
      N       # push the loop iteration counter
       s      # swap one copy of the current number to the top of the stack
        #     # if true, break the loop
         s    # swap the second copy of the current number to the top of the stack
          Õ   # calculate eulers totient

1

C、112バイト

a[101];f(i,j,k,t){for(a[i=1]=0;i++<100;printf("%d ",a[i]=a[t]+1))for(t=j=0;++j<i;t+=k==1)for(k=j;j%k||i%k;k--);}

ゴルフをしていない:

a[101];
f(i,j,k,t){
    for(a[1]=0,i=2;i<=100;i++) {   // initialize
        for(t=j=0;++j<i;t+=k==1)   // count gcd(i, j) == 1 (t = phi(i))
            for(k=j;j%k||i%k;k--); // calculate k = gcd(i, j)
        printf("%d ",a[i]=a[t]+1); // print and store results
    }
}

オンラインでお試しください!


0

アルミ、87バイト

hhhhhdadtqdhcpkkmzyhqkhwzydqhhwdrdhhhwrysrshhwqdrybpkshehhhwrysrarhcpkksyhaydhehycpkkmr

オンラインでお試しください!

説明

hhhhhdadt      CONSTANT 100

RANGE FROM 100 to 0
q
  dhc
p

REMOVE 0 AND 1
kk

OVER EACH ELEMENT...
m
  zyh
  q
    kh
    wzyd
    q
      DUPLICATE TOP TWO ELEMENTS...
      hhwdrdhhhwrysrshhw
      GCD...
      qdryb
    p
    ks
    he
    hhhw
    ry
    s
    rarhc
  p
  IS IT ONE? IF SO TERMINATE (FIXPOINT)
  kksyhaydhehyc
p
kk
m
REVERSE THE VALUES
r

0

Pyth、38バイト(非競合)

.e-+1sl+1kb_jC"Éõ4ÕYHø\\uÊáÛ÷â¿"3

Pyth Herokuappでお試しください理由でTIOで動作しないためで。

明示的なPythソリューションが小さいことは疑いありませんが、シーケンスを圧縮してコードを取得し、Pythを学ぶことができることを確認したかったのです。これは、シーケンスの上限がであるという事実を使用しlog2(n)+1ます。

説明

.e-+1sl+1kb_jC"Éõ4ÕYHø\\uÊáÛ÷â¿"3
             C"Éõ4ÕYHø\\uÊáÛ÷â¿"   interpret string as base 256 integer
            j                   3  convert to array of base 3 digits
           _                       invert sequence (original had leading 0s)
.e                                 map with enumeration (k=index, b=element)
       +1k                                   k+1
     sl                            floor(log(   ))
   +1                                             +1
  -       b                                         -b

を介して圧縮された文字列を取得しましたCi_.e+1-sl+1ksb"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"3。これは、上記のコードのいくつかの型変換の反対です。


1
競合しない理由
単に美しいアート

@SimplyBeautifulArtは、正式な意味で競合しないという意味ではありません。それをより明確にするために、タイトルを編集した
stellatedHexahedron

0

Ohm v2、41バイト

“ ‽W3>€þΣÌιZ§Á HgüυH§u·β}Bā€ΣNπáÂUõÚ,3“8B

オンラインでお試しください!

文字通り完全にハードコーディングされています...上記のシーケンスを実際に実行し、数値ではないものをすべて取り除き、8進数として解釈し、Ohmの組み込みの255数値表現に変換しました。それが引用符のすることです。次に、プログラムはそれを再びベース8に変換します。

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