シーケンスがメタしすぎる

Leaky Nun 09/11/2017. 6 answers, 2.053 views
code-golf sequence

ブランクの1つのインデックス付きシーケンスから始めます。

_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,... 

n 番目のステップでは、残りの最初のブランクから始まる1より大きい整数を持つすべてのa(n)の空白を入力します。ここで、a(n)はシーケンスのn 番目のエントリです。

最初のステップの後:

2,_,3,_,4,_,5,_,6,_,7,_,8,_,9,_,10,_,11,_,12,_,13,_,... 

1より大きい最初の整数が2であるため、a(1)は2でなければならないことに注意してください。

2番目のステップでは、すべてのa(2)の空白を記入します。 a(2)は2でなければならないことは明らかである。

2,2,3,_,4,3,5,_,6,4,7,_,8,5,9,_,10,6,11,_,12,7,13,_,... 

3番目のステップでは、すべてのa(3)の空白を記入します。 シーケンスから、a(3)= 3。

2,2,3,2,4,3,5,_,6,4,7,_,8,5,9,3,10,6,11,_,12,7,13,_,... 

4番目のステップでは、すべてのa(4)の空白を記入します。 シーケンスから、a(4)= 2。

2,2,3,2,4,3,5,2,6,4,7,_,8,5,9,3,10,6,11,3,12,7,13,_,... 

最終的には:

2,2,3,2,4,3,5,2,6,4,7,2,8,5,9,3,10,6,11,3,12,7,13,2,... 

仕事

nが与えられると、シーケンスのn 番目の要素を返します。

シーケンスの最初の10,000,000語はここで見つけることができます

これはです。 バイト単位の最短回答が勝ちます。 標準の抜け穴が適用されます。

5 Comments
Leaky Nun 06/20/2017
@ルイスメンドありがとう、私はそれを追加しました。
Dead Possum 06/20/2017
ちょうど興味があります、何が間違っていましたか?1つはシーケンスから除外されましたか?
Leaky Nun 06/20/2017
@DeadPossumまあ、あなたがすべての空白を記入したら、あなたは1つのステップで完了です。
2 Leaky Nun 06/20/2017
@DeadPossum a(n)が1の場合、残りの空白をn番目のステップで埋めて世代を終了します。
1 Leaky Nun 06/20/2017
@QBrute私は質問にリンクされた最初の10,000,000のリストを提供しました。 ちょうどそれらをプロットする。

6 Answers


Anders Kaseorg 06/20/2017.

ハスケル80 67バイト

 g~(a:b)|let k!l=k:take(a-1)l++(k+1)!drop(a-1)l=2!g b
m=g m
(!!)$0:m 

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

Haskellは、無限リストを定義するのに最適な言語です。

5 comments
1 Julian Wolf 06/20/2017
TIOリンクが期待どおりに機能することを考えれば、私の質問はそうではなくてはならないと思います。この仕組みの説明を追加できますか?
2 Anders Kaseorg 06/20/2017
@JulianWolfあなたがパターンガードをするのに慣れていないように聞こえます。 pattern1 | let pattern2 = expr2 = expr1 pattern1 | let pattern2 = expr2 = expr1は、 pattern1 = let pattern2 = expr2 in expr1と同じことを意味するpattern1 | let pattern2 = expr2 = expr1 pattern1 = let pattern2 = expr2 in expr1[expr1 | let pattern2 = expr2]と同じ理由で[expr1 | let pattern2 = expr2]と同じ意味にする))。
1 Ørjan Johansen 06/20/2017
私はパターンガードを覚えておく必要があります(特に彼らは機能を行うことができます)! また、 m=2:2:2`drop`g mは1バイト短くなります。
1 Ørjan Johansen 06/20/2017
(!!)$0:mは2バイト短くなります。
1 Ørjan Johansen 06/20/2017
実際には、 2:2: stuffを完全にもう少し怠惰で落とすことができます2:2: g〜 g ~(a:b)|...m=g m

Doorknob 06/20/2017.

C、123バイト

 f(n)NO 

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

ウォークスルー

 f(n)NO 

De Morganの法則とCで0が偽であるという事実によって、

 if (p[j] == 0 && ((k++) % p[i]) == 0) {
    p[j] = k / p[i] + 2;
} 

これは本質的に次のように述べている: "この空間が空であればkを増やし、 kが以前にステップサイズの倍数であったならば、次の文を実行する。 したがって、すべてのstep size要素に対してステートメントを実行します。これは、シーケンスの記述方法とまったく同じです。 ステートメント自体は単純です。 それはすべて4 、...を生成します。

 n=p[n-1];} 

gccで動作するreturn-return-return-returnを使って、シーケンス内の最初のn項の最後の要素を返す。これはn番目の項である。


Anders Kaseorg 06/20/2017.

Pyth、29バイト

M?tH?eJ.DtHg1GghG-tHhJ+2hJ2g1 

オンラインで試してみてください

使い方

リストを欺く代わりに、これは単純な再帰式を使用します。

M                                def g(G, H):
 ?tH                                 if H - 1:
      J.DtHg1G                           J = divmod(H - 1, g(1, G))
    ?e                                   if J[-1]:
              ghG-tHhJ                       return g(G + 1, H - 1 - J[0])
                                         else:
                      +2hJ                   return 2 + J[0]
                                     else:
                          2              return 2
                           g1Q   print(g(1, eval(input()))) 

xnor 06/20/2017.

ハスケル 、67バイト

 0%j=2
i%j|d<-div i$f j=last$d+2:[(i-d-1)%(j+1)|d*f j 

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

再帰的算術解法は、 Anders KaseorgのPyth解答と基本的に同じ方法であった。

このコードは、ゴルフボールのように見える醜い部分で覆われていますが、私は見えませんでした。

関数i%j実際にはmod i(f j)>0かどうかをチェックし、対応する2つの式の1つを評価するためにガードを使用したいとします。 しかし、どちらの式もdiv i(f j)使用します。 警備員に拘束されてもそれは両側に適用されません。 私が知る限り、警備員は他の警備員に「配付」することはできません。 letwhereは長すぎます。 したがって、コードはlastに2つの式の1つを選択し、ガードが変数をバインドします。 ああ。

理想的には、 divmod両方が使用されているので、 divModを使用しますが、 (d,m)<-divMod ...は長い式です。 代わりにdiv値が除数の元の値に満たないかどうかを調べることで、modが非ゼロであることを確認します。

Haskellがdiv 0短絡した場合、 0%j=2場合は必要ありません。 .predは1インデックスの入力をゼロインデックスに変換します。そうしないとどこでも-1補正が行われます。

4 comments
Ørjan Johansen 06/21/2017
% 1-indexedにすると、5バイトの修正が必要になります。 However 、あなたはfを無料で%インライン展開できます。そして、 fは匿名になりますので、全体的に2バイトを節約できます。
xnor 06/21/2017
@ØrjanJohansenここでインラインで何を意味していますか? バイトを失うことなくfへの参照を変更する方法はわかりません。
Ørjan Johansen 06/21/2017
divModは、 !!(0^m)分岐できるので、1バイト安くなるようです。 今のところ私は次のようになります: 1%j=2;i%j|(d,m)<-divMod(i-1)$j%1=[(i-d-1)%(j+1),d+2]!!(0^m);‌​(%1)
Ørjan Johansen 06/21/2017
ご覧のように、インライン展開は1- .predを前提としてい.pred 。これは.predを削除し.pred

Arnauld 06/20/2017.

JavaScript(ES6)、 98 93 91バイト

結果が利用可能になるとすぐに停止する再帰関数。

 f=(n,p,a=[...Array(n)])=>a[n-1]||f(n,-~p,a.map(c=>c?c:i?i++%(a[p]||2)?c:++v:(i=1,v=2),i=0)) 

代替バージョン、90バイト

Suggested by Shaggy for -1 byte

これはf(n)()で呼び出さなければなりません。 メタ対応する投稿は現在のところ肯定的なスコアを示しますが、この構文には明らかに異議があります。

 n=>g=(p,a=[...Array(n)])=>a[n-1]||g(-~p,a.map(c=>c?c:i?i++%(a[p]||2)?c:++v:(i=1,v=2),i=0)) 

デモ

 f=(n,p,a=[...Array(n)])=>a[n-1]||f(n,-~p,a.map(c=>c?c:i?i++%(a[p]||2)?c:++v:(i=1,v=2),i=0))

for(n = 1; n <= 50; n++) {
  console.log('a[' + n + '] = ' + f(n));
} 

2 comments
Shaggy 06/20/2017
n=>g=(p,a=[...Array(n)])=>a[n-1]||g(-~p,a.map(c=>c?c:i?i++%k‌​?c:++v:(i=1,v=2),i=0‌​,k=a[p]||2))は92バイトで動作するはずである。 f(n)()それを呼び出します。
Arnauld 06/20/2017
@シャギーありがとう! 代替バージョンとして追加されました。

Xanderhall 06/20/2017.

Java 8、124バイト

(i)->{int j=1,a[]=new int[i+1],k,s,n;for(;a[i]<2;){for(k=0,n=2;a[++k]>0;);for(s=a[j++]|2*k;k<=i;k+=s)a[k]=n++;}return a[i];} 

ラムダ式。

整数配列を作成し、n番目の値が入力されるまで連続して値を格納します。

intが加算,nはなく4バイトのスペースを必要とするため、可能な限り多くの宣言を減らすために、変数を先頭に宣言します,nは2です。

計算のj番目の反復で、スキップする必要がある '空白'の数はa[j] (または空白の場合は2)に等しくなります。 それは、最初に記入しなければならない空白が位置k場合、 k * a[j]は私たちに 'ステップ'を与える​​ことになります。

Related questions

Hot questions

Language

Popular Tags