Réguas esparsas mínimas

20

Uma régua padrão de comprimento n tem marcas de distância nas posições 0, 1, ..., n (em quaisquer unidades). Uma régua esparsa possui um subconjunto dessas marcas. Uma régua pode medir a distância k se ele tem marcas em posições p e q com p - q = k .

O desafio

Dado um número inteiro positivo n , imprima o número mínimo de marcas necessárias em uma régua esparsa de comprimento n para que ele possa medir todas as distâncias 1, 2, ..., n .

Este é o OEIS A046693 .

Como exemplo, para a entrada 6, a saída é 4. Ou seja, uma régua com marcas em 0, 1, 4, 6 funciona, como 1−0 = 1, 6−4 = 2, 4−1 = 3, 4−0 = 4, 6−1 = 5 e 6−0 = 6.

Regras adicionais

Casos de teste

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
Luis Mendo
fonte
Relacionado
Luis Mendo

Respostas:

2

Gelatina , 14 bytes

ŒcIQL
‘ŒPÇÐṀḢL

Um link monádico que recebe e retorna números inteiros não negativos.

Experimente online! (primeiros 15 valores aqui - não eficiente)

Quão?

Encontra todos os governantes que você pode fazer usando as marcas de 1 a n + 1 (o conjunto de potências de [1, n + 1]) ordenados por sua contagem de marcações e mantém apenas aqueles que criam distâncias mensuráveis ​​máximas (o comprimento do conjunto de diferenças entre todos os pares de marcas ordenados) e, em seguida, retorna o comprimento da primeira (ou seja, [uma das] as mais curtas [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
Jonathan Allan
fonte
5

Mathematica, 84 bytes

#&@@(l=Length)/@Select[(S=Subsets)@Range[0,d=#],l@Union[Differences/@S[#,{2}]]==d&]&

Experimente online!

J42161217
fonte
5

Pitão , 14 bytes

lh.Ml{-M^Z2ySh

Experimente aqui!

Pitão , 21 19 bytes

hlMf!-SQmaFd.cT2ySh

Experimente aqui!

Como funciona

Vou atualizar isso depois do golfe.

hSlMfqSQS {maFd.cT2ySh ~ Programa completo. Q = entrada.

                   Sh ~ O intervalo inteiro [1, Q + 1].
                  y ~ Powerset.
    f ~ Filtro (usa uma variável T).
              .cT2 ~ Todas as combinações de dois elementos de T.
          m ~ Mapa.
           aFd ~ Reduza pela diferença absoluta.
        S {~ Desduplicar, classificar.
     qSQ ~ É igual ao intervalo inteiro [1, Q]?
  ~ Mapa com comprimento.
hS ~ Mínimo.

Obrigado a isaacg por salvar um byte para minha segunda abordagem e me inspirar a tirar 3 bytes da minha abordagem atual!

Mr. Xcoder
fonte
Como o conjunto de energia é ordenado por comprimento, o primeiro Sé desnecessário.
Isaacg
@isaacg Thanks! Sua ótima resposta (+1) também me inspirou a economizar 3 bytes da minha nova abordagem, tornando-a 14 bytes.
Sr. Xcoder
5

Python 2 , 129 128 126 bytes

graças a totallyhuman por -1 byte

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)]

Experimente online!

saída é via código de saída

ovs
fonte
4

Casca , 20 18 bytes

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

Obrigado @ H.PWiz por -2 bytes!

Experimente online!

Explicação

λ               )…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
ბიმო
fonte
oa-é o mesmo que
H.PWiz 26/11
@ H.PWiz realmente importa apenas que seus comprimentos sejam iguais, porque não pode haver diferenças fora do intervalo [0..N].
Martin Ender
Você provavelmente poderia até usar .
Martin Ender
4

Geléia , 17 bytes

‘ŒPµạþ`FQḊṫ³µÐfḢL

Experimente online!

Guardado 1 byte graças a Jonathan Allan !

Mr. Xcoder
fonte
O poder-set é classificada de mais curto para a mais longa, então eu acho que ḢLdeve estar ok ..
Jonathan Allan
3

Pitão, 15 bytes

lhf!-SQ-M^T2yUh

Suíte de teste

Como funciona

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
isaacg
fonte
3

Geléia , 17 bytes

_þ`ẎQṢw
‘ŒPçÐfRḢL

Experimente online!

Emprestado um truque da resposta do Sr. Xcoder para -1.
-1 graças a Jonathan Allan .

Erik, o Outgolfer
fonte
O poder-set é classificada de mais curto para a mais longa, então eu acho que ḢLdeve estar ok ..
Jonathan Allan
1

Ruby , 98 bytes

->n{(w=*0..n).find{|x|w.combination(x+1).find{|y|y.product(y).map{|a,b|(b-a).abs}.uniq.size>n}}+1}

Experimente online!

GB
fonte