最小的稀疏标尺


20

长度为n的标准标尺在位置0、1,...,n(以任何单位为单位)上具有距离标记。一个稀疏的统治者拥有这些商标的一个子集。标尺可以测量距离ķ如果它具有在位置的标记pqp - q = ķ

挑战

给定正整数n,输出长度为n的稀疏标尺所需的最小标记数,以便它可以测量所有距离1,2,...,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

Answers:


2

果冻,14 字节

ŒcIQL
‘ŒPÇÐṀḢL

单元链接,获取并返回非负整数。

在线尝试!此处前15个值-效率不高)

怎么样?

查找一个人可以使用按标记数排序的标记1到n + 1([1,n + 1]的幂集)制作的所有标尺,并仅保留那些产生最大可测量距离(标尺长度)的标尺。一组所有有序标记对之间的差异集),然后返回第一个(即最短的[s]中的一个)的长度。

Œ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〜Powerset。
    f〜过滤器(使用变量T)。
              .cT2〜T的所有两个元素组合。
          米〜图。
           aFd〜减少绝对差。
        S {〜重复数据删除,排序。
     qSQ〜是否等于整数范围[1,Q]?
  lM〜映射长度。
hS〜最小值。

感谢isaacg为我的第二种方法节省了一个字节,并激发了我从当前方法中节省3个字节!


由于功率集按长度排序,因此S不需要前者。
isaacg

@isaacg谢谢!您的好答案(+1)也启发了我从新方法中节省了3个字节,使其减少了14个字节。
Xcoder先生17年

5

Python 2中129个 128 126字节

多亏了totalhuman -1个字节

from itertools import*
r=range(1,input()+2)
[{a-b+1for a in l for b in l}>set(r)>exit(i)for i in r for l in combinations(r,i)]

在线尝试!

通过退出代码输出


4

外壳20 18字节

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

感谢@ H.PWiz -2个字节!

在线尝试!

说明

λ               )…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]范围之外没有任何区别。
Martin Ender's

您甚至可以使用
Martin Ender's


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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.