ユニバーサル整数シーケンスを作成する


22

定義

すべての有限整数シーケンスが連続したサブシーケンスとして含まれている場合、(無限)整数シーケンスをユニバーサルと呼びましょう。

換言すれば、整数配列は12、...) 、各有限の整数シーケンスの場合にのみ場合に普遍的である(B 1、...、B N、オフセットが存在するKようにK + 1が、…、a k + n)=(b 1、…、b n

たとえば、次の理由から、正の素数のシーケンスは普遍的ではありません。

  • 負の整数、1、または合成数は含まれません。

  • 3が含まれていますが、連続したサブシーケンス 3、3、3)は含まれていません。

  • 25が含まれていますが、連続したサブシーケンス 2、5)は含まれていません。

  • それは連続したサブシーケンスが含まれているが(7、11、13) 、それは連続サブ配列が含まれていない(13、11、7)

仕事

選んで任意の単一のユニバーサル整数列を12、...)と、以下の規則に遵守し、お好みのプログラミング言語でそれを実装。

  • 完全なプログラムまたは機能を送信できます。

  • I / Oには3つのオプションがあります。

    1. 何も入力せずに、シーケンス全体を印刷または返す。

    2. インデックス・テイクのnを入力し、印刷として、あるいは返すnと

    3. 入力としてインデックスnを取得し、出力または出力(a 1、…、a n)します。

  • I / Oオプション2および3の場合、必要に応じて0ベースのインデックスを使用できます。

  • 送信は確定的である必要があります。同じ入力で複数回実行する場合、同じ出力を生成する必要があります。

さらに、すぐに明らかでない限り、選択したシーケンスが普遍的であることを証明してください。あなたの証明は証明されていない推測に依存しないかもしれません。

標準の規則が適用されます。バイト単位の最短コードが勝つように!


あなたの証明は証明されていない推測に依存しないかもしれません。私はそれが暗示されていると思った:p
エリックアウトゴルファー

そして、どのように数字の数字のリストを保存しますか?
RosLuP

回答:


13

、5バイト

これは無限リストを印刷します

ΣṖ…ݱ

オンラインでお試しください!または、シーケンスの最初のインデックスを見つけます。(ほとんどのシーケンスで大量のメモリを消費します)

説明:

   ݱ   Infinite list [1,-1,2,-2,3,-3,4,-4,5,-5...]
  …     Rangify       [1,0,-1,0,1,2,1,0,-1,-2,...]
 Ṗ      Powerset
Σ       Concatenate

Huskでは、無限リストに対して適切に動作します。ここでその動作を確認できます


どのようにQ機能するかについて詳しく説明することをお勧めします。(私はそれを手に入れたと思うが、私にはわからない。)
デニス

@デニスは私が欲しかったのではなく、判明したQ
-H.PWiz

9

パイソン249の 46 43バイト

def f(n):d=len(`n`);return n/d**(n%d)%d-d/2

f(n)リターンのnのみ。これは、in baseの最小桁を使用して、上位桁の1つを抽出します。nd

オンラインでお試しください!このスクリプト(デニス提供)は、任意の有限シーケンスを取りn、そのシーケンスの開始位置を示します。

説明

n/d**(n%d)%d-d/2
     (n%d)         least significant digit of n
n/d**(   )%d       get n%d-th digit of n
            -d/2   offset to get negative values

たとえば、からまでnの範囲で、の最後の数字が他の数字のいずれかを選択します。次に、負の値を取得するために追加します。31415926503141592659d=10n-d/2

n%d:       0  1  2  3  4  5  6  7  8  9
f(n)+d/2:  0  5  6  2  9  5  1  4  1  3
f(n):     -5  0  1 -3  4  0 -4 -1 -4 -2

スタンドアロンの代替、43バイト:

n=input();d=len(`n`);print n/d**(n%d)%d-d/2

len(`n`)代わりに使用できますlen(str(n))
デニス

ありがとう@デニス。必要な場合は、さらに説明を追加できます。
ジャフ

有限シーケンスを指定すると、シーケンス内のオフセットを見つける関数を作成しました。オンラインでお試しください!
デニス

これはとてもクールです。
-histocrat

いいね 唯一のものはn=2**63-1、表現がL追加されるので、それが上に壊れるということです(str(n)必要な場合は3バイトでアドレス指定します)。
ジョナサンアラン

5

Brachylog 2、11バイト

≜~×-₂ᵐ~ȧᵐ≜∋

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

また、リスト上の追加パーティションを使用したアルゴリズムも試しましたが、それより短くはありませんでした。これは、整数の無限ストリームを出力として生成するジェネレーターです。TIOリンクには、最初の1万個を印刷するヘッダーがあります。

説明

プログラムは、可能なすべての整数を順番に試行することから開始します(デフォルトでは整数について、残りのすべての可能性を試行します)。0、1、-1、2、-2などです(ただし、負の整数はプログラムの最後に到達しません)。これは、プログラムの唯一の「無限」ステップです。他のすべては有限です。

その後、整数のすべての可能な因数分解を生成し、異なる次数を異なるものとして扱い、2以上の値のみを使用します(したがって、有限数のみが存在します)。素数だけでなく、因数分解では合成数が許可されることに注意してください。これは、関数の実行のある時点でこのステップによって2以上の整数のすべての可能なシーケンスが生成されることを意味します(そのようなシーケンスには必然的に何らかの積があり、その積はある時点で初期によって生成されます)。

次に、これらのシーケンスのセットをすべての整数シーケンスのセットにマッピングする必要があります。これは、2つのステップで行われます。-₂各要素から2()を引き()、すべての非負整数シーケンスのセットを与え、プラスまたはマイナスを取ります(、すなわち「絶対値が次の値」)各要素()。後者のステップは明らかに非決定的であるため、Brachylogはそれをジェネレータとして扱い、入力リストの対応する要素にプラスまたはマイナスの要素を持つすべての可能なリストを生成します。これは、すべての可能な整数シーケンスのジェネレーターがあり、すべて生成される順序で生成することを意味します(具体的には、各要素の絶対値を取得し、それぞれに2を追加した場合に取得する順序要素、次に結果の要素の積で並べ替えます)。

残念ながら、質問はシーケンスのシーケンスではなく、単一のシーケンスを必要とするため、さらに2つのコマンドが必要です。最初に、Brachylogにシーケンスのシーケンスを厳密に明示的に生成するよう要求します(この方法で生成されるシーケンスの概念を記述するデータ構造を生成し、必要になるまで実際にシーケンスを生成するのではなく)。これにより、この場合はプログラムが高速になり、出力が要求された順序で確実に生成されます。最後に、ジェネレーターは個々のシーケンスの要素を一度に1つずつ出力します(前のシーケンスのすべての要素が出力されると、次のシーケンスに移動します)。

最終結果:可能な各整数シーケンスが生成され、一度に1つの要素が出力され、すべてが単一のユニバーサルシーケンスに連結されます。


ais523 ...それはあなたですか!?
致命的

それらでない場合、削除されたアカウントからの投稿が同じアカウント番号を示すことを考えると、それは偶然の一致です。
完全に人間の


4

パイソン2100の 99バイト

  • ovsのおかげで1バイト節約されました。itertoolsビルトインを繰り返して無限にループします。
from itertools import*
for n in count():
 for P in permutations(range(-n,n)*n):
	for p in P:print p

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

すべての非負の整数について、n繰り返し回数の整数範囲のすべての順列を無期限に出力し[-n; n)ますnこの変更されたバージョンを使用して、任意のサブシーケンスの
最初のオフセットkを検索できます。


while~0:。あわやあわや...
チャス・ブラウン

99バイトを使用してitertools.count
ovs

@ovsありがとう。その組み込みを知らなかった。
ジョナサンフレッチ

2

Perl 6、91バイト

loop (my$i=1;;$i++){my@n=(-$i..$i);my@m=@n;loop (my$k=1;$k <$i;$k++){@m=@m X@n;};print @m;}

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

これは、他の回答のいくつかと同様の方法を使用します。デカルト積を使用しての要素を印刷し(-1,0,1)、次にの要素のすべての順序付きペア、の要素の(-2,-1,0,1,2)すべての順序付きトリプレット(-3,-2,-1,0,1,2,3)などを印刷します。

私はPerlが初めてなので、もっとゴルフができるかもしれません。

より読みやすいバージョン:

loop (my $i = 1; ; $i++) {
  my @n = (-$i..$i);
  my @m = @n;
  loop (my $k=1; $k <$i; $k++) {
    @m = @m X @n;
  }
  print @m;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.