スパース分度器


12

何らかの正の整数が与えられた場合n、マークの数が最も少ない分度器を設計します。これにより、2π/n(それぞれの測定で)の整数倍であるすべての角度を測定できます。

詳細

出力として、各マークの位置を表す0to n-1(または1to n)の範囲の整数のリストを出力できます。別の方法としては、長さの出力文字列/一覧表示することができますn#、各マークの位置との_何もありません(アンダースコア)。(または2つの異なる文字をより便利になります。)
例:についてn = 5、あなたはすべての角度を測定することができるように、正確に3マークが必要2π/5, 4π/5, 6π/5, 8π/5, 2πで(例えば)1つのマークを設定することにより、01つのマーク、2π/5および1つのマークがで6π/5。これをリスト[0,1,3]または文字列としてエンコードできます##_#_

出力は必ずしも一意ではないことに注意してください。

n:  output:
 1  [0]
 2  [0,1]
 3  [0,1]
 4  [0,1,2]
 5  [0,1,2]
 6  [0,1,3]
 7  [0,1,3]
 8  [0,1,2,4]
 9  [0,1,3,4]
10  [0,1,3,6]
11  [0,1,3,8]
20  [0,1,2,3,6,10]

PS:これはスパースルーラーの問題に似ていますが、線形スケール(両端)の代わりに、円形(角度)スケールを考慮します。

PPS:このスクリプトは、それぞれのマークのセットの一例を計算する必要がありますnオンラインでお試しください!

PPPS:@ngnが指摘したように、この問題は次数の循環グループの最小差分ベースを見つけることと同等nです。最小注文はhttp://oeis.org/A283297にリストされており、いくつかの理論的範囲はhttps://arxiv.org/pdf/1702.02631.pdfにあります



n = q^2 + q + 1プライムパワーの場合に正確にオーバーラップするボーダーラインのpeq
ピーターテイラー

@PeterTaylorなぜあなたはそれがduだと思うのかわかりません。また、「オーバーラップ」がどのように発生するか詳しく説明できますか?類似点はありますが、これらは非常に異なる2つの問題です。さらに、これはコードゴルフであり、あなたがリンクしたチャレンジには、そのスコアリングにプログラムのサイズさえ含まれていません。
flawr

それらは2つの非常に異なる問題ではありません。PPPSのOEISリンクを読んでください。そこに言及されている「歌手の相違点セット」は、私の回答で実装された射影フィールド法によって生成されたGolombルーラーです。採点方法が異なるという点を取り上げます。
ピーターテイラー

回答:


4

ゼリー、13バイト

ŒPðṗ2I%QLðÐṀḢ

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

使い方

ŒPðṗ2I%QLðÐṀḢ  Main link. Argument: n (integer)

ŒP             Powerset; generate all subsequences of [1, ..., n].
  ð       ÐṀ   Begin a dyadic chain. Call it with all subsequences S as left
               argument and n as right one. Return the array of all sequences for
               which the chain returns the maximal result, i.e., [0, ..., n-1].
   ṗ2              Cartesian power 2; generate all pairs of elements of S.
     I             Increments; map each pair [x, y] to [y-x].
      %            Map each [y-x] to [(y-x)%n].
       Q           Unique; deduplicate the array of modular difference singletons.
        L          Take the length.
         ð     Begin a new, dyadic chain.
               Left argument: S' (filted subsequences). Right argument: n
            Ḣ  Take the first element of S'.
               Since S was sorted by length, so is S', so the first element of S'
               is the shortest subsequence that satisfies the condition.

4

MATL、20バイト

:qGZ^!"G:q@&-G\m?@u.

これを超える入力の場合、TIOのメモリが不足し8ます。

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

使い方

これにより[0 1 ... n-1]、exponentのデカルト累乗が生成され、nループを使用して各デカルトタプルがテストされます。テストでは、タプル場合、要素のすべてのペアごとの差異を計算し、それらの違いを法とする場合を見に構成されてn含まれ、すべての数字を01、...、 n-1

条件を満たしているデカルトタプルが見つかるとすぐにループが終了し、そのタプルの一意のエントリがソリューションとして出力されます。

これは、u > vが与えられた場合u個の 一意のエントリを持つタプルの十分なセットが、v個の一意のエントリを持つタプルよりも早くテストされることが保証されているためです。「十分なセット」とは、そのセット内のタプルのいずれも解決策でない場合、同じ数の一意のエントリを持つ他のタプルが解決策ではないことを意味します。

たとえばn = 3、デカルトのタプルの場合、次のようになります。各行はタプルです。

0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
0 2 0
 ···
2 2 1
2 2 2
  • 最初のタプル、0 0 01一意の値を持つ唯一の関連するタプルです。後で表示される場合でも、そう1 1 1である場合にのみソリューションです。したがって、タプルによって形成されるシングルトンセットは、u = に対して十分なセットです。2 2 20 0 00 0 01
  • 2番目と3番目のタプル、つまり0 0 1andは0 0 2u =の十分なセットを形成し2ます。つまり、2一意の値を持つすべてのケースをカバーします。最初にテストされている0 1 0ため、4番目のタプルがソリューションとして選択されることはありません0 0 1。同様に、タプル0 2 0はの後に表示されるため選択されることはありません0 0 2。などのタプルは、同等で(モジュロおよび重複値まで)、最初に表示2 2 1されるため、ソリューションとして選択されることはありません。0 0 1n
  • 等。

コメントされたコード:

:q         % Push [0 1 ... n-1], where n is the input (implicit)
GZ^        % Cartesian power with exponent n. Gives an (n^n) × n matrix
           % where each row is a Cartesian tuple
!          % Transpose. Now each Cartesian tuple is a column
!"         % For each column (that is, each Cartesian tuple)
  G:q      %   Push [0 1 ... n-1] (*)
  @        %   Push current column
  &-       %   Matrix of pairwise differences (**)
  G\       %   Modulo n, element-wise
  m        %   Ismember function: for each entry in (*), gives true iff
           %   it is present in (**)
  ?        %   If all entries are true
    @      %     Push current column
    u      %     Unique entries. This is the solution
    .      %     Break loop
           %   End (implicit)
           % End (implicit)
           % Display (implicit)

3

スタックス26 21 バイト

Åæ4&╕u◙╩►s∙Φ▬═(0~ d+Q

オンラインで実行してデバッグします!

現在、オンラインバージョンは入力に失敗しています20が、このバグは修正されており、まだオンラインインタープリターにデプロイされていません20ケースの実行には時間がかかることに注意してください。

説明

ペアごとの差を計算する方法が原因ことが判明したが、私はの等価性を心配する必要はありませんkし、x-kここに。5バイトを節約します。

解凍されたバージョンを使用して説明します。

rS{%o~{;i@c:2{E-x%mu%x<wm
r                            [0..`x`], where `x` is input
 S                           Powerset
  {%o~                       Sort by length
      {;i@             w     For each element in the powerset
          c:2                All pairs
             {    m          Map each pair `[p,q] to
              E-                 `q-p`
                x%               `(q-p)%x`
                   u%        Count of unique modulo differences
                     x<      Loop until the count of unique modulo differences is larger than the input(`n`)
                             Now we have found a valid set in the powerset
                        m    Output the members of the set,one element per line.

要件を強制することによって0及び1解答の両方BEのメンバー、私たちはとのPowersetを生成することができます[2..x]代わりに[0..x]して、追加01のPowersetのすべての要素を手動で。より効率的ですが、入力を1特別に処理する必要があり、より多くのバイトが必要です。



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