最小限のスパースルーラー


20

長さnの標準ルーラーには、位置0、1、...、n(いずれかの単位)に距離マークがあります。まばらな支配者は、これらのマークのサブセットを持っています。ルーラーは、位置pqpq = kのマークがある場合、距離kを測定できます。

チャレンジ

正の整数nを指定すると、すべての距離1、2、...、nを測定できるように、長さnのスパースルーラーで必要なマークの最小数を出力します。

これはOEIS A046693です。

例として、入力6の出力は4です。つまり、0、1、4、6のマークが付いたルーラーは、1-0 = 1、6-4 = 2、4-1 = 3、4-0として機能します。 = 4、6-1 = 5、および6-0 = 6。

追加のルール

  • アルゴリズムは、任意の大きなnに対して有効でなければなりません。ただし、プログラムがメモリ、時間、またはデータ型の制限によって制限されている場合は許容されます。
  • 入力/出力は、任意の合理的な手段で取得/生成できます。
  • すべてのプログラミング言語プログラムまたは機能が許可されます。標準的な抜け穴は禁止されています。
  • バイト単位の最短コードが優先されます。

テストケース

1   ->   2
2   ->   3
3   ->   3
4   ->   4
5   ->   4
6   ->   4
7   ->   5
8   ->   5
9   ->   5
10  ->   6
11  ->   6
12  ->   6
13  ->   6
14  ->   7
15  ->   7
16  ->   7
17  ->   7
18  ->   8
19  ->   8
20  ->   8
21  ->   8
22  ->   8
23  ->   8
24  ->   9
25  ->   9
26  ->   9
27  ->   9
28  ->   9
29  ->   9
30  ->  10
31  ->  10 
32  ->  10

回答:


2

ゼリー、14 バイト

ŒcIQL
‘ŒPÇÐṀḢL

負でない整数を取り、返す単項リンク。

オンラインでお試しください!ここでは最初の15個の値-効率的ではありません)

どうやって?

マーク1からn + 1([1、n + 1]のべき集合)を使用して作成できるすべてのルーラーをマーキングカウント順に並べ、最大の測定可能な距離(長さマークのすべての順序付けられたペア間の差のセット)、最初の(つまり[最短]の1つ)の長さを返します。

ŒcIQL - Link 1: number of measurable distances: list of numbers, ruler  e.g. [1,2,3,7]
Œc    - all pairs                                [[1,2],[1,3],[1,7],[2,3],[2,7],[3,7]]
  I   - incremental differences                                          [1,2,6,1,5,4]
   Q  - de-duplicate                                                       [1,2,6,5,4]
    L - length                                                                      5

‘ŒPÇÐṀḢL - Main link: number, n              e.g. 4
‘        - increment                              5
 ŒP      - power-set (implicit range of input)   [[],[1],[2],[3],[4],[5],[1,2],[1,3],[1,4],[1,5],[2,3],[2,4],[2,5],[3,4],[3,5],[4,5],[1,2,3],[1,2,4],[1,2,5],[1,3,4],[1,3,5],[1,4,5],[2,3,4],[2,3,5],[2,4,5],[3,4,5],[1,2,3,4],[1,2,3,5],[1,2,4,5],[1,3,4,5],[2,3,4,5],[1,2,3,4,5]]
    ÐṀ   - keep those maximal under:
   Ç     -   call the last link (1) as a monad   [[1,2,3,5],[1,2,4,5],[1,3,4,5],[1,2,3,4,5]]
      Ḣ  - head                                  [1,2,3,5]
       L - length                                 4



5

Pyth、14バイト

lh.Ml{-M^Z2ySh

ここで試してみてください!

Pyth21 19バイト

hlMf!-SQmaFd.cT2ySh

ここで試してみてください!

使い方

ゴルフの後にこれを更新します。

hSlMfqSQS {maFd.cT2ySh〜完全なプログラム。Q =入力。

                   Sh〜整数の範囲[1、Q + 1]。
                  y〜パワーセット。
    f〜フィルター(変数Tを使用)。
              .cT2〜Tのすべての2要素の組み合わせ。
          m〜マップ。
           aFd〜絶対差で減らします。
        S {〜重複排除、並べ替え。
     qSQ〜整数範囲[1、Q]と等しいですか?
  lM〜長さのあるマップ。
hS〜最小。

2番目のアプローチのために1バイトを節約し、現在のアプローチから3バイトのゴルフをインスパイアしてくれたisaacgに感謝します!


パワーセットは長さ順に並べられているため、最初のセットSは不要です。
isaacg

@isaacgありがとう!あなたの素晴らしい答え(+1)も、新しいアプローチから3バイト節約し、14バイトにしたいと思いました。
ミスターXcoder


4

20 18バイト

λ▼mLfȯ≡⁰u´×≠tṖ⁰)…0

-2バイトをありがとう@ H.PWiz!

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

説明

λ               )…0  -- lambda with argument ⁰ as [0..N]
              Ṗ⁰     -- all subsets of [0..N]
             t       -- tail (remove empty subset)
    f(      )        -- filter by following function:
           ≠         --   absolute differences
         ´×          --   of all pairs drawn from itself
        u            --   remove duplicates
      ≡⁰             --   "equal" to [0..N]
  mL                 -- map length
 ▼                   -- minimum

oa-と同じです
H.PWiz

@ H.PWizは、[0..N]の範囲外には違いがないため、実際には長さが同じであることが重要です。
マーティンエンダー

おそらくも使用できます
マーティンエンダー


3

Pyth、15バイト

lhf!-SQ-M^T2yUh

テストスイート

使い方

lhf!-SQ-M^T2yUh
             Uh    [0, 1, ... n]
            y      Powerset - all possible rulers
  f                Filer rulers on
         ^T2       All pairs of marks, in both orders
       -M          Differences - (a)
     SQ            [1, ... n], the desired list of differences - (b)
    -              Remove (a) from (b)
   !               Check that there's nothing left.
 h                 The first remaining ruler (powerset is ordered by size)
l                  Length


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