Minimalne rzadkie linijki

20

Standardowa linijka o długości n ma znaczniki odległości w pozycjach 0, 1, ..., n (w dowolnych jednostkach). Rzadki władca ma podzbiór tych znaków. Linijka może zmierzyć odległość k, jeśli ma znaczniki w pozycjach p i q za pomocą p - q = k .

Wyzwanie

Biorąc pod uwagę dodatnią liczbę całkowitą n , wypisz minimalną liczbę znaków wymaganych w rzadkiej linijce o długości n, aby mogła zmierzyć wszystkie odległości 1, 2, ..., n .

To jest OEIS A046693 .

Na przykład dla wejścia 6 wyjście wynosi 4. Mianowicie, linijka ze znakami na 0, 1, 4, 6 działa, jako 1-0 = 1, 6-4 = 2, 4-1 = 3, 4-0 = 4, 6-1 = 5 i 6-0 = 6.

Dodatkowe zasady

  • Algorytm powinien być prawidłowy dla dowolnego dużego n . Jest jednak dopuszczalne, jeśli program jest ograniczony ograniczeniami pamięci, czasu lub typu danych.
  • Dane wejściowe / wyjściowe można przyjmować / wytwarzać dowolnymi rozsądnymi środkami .
  • Programy lub funkcje są dozwolone w dowolnym języku programowania . Standardowe luki są zabronione.
  • Najkrótszy kod w bajtach wygrywa.

Przypadki testowe

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
źródło
Powiązane
Luis Mendo

Odpowiedzi:

2

Galaretka , 14 bajtów

ŒcIQL
‘ŒPÇÐṀḢL

Łącze monadyczne przyjmujące i zwracające nieujemne liczby całkowite.

Wypróbuj online! (pierwsze 15 wartości tutaj - nieefektywne)

W jaki sposób?

Znajduje wszystkie linijki, które można wykonać, używając znaczników od 1 do n + 1 (zbiór mocy [1, n + 1]) uporządkowanych według ich liczby znaczników, i zachowuje tylko te, które tworzą maksymalne mierzalne odległości (długość zestaw różnic między wszystkimi uporządkowanymi parami znaków), a następnie zwraca długość pierwszego (tj. [jednego z] najkrótszego [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
źródło
5

Mathematica, 84 bajty

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

Wypróbuj online!

J42161217
źródło
5

Pyth , 14 bajtów

lh.Ml{-M^Z2ySh

Wypróbuj tutaj!

Pyth , 21 19 bajtów

hlMf!-SQmaFd.cT2ySh

Wypróbuj tutaj!

Jak to działa

Zaktualizuję to po grze w golfa.

hSlMfqSQS {maFd.cT2ySh ~ Pełny program. Q = dane wejściowe.

                   Sh ~ Zakres liczb całkowitych [1, Q + 1].
                  y ~ Powerset.
    f ~ Filtr (używa zmiennej T).
              .cT2 ~ Wszystkie dwuelementowe kombinacje T.
          m ~ Mapa.
           aFd ~ Zmniejsz o różnicę bezwzględną.
        S {~ Deduplikuj, sortuj.
     qSQ ~ Czy jest równy zakresowi liczb całkowitych [1, Q]?
  IM ~ Mapa z długością.
hS ~ minimum.

Dzięki isaacg za uratowanie bajtu dla mojego drugiego podejścia i zainspirowanie mnie do gry w golfa 3 bajty poza moim obecnym podejściem!

Pan Xcoder
źródło
Ponieważ zestaw mocy jest uporządkowany według długości, pierwszy nie Sjest potrzebny.
isaacg
@isaacg Thanks! Twoja świetna odpowiedź (+1) również zainspirowała mnie do zaoszczędzenia 3 bajtów mojego nowego podejścia, co daje 14 bajtów.
Pan Xcoder
5

Python 2 , 129 128 126 bajtów

dzięki totalnie ludzkiemu za -1 bajt

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

Wypróbuj online!

wyjście odbywa się za pomocą kodu wyjścia

ovs
źródło
4

Łuska , 20 18 bajtów

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

Dzięki @ H.PWiz za -2 bajty!

Wypróbuj online!

Wyjaśnienie

λ               )…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
ბიმო
źródło
oa-jest taki sam jak
H.PWiz
@ H.PWiz tak naprawdę liczy się tylko to, że ich długości są takie same, ponieważ nie może być żadnych różnic poza zakresem [0..N].
Martin Ender
Prawdopodobnie możesz nawet użyć .
Martin Ender
3

Pyth, 15 bajtów

lhf!-SQ-M^T2yUh

Zestaw testowy

Jak to działa

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
źródło
3

Galaretka , 17 bajtów

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

Wypróbuj online!

Pożyczyłem sztuczki od pana Xcoder za odpowiedź na -1.
-1 dzięki Jonathan Allan .

Erik the Outgolfer
źródło
Zestaw mocy jest sortowany od najkrótszego do najdłuższego, więc myślę, że ḢLpowinno być OK.
Jonathan Allan,
1

Rubinowy , 98 bajtów

->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}

Wypróbuj online!

GB
źródło