Накрийте набір кратними


14

Давайте безліч цілих чисел більше 1 і назвемо його X . Ми визначимо S (i) як множину всіх членів X, що ділиться на i, де i> 1 . Хочеться вибрати з цих підмножин групу таких наборів, що

  • Їх об'єднання - це множина X

  • Жоден елемент X не є в двох із множин.

Наприклад, ми можемо перегрупуватися {3..11}як

      {3,4,5,6,7,8,9,10,11}
S(3): {3,    6,    9,     }
S(4): {  4,      8,       }
S(5): {    5,        10,  }
S(7): {        7,         }
S(11):{                 11}

Деякі набори не можуть бути виражені таким чином. Наприклад, якщо ми беремо {3..12}, 12є кратним як 3, так і 4, що запобігає взаємовиключенню наших наборів.

Деякі множини можуть бути виражені декількома способами, наприклад {4..8}можуть бути представлені як

      {4,5,6,7,8}
S(4): {4,      8}
S(5): {  5,     }
S(6): {    6,   }
S(7): {      7, }

але вона також може бути представлена ​​як

      {4,5,6,7,8}
S(2): {4,  6,  8}
S(5): {  5,     }
S(7): {      7, }

Завдання

Наша мета - написати програму, яка буде приймати набір як вхід і виводити найменшу кількість підмножин, які покривають його таким чином. Якщо таких немає, слід вивести якесь значення, відмінне від натурального цілого (наприклад 0).

Це питання з тому відповіді будуть набиратись у байтах, при цьому менше байтів буде кращим.

Тести

{3..11}       -> 5
{4..8}        -> 3
{22,24,26,30} -> 1
{5}           -> 1

Якщо таких немає, слід вивести якесь значення, відмінне від натурального цілого (наприклад, 0). Чи не може наша програма замість цього визначитися з невизначеною поведінкою?
Містер Xcoder

Також ви можете додати тестовий випадок, як [5..5]? Чи можемо ми отримувати такі речі [8..4]?
Містер Xcoder

@ Mr.Xcoder Ні, це не може. Програми повинні бути в змозі визначити неможливі випадки, а не просто циклічно назавжди або збій на них.
Опублікувати Rock Garf Hunter

1
" 12є кратним обом 3і 4запобігає взаємовиключенню наших наборів ": чому? Я не бачу нічого іншого в постановці проблеми, яка потребує 12переходу в обидва підмножини.
Пітер Тейлор

1
Крім того, що з тестовими кейсами? [22,24,26,30]всі кратні 2. Ви впевнені, що не було б краще видалити це та пісочницю?
Пітер Тейлор

Відповіді:


6

Python 2 , 167 байт

lambda a:([q for q in range(a[-1])if a in[sorted(sum(j,[]))for j in combinations([[p for p in a if p%i<1]for i in range(2,1+a[-1])],q)]]+[0])[0]
from itertools import*

Спробуйте в Інтернеті!

-9 байт завдяки Захарі
-4 байти завдяки містеру Xcoder
-2 байту, використовуючи списки замість наборів
-5 байт шляхом використання, a in [...]а не any([a == ...]).
-2 байти завдяки містеру Xcoder
-8 байт шляхом об’єднання заяв
-5 байт завдяки містеру Xcoder
-7 байт завдяки містеру Xcoder / Zacharý
+7 байт, щоб виправити помилку
-1 байт завдяки ovs

Примітка

Це вкрай повільно для більшої максимальної кількості, оскільки воно жодним чином не оптимізоване; це не пройшло протягом 2 хвилин на пристрої містера Xcoder для [22, 24, 26, 30].


5

Клінго , 51 байт

{s(2..X)}:-x(X).:-x(X),{s(I):X\I=0}!=1.:~s(I).[1,I]

Демо

$ echo 'x(3..11).' | clingo cover.lp -
clingo version 5.1.0
Reading from cover.lp ...
Solving...
Answer: 1
x(3) x(4) x(5) x(6) x(7) x(8) x(9) x(10) x(11) s(3) s(4) s(5) s(7) s(11)
Optimization: 5
OPTIMUM FOUND

Models       : 1
  Optimum    : yes
Optimization : 5
Calls        : 1
Time         : 0.003s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.010s
$ echo 'x(4..8).' | clingo cover.lp -
clingo version 5.1.0
Reading from cover.lp ...
Solving...
Answer: 1
x(4) x(5) x(6) x(7) x(8) s(3) s(4) s(5) s(7)
Optimization: 4
Answer: 2
x(4) x(5) x(6) x(7) x(8) s(2) s(5) s(7)
Optimization: 3
OPTIMUM FOUND

Models       : 2
  Optimum    : yes
Optimization : 3
Calls        : 1
Time         : 0.001s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.000s
$ echo 'x(22;24;26;30).' | clingo cover.lp -
clingo version 5.1.0
Reading from cover.lp ...
Solving...
Answer: 1
x(22) x(24) x(26) x(30) s(5) s(8) s(22) s(26)
Optimization: 4
Answer: 2
x(22) x(24) x(26) x(30) s(3) s(22) s(26)
Optimization: 3
Answer: 3
x(22) x(24) x(26) x(30) s(2)
Optimization: 1
OPTIMUM FOUND

Models       : 3
  Optimum    : yes
Optimization : 1
Calls        : 1
Time         : 0.004s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.000s
$ echo 'x(5).' | clingo cover.lp -
clingo version 5.1.0
Reading from cover.lp ...
Solving...
Answer: 1
x(5) s(5)
Optimization: 1
OPTIMUM FOUND

Models       : 1
  Optimum    : yes
Optimization : 1
Calls        : 1
Time         : 0.001s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.000s

Здається, це не виявляє випадків без таких рішень x(3..12).(чи мені потрібно оновити?). До речі, ви можете запропонувати хороший вступ до клінго?
Крістіан Сіверс

1
@ChristianSievers На жаль, це була помилка, яку я тепер виправив. У UNSATISFIABLEтакому випадку він повинен виводитись . Я в основному використовував путівник Потаско .
Андерс Касеорг

4

Математика, 105 байт

Length@Select[Subsets@Table[Select[s,Mod[#,i]==0&],{i,2,Max[s=#]}],Sort@Flatten@#==Sort@s&][[1]]~Check~0&


Спробуйте
скопіювати в режимі он-лайн, скопіюйте та вставте код ctrl + v,
вставте вхід в кінці коду,
натисніть shift + введіть, щоб запустити

вхід

[{3,4,5,6,7,8,9,10,11}]

приймає список як вихідні
виходи 0, якщо таких немає


Гарне використанняCheck
Кейу Ган

Чому ви не скасували свою першу відповідь, коли у вас була робоча версія?
Ніл

Тому що це був абсолютно новий підхід? Є проблема?
J42161217

4

Haskell, 136 байт

import Data.List
f l|m<-maximum l=(sort[n|(n,c)<-[(length s,[i|j<-s,i<-[j,2*j..m],elem i l])|s<-subsequences[2..m]],c\\l==l\\c]++[0])!!0

Спробуйте в Інтернеті!

Як це працює

f l     =                           -- input set is l
   |m<-maximum l                    -- bind m to maximum of l
       [   |s<-subsequences[2..m]]  -- for all subsequences s of [2..m]
        (length s, )                -- make a pair where the first element is the length of s
            [i|j<-s,i<-[j,2*j..m],elem i l]
                                    -- and the second element all multiples of the numbers of s that are also in l
     [n|(n,c)<-       ,c\\l==l\\c]  -- for all such pairs (n,c), keep the n when c has the same elements as l, i.e. each element exactly once
   sort[ ]++[0]                     -- sort those n and append a 0 (if there's no match, the list of n is empty)
 (     )!!0                         -- pick the first element

Візьміть багато часу на {22,24,26,30}.


3

Желе, 38 35 34 33 31 28 25 24 23 20 19 байт

ṀḊŒPð%þ@⁹¬Sḟ1ðÐḟL€Ḣ

-5 байт завдяки Leaky Nun

Спробуйте в Інтернеті!

Я думаю, що третій тестовий випадок працює, але це дуже повільно.0виводиться, коли немає рішень.

Пояснення (можливо, це пояснення зрозуміло неправильно):

ṀḊŒPð%þ@⁹¬Sḟ1ðÐḟL€Ḣ     (input z)
ṀḊ                      - 2 .. max(z)
  ŒP                    - powerset
    ð                   - new dyadic chain
     %þ@⁹               - modulo table of z and that
         ¬              - logical not
          S             - sum
           ḟ1           - filter out 1's
             ðÐḟ        - filter out elements that satisfy that condition
                L€      - length of each element
                  Ḣ     - first element


Спасибі! І дякую, що ви самі цього не подали!
Zacharý

У мене є інше рішення на 18 байт ближче до мого оригіналу, мені це подобається краще:ṀḊŒPðḍ@þ@⁹Sḟ1ðÐḟḢL
Zacharý

Вуа ... ṀḊнасправді це справді крутий трюк!
Zacharý

Ну, це не працює, і не моє переписування! Це має вивести 0, а не 1
Zacharý

2

Джулія, 91 байт

x->(t=[];for i in x z=findfirst(x->x==0,i%(2:maximum(x)));zt?1:push!(t,z) end;length(t))

Гм ... ви забули включити посилання в межах назви мови, чи вона насправді названа "[Джулія]"?
Zacharý

Ви маєте рацію, звуть Юлія без дужок
Tanj

Ви можете зафіксувати це і на інших своїх відповідях!
Zacharý

Ого, це було багато відповідей! А якщо ви хочете вставити посилання, синтаксис[Text to display](link to website)
Zacharý
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.