新規注文#3:5 8 6


16

はじめに(無視してもよい)

すべての正の数を規則正しい順序(1、2、3、...)で並べるのは少し退屈ですよね?そのため、すべての正数の順列(再編成)に関する一連の課題があります。これは、このシリーズの3番目の課題です(1番目2番目の課題へのリンク)。

この課題では、各行の合計が素数になるように、長さが増加する行に自然数を配置します。これについて本当に素晴らしいと思うのは、すべての自然数がこの配置にあるということです。番号はスキップされません!

この配置の視覚化は次のようになります。

row             numbers             sum
1                  1                  1
2                2   3                5
3              4   5   8             17
4            6   7   9  15           37
5          10 11  12  13  21         67
6        14  16 17  18  19  23      107
etc.

この三角形の行から要素を読み取ることができます。最初の20個の要素は、1、2、3、4、5、8、6、7、9、15、10、11、12、13、21、14、16、17、18、19(はい、ありますこのシーケンスに隠された新しい注文の歌)。

これは「純粋なシーケンス」チャレンジであるため、タスクは入力として特定のnに対してa n を出力anです。ここで、a n A162371です。nan

仕事

整数入力n与えられると、整数形式でan出力ます。

anは、自然数の辞書式に最も早い順列のn番目の要素として定義され、行によって読み取られる三角形として見た場合、n> 1の場合、行の合計は素数になります。自然数の最初の辞書式順列は1から始まるため、a1は1です。この定義ではa1=1およびa1は素数である必要はありません。これは、OEISシーケンスA162371です。

注:ここでは、1ベースのインデックス付けが想定されています。0ベースのインデックスを使用できます。そのためa0=1;a1=2など。これを使用することを選択した場合は、回答にこれを記載してください。

テストケース

Input | Output
---------------
1     |  1
5     |  5
20    |  19
50    |  50
78    |  87
123   |  123
1234  |  1233
3000  |  3000
9999  |  9999
29890 |  29913

ルール

  • 入出力は整数です(プログラムは少なくとも1〜32767の範囲の入出力をサポートする必要があります)
  • 無効な入力(0、フロート、文字列、負の値など)は、予期しない出力、エラー、または(未)定義された動作につながる可能性があります。
  • デフォルトのI / Oルールが適用されます。
  • デフォルトの抜け穴は禁止されています。
  • これはなので、バイト単位の最短回答が勝ちます

シーケンスを無限に出力することも、代わりにジェネレーターを返すこともできますか?
ジョーキング

2
エラー、1は素数ではありません
ジョーキング

1
a(1)= 1についての@JoKing:それを追加します。それは確かに例外です。これはOEISエントリに明確に記載されていますが、購入することを明示的に言及することはできませんでした。質問に追加します。ありがとう。
agtoever

@JoKingは、シーケンスの定義で必要なのは、n> 1の場合、行の合計が素数であるということだけです。シーケンスは自然数の最初の辞書式順列であるため、a(1)は1として出力されます。実際、1は素数ではなく、チャレンジまたはシーケンスの定義は1が素数であるとは言いません。 。
agtoever

4
関連シーケンス:A075348
jimmy23013

回答:



3

Perl 6の80の 77バイト

{({$!=@_;+(1...{$_$!&&(|$!,$_).rotor(1..*).one.sum.is-prime-1})}...*)[$_]}

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

説明:

{                                  }  # Anonymous code block
 (                        ...*)[$_]   # Index into the infinite sequence
  {                      }   # Where each element is
   $!=@_;  # Save the list of previous elements into $!
   +(1...{             })    # Return the first number that
          $_$!         # Has not appeared in the list so far
          &&            # And
          (|$!,$_)      # The new sequence
          .rotor(1..*)  # Split into rows of increasing length
                        # And ignoring incomplete rows
          .one          # Have exactly one row
          .sum          # Where the sum
          .is-prime-1   # Is not prime (i.e. just the first row)

3

Haskell122 120バイト

import Data.Numbers.Primes
l%a|(p,q)<-splitAt l a,(s,k:t)<-span(not.isPrime.(+sum p))q=p++k:(l+1)%(s++t)
((1:1%[2..])!!)

オンラインでお試しください!(のために余分な2バイトがありますf=

編集:2バイトを節約するために、0ベースのインデックスを使用するようになりました。それを指摘してくれた@wastlに感謝します、私はOPでそれを見逃したに違いありません。

これは書くのがとても楽しかったです!ヘルパー関数%は、長さlと使用可能な値のリストを受け取りますa。シーケンスの値の無限リストを返します。長さは現在の三角形の行の長さよりも1つ短く、リストは無限で事前にソートされています。最初にlから最初の値をa取得し、次に合計を素数にする最初の(最小の)値が見つかるまでaの残りを調べます。spanいくつかのパターンマッチングを使用して、その値を中心にリストを分割します。今やらなければならないのは、その新しい値を生成し、次の行の長さl+1と残りの値で繰り返しますa。最終結果のために、1を追加し(n = 0の特別な場合)、でインデックスを付け!!ます。


1
0:チャレンジが0ベースのインデックス作成を使用できると述べているので、削除できると思います。
wastl



0

LUA242の 228 226 211バイト

s={}u={}i=0 n=0+...while i<n do
n=n-i
x,S=1,0
for j=1,i do
while u[x]do x=x+1 end
s[j]=x
S=S+x
u[x]=0
end
while u[x]or p do
x=x+1
d=S+x
p=F
for c=2,d-1 do
p=p or d%c<1
end
end
i=i+1
s[i]=x
u[x]=0
end
print(s[n])

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

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