N番目のグリフォン番号


26

先日、私は一連の数字を思いつき、それに対するOEIS番号を確認することにしました。驚いたことに、シーケンスはOEISデータベースに含まれていないように見えたので、自分にちなんでシーケンスに名前を付けることにしました(私よりもはるかに賢い他の誰かがおそらくこれを思いついており、誰かが見つけたらこのシーケンスの実際の名前はコメントしてください。質問のタイトルを変更します)。シーケンスがどこにも見つからなかったので、自分の名前にちなんで名前を付けることにしました。編集:このシーケンスがOEISシーケンスA053696-1に等しいという事実に注意を向けてくれた@Surbに感謝します。

グリフォン番号は、a+a2+...+axという形式の番号です+ a x。ここで、axは両方とも2以上の整数であり、Gryphonシーケンスは昇順のすべてのGryphon番号のセットです。グリフォン番号を形成する方法が複数ある場合(最初の例は30、両方とも2+22+23+24および5+52)、番号はシーケンス内で1回だけカウントされます。最初のいくつかのGryphon番号は次のとおりです。6,12,14,20,30,39,42,56,62,72

あなたのタスク:

入力として整数nを受け取り、n番目のグリフォン数を出力するプログラムまたは関数を作成します。

入力:

0から10000までの整数(両端を含む)。シーケンスは、0インデックス付きまたは1インデックス付きのどちらでも使用できます。混乱を避けるために、回答で使用するインデックスシステムを明記してください。

出力:

入力に対応するグリフォン番号。

テストケース:

これは、シーケンスのインデックスが0であると想定していることに注意してください。プログラムが1インデックスのシーケンスを想定している場合、すべての入力番号をインクリメントすることを忘れないでください。

Input:    Output:
0   --->  6
3   --->  20
4   --->  30
10  --->  84
99  --->  4692
9999 -->  87525380

得点:

これはであるため、バイト単位の最低スコアが優先されます。


6
グリフォンシーケンスはA053696-1です。つまり、A053696は、の形式の数字の増加シーケンスです。a0+a1++ax
サーブ

2
@ああああ、それは私がそれを見つけることができなかった理由です。その場合、その情報を編集に入れますが、シーケンスのより良い名前はないようであるため、質問の残りの部分はそのままにします。
グリフォン-モニカを

回答:


15

ゼリー、9 バイト

bṖ’ḅi-µ#Ṫ

(1-indexed)整数をSTDINから読み取り、結果を出力する完全なプログラム。

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

どうやって?

グリフォン番号は、それ自体よりも小さい基数で表現できる番号であり、すべての数字は最下位のゼロ以外の数字です。例えば:

30=1×24+1×23+1×22+1×21+0×20302=11110

84=1×43+1×42+1×41+0×40844=1110

このプログラムはn、をv=0取得してから開始し、このプロパティをテストして、そのような番号vが見つかるまで増分しn、最後の番号を出力します。

基数をテストするにはb、すべての数字から1を引き、base から変換してv、結果が1かどうかをチェックします。(bはより小さいことに注意してくださいv

3020×304+0×303+0×302+0×301+(1)×300=1

8440×843+0×842+0×841+(1)×840=1

bṖ’ḅi-µ#Ṫ - Main Link: no arguments
       #  - set v=0 then count up collecting n=STDIN matches of:
      µ   -  the monadic link -- i.e. f(v):  e.g. v=6
 Ṗ        -    pop (implicit range of v)            [1,2,3,4,5]
b         -    to base (vectorises)                 [[1,1,1,1,1,1],[1,1,0],[2,0],[1,2],[1,1]]
  ’       -    decrement (vectorises)               [[0,0,0,0,0,0],[0,0,-1],[1,-1],[0,1],[0,0]]
   ḅ      -    from base (v) (vectorises)           [0,-1,5,1,0]
     -    -    literal -1                           -1
    i     -    first index of (zero if not found)   2
          - }  e.g. n=11 -> [6,12,14,20,30,39,42,56,62,72,84]
        Ṫ - tail         -> 84
          - implicit print

11

MATL16 13バイト

:Qtt!^Ys+uSG)

1ベース。

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

説明

n = 3例として入力を検討してください。

:    % Implicit input: n. Range
     % STACK: [1 2 3]
Q    % Add 1, element-wise
     % STACK: [2 3 4]
tt   % Duplicate twice, transpose
     % STACK: [2 3 4], [2 3 4], [2;
                                 3;
                                 4]
^    % Power, element-wise with broadcast
     % STACK: [2 3 4], [ 4   9  16;
                         8  27  64;
                        16  81 256]
Ys   % Cumulative sum of each column
     % STACK: [2 3 4], [ 4    9  16;
                         12  36  80;
                         28 117 336]
+    % Add, element-wise with broadcast (*)
     % STACK: [ 6  12  20;
               14  39  84
               30 120 340]
u    % Unique elements. Gives a column vector
     % STACK: [  6;
                14;
                30;
                12;
               ···
               340]
S    % Sort
     % STACK: [  6;
                12
                14;
                20;
               ···
               340]
G)   % Push input again, index. This gets the n-th element. Implicit display
     % STACK: 14

ステップ(*)で得られた行列には、おそらく繰り返されるグリフォン数が含まれています。特に、n最初の行に個別のグリフォン番号が含まれています。これらは必ずしもn最小のグリフォン数ではありません。ただし、左下のエントリ2+2^+···+2^n は右上のエントリを超えているn+n^2ため、最後の行のすべての数値は最初の行の数値を超えています。これは、マトリックスを右方向または下方向に拡張しても、グリフォン数nがマトリックス内の最低数よりも小さいことを意味しません。したがって、マトリックスにはn最小のグリフォン数が含まれることが保証されます。その結果、そのn-th最も低いユニークな要素がソリューションです。


1
なんてこった、これはすごい!
IQuick 143

8

Haskell、53バ​​イト

([n|n<-[6..],or[a^y+n==n*a+a|a<-[2..n],y<-[3..n]]]!!)

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

整数およびが存在して場合、数値はグリフォンです。na2x2n=i=1xai

総当たり検索でこれが当てはまることを示すように、すべての無限リストを生成します。n6

答えは、このリストへの(ゼロインデックス付き)インデックス関数で、Haskellではとして示されてい(list!!)ます。

なぜa^y+n==n*a+a正しいのですか?

等比数列を合計する式から:

i=1ναρi1=α(1ρν)1ρ

我々はせ、持っている:(α,ρ,ν)=(a,a,x)

n=i=1xai=a(1ax)1a=aax+11a.

方程式を並べ替えると、ます。n(1a)=aax+1

さらに並べ替えると、ます。ax+1+n=na+a

ブルートフォース検索での置換は、最終式を生成します。y=x+1a^y+n=n*a+a

n十分になるまで検索していますか?

  • もし(換言すれば、)、次いで 、を証明します。したがって、値チェックする意味はありません。a>nan+1

    ay+n>a2(n+1)a=na+a
    ay+nna+aa>n

  • 同様に、場合、 再度証明。y>n

    ay+n>an=an1a2n1a>(n+1)a=na+a,
    ay+nna+a

    最小のグリフォン数を知っているので、と仮定できます。2n1>n+1n6


7

Python 3.8(プレリリース)98 92 89 78 71バイト

lambda n:sorted({a*~-a**x//~-a for a in(r:=range(2,n+3))for x in r})[n]

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

0インデックス。f(10000)はfloatをオーバーフローさせるため、ここでは整数除算を使用する必要があります。

およびであるすべてのGryphon番号を生成し、それらをソートして、番目の要素を選択します。2an+22xn+2n

ジョナサンアランのおかげで-6バイト

ArBoのおかげで-3バイト。彼が自分で提案したように私はほとんどやったが、{*(...)}とにかくスペースを節約しない使用しようとした

mathmandanのおかげで-11バイト

ArBoのおかげで-7バイト

数学的な有効性の証明

数学的な慣例は1インデックスですが、この証明のために0インデックスを使用しています。

  • してみましょう可能グリフォン数番目Gnn
  • ましょう(からグリフォン番号と)g(a,x)=a+a2+...+axax
  • レッツすべてグリフォン番号のセットでとAn2an+22xn+2
  • 我々が知っているA0={g(2,2)}={6}={G0}
  • An+1={g(a,x),g(a+1,x),g(a,x+1),g(a+1,x+1)|g(a,x)An}
  • g(a+1,x)<g(a+1,x+1)すべてのおよびについてax
  • g(a,x+1)<g(a+1,x+1)すべてのおよびについてax
  • したがって、場合Gn+1g(a+1,x+1)Gn=g(a,x)
  • g(a+1,x)<g(a+2,x)すべてのおよびについてax
  • g(a,x+1)<g(a,x+2)すべてのおよびについてax
  • したがって、、他の可能性がないため、はまたはなければなりません。Gn+1g(a+1,x)g(a,x+1)Gn=g(a,x)
  • この情報を使用して、場合、と結論付けることができます。Gn+1An+1GnAn
  • を知っているので、このルールを使用して、すべてのを誘導できます。G0A0GnAnn
  • これはから適用できるため、が最小から最大に順序付けられている場合、はインデックスになければなりませんG0GnGnnAnAn

f=不要で、さらにlambda n,r=range:4枚節約します(そのように
ジョナサンアラン

ドロップset()し、セット内包表記に置き換えて89
ArBo

また、f=89-byterのTIO
ArBo

Python 3.8と割り当て式で86バイト
ovs

「したがって、Gn = g(a、x)ならばGn + 1≠(a + 1、x + 1)」という行は誤りです。 ...
IQuick 143

5

J35 32バイト

FrownyFrogのおかげで-3バイト

3 :'y{/:~~.,}.+/\(^~/>:)1+i.y+2'

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

説明はオリジナルと同じです。単に明示的な形式を使用してバイトを保存し、倍数を削除します@

元の回答、暗黙、説明付き:35バイト

{[:/:~@~.@,@}.[:+/\@(^~/>:)1+i.@+&2

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

Luis Mendoのアプローチと同様に、最上部の行2 3 ... nと左の列を持つ「パワーテーブル」(タイムテーブルのような)を作成します1 2 ... n

 2   3    4     5     6      7
 4   9   16    25    36     49
 8  27   64   125   216    343
16  81  256   625  1296   2401
32 243 1024  3125  7776  16807
64 729 4096 15625 46656 117649

^~/ >:テーブルを1+i.@+&2作成し、1... nシーケンスを作成+&2し、入力に2()を追加して、0または1の入力に対してもテーブルを作成するのに十分な要素があることを確認します。

上記の表を作成した後、解決策は簡単です。行の合計をスキャンして+/\から、最初の行を削除し、平坦化し、一意にし、並べ替えます/:~@~.@,@}.。最後に{、元の入力を使用してその結果にインデックスを付け、回答を作成します。


明示的な表記法で3を節約
FrownyFrog

ありがとう、すてきなキャッチ。
ヨナ


3

R65 62バイト

ジュゼッペのおかげで-1バイト。

n=scan();unique(sort(diffinv(t(outer(2:n,1:n,"^")))[3:n,]))[n]

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

1インデックス付き。

フォームのすべての値の行列を生成し、累積合計を取り、最初の行(0s)と2番目の行(対応するエントリ)を削除し、一意のソートされた値を受け取ります。aix=1

行列の一意の行を提供し、一意のエントリを提供しsort(unique(...))ないため、機能しないことに注意してくださいunique。を使用unique(sort(...))するとsort、ベクトルに変換されるため機能します。


これは、もう少し作業がかかりますが、使用tしてdiffinvいる64バイト
ジュゼッペ・

1
@ジュゼッペありがとう!知りませんでしたdiffinv。に置き換えて[-1:-2,]、さらに2バイトをゴルフダウンしました[3:n,]
ロビンライダー



1

、36バイト

NθFθFθ⊞υ÷⁻X⁺²ι⁺³κ⁺²ι⊕ιF⊖θ≔Φυ›κ⌊υυI⌊υ

オンラインでお試しください!リンクは、コードの詳細バージョンです。1インデックス付き。ルイスメンドーのアルゴリズムを使用します。説明:

Nθ

入力します。n

FθFθ⊞υ

Gryphon番号の行グリッドを作成し、それぞれを事前定義リストにプッシュします。nn

÷⁻X⁺²ι⁺³κ⁺²ι⊕ι

という事実を使用して、グリフォン数を計算します。1xai=ax+1aa1

F⊖θ≔Φυ›κ⌊υυ

最小のグリフォン番号を削除します。n1

I⌊υ

残りの最小のグリフォン番号を印刷します。


1

Japt、23バイト

親愛なるジェブス!ゴルフの仕方を本当に忘れてしまったか、酒がついに被害をこうむっています!

ジョナサンの解決策の直接のポートではありませんが、彼の観察に非常に触発されました。

@ÈÇXìZ mÉ ìZÃeÄ}fXÄ}gNÅ

それを試してみてください


1

05AB1E、12 バイト

L¦ãε`LmO}êIè

0インデックス付き

オンラインそれを試してみてくださいまたは最初に確認するアイテムをn

説明:

L             # Create a list in the range [1, (implicit) input-integer]
              #  i.e. 4 → [1,2,3,4]
 ¦            # Remove the first item to make the range [2, input-integer]
              #  i.e. [1,2,3,4] → [2,3,4]
  ã           # Create each possible pair of this list by using the cartesian product
              #  i.e. [2,3,4] → [[2,2],[2,3],[2,4],[3,2],[3,3],[3,4],[4,2],[4,3],[4,4]]
   ε          # Map each pair to:
    `         #  Push the values of the pair separately to the stack
              #   i.e. [4,3] → 4 and 3
     L        #  Take the list [1, value] for the second value of the two
              #   i.e. 3 → [1,2,3]
      m       #  And then take the first value to the power of each integer in this list
              #   i.e. 4 and [1,2,3] → [4,16,64]
       O      #  After which we sum the list
              #   i.e. [4,16,64] → 84
            # After the map: uniquify and sort the values
              #  i.e. [6,14,30,12,39,120,20,84,340] → [6,12,14,20,30,39,84,120,340]
          Iè  # And index the input-integer into it
              #  i.e. [6,12,14,20,30,39,84,120,340] and 4 → 30
              # (after which the result is output implicitly)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.