Tutup satu set dengan banyak

14

Mari kita himpunan bilangan bulat lebih besar dari 1 dan menyebutnya X . Kami akan mendefinisikan S (i) sebagai himpunan semua anggota X yang dapat dibagi oleh i di mana i> 1 . Ingin memilih dari himpunan bagian ini sekelompok set sedemikian rupa

  • Persatuan mereka adalah himpunan X

  • Tidak ada elemen X dalam dua set.

Sebagai contoh, kita dapat menyusun kembali {3..11}sebagai

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

Beberapa set tidak dapat diekspresikan dengan cara ini. Sebagai contoh jika kita ambil {3..12}, 12adalah kelipatan dari 3 dan 4 yang mencegah set kita menjadi saling eksklusif.

Beberapa set dapat diekspresikan dalam berbagai cara, misalnya {4..8}dapat direpresentasikan sebagai

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

tetapi juga bisa direpresentasikan sebagai

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

Tugas

Tujuan kami adalah untuk menulis sebuah program yang akan menetapkan sebagai input dan menghasilkan jumlah himpunan bagian terkecil yang menutupinya dengan cara ini. Jika tidak ada, Anda harus menampilkan beberapa nilai selain bilangan bulat positif (misalnya 0).

Ini adalah pertanyaan sehingga jawaban akan dinilai dalam byte, dengan lebih sedikit byte yang lebih baik.

Tes

{3..11}       -> 5
{4..8}        -> 3
{22,24,26,30} -> 1
{5}           -> 1
Posting Rock Garf Hunter
sumber
Jika tidak ada, Anda harus menampilkan beberapa nilai selain bilangan bulat positif (misalnya 0). Tidak bisakah program kami menghasilkan perilaku yang tidak terdefinisi?
Tn. Xcoder
Juga, dapatkah Anda menambahkan test case seperti [5..5]? Bisakah kita menerima hal-hal seperti [8..4]?
Tn. Xcoder
@ Mr.Xcoder Tidak, mungkin tidak. Program harus dapat mengidentifikasi kasus-kasus yang tidak mungkin tidak hanya berulang selamanya atau crash pada mereka.
Posting Rock Garf Hunter
1
" 12Adalah kelipatan dari keduanya 3dan 4mencegah perangkat kami menjadi saling eksklusif ": mengapa? Saya tidak melihat hal lain dalam pernyataan masalah yang mengharuskan 12masuk ke kedua himpunan bagian.
Peter Taylor
1
Juga, ada apa dengan test case? [22,24,26,30]semua kelipatan 2. Apakah Anda yakin tidak akan lebih baik untuk menghapus ini dan memasukkannya ke kotak pasir?
Peter Taylor

Jawaban:

6

Python 2 , 167 byte

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*

Cobalah online!

-9 byte berkat Zacharý
-4 byte terima kasih kepada Tn. Xcoder
-2 byte dengan menggunakan daftar alih-alih set
-5 byte dengan menggunakan a in [...]daripada any([a == ...]).
-2 byte terima kasih kepada Tn. Xcoder
-8 byte dengan menggabungkan pernyataan
-5 byte terima kasih kepada Tn. Xcoder
-7 byte terima kasih kepada Tn. Xcoder / Zacharý
+7 byte untuk memperbaiki bug
-1 byte berkat ovs

catatan

Ini sangat lambat untuk angka maksimum yang lebih besar karena sama sekali tidak dioptimalkan; itu tidak dalam 2 menit pada perangkat Mr. Xcoder untuk [22, 24, 26, 30].

HyperNeutrino
sumber
5

Clingo , 51 byte

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

Demo

$ 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
Anders Kaseorg
sumber
Ini sepertinya tidak mendeteksi kasus tanpa solusi seperti x(3..12).(atau apakah saya perlu memperbarui?). BTW, bisakah Anda menyarankan pengenalan yang bagus untuk kloning?
Christian Sievers
1
@ChristianSievers Ups, itu bug, yang sekarang sudah saya perbaiki. Seharusnya output UNSATISFIABLEdalam kasus seperti itu. Saya kebanyakan menggunakan panduan Potassco .
Anders Kaseorg
4

Mathematica, 105 byte

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


Cobalah online
copy dan paste kode dengan ctrl + v,
rekatkan input di akhir kode,
tekan shift + enter untuk menjalankan

memasukkan

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

mengambil daftar sebagai input
keluaran 0 jika tidak ada

J42161217
sumber
Penggunaan yang bagus dariCheck
Keyu Gan
Mengapa Anda tidak membatalkan penghapusan jawaban pertama Anda setelah Anda memiliki versi yang berfungsi?
Neil
Karena ini adalah pendekatan yang sama sekali baru? Apakah ada masalah?
J42161217
4

Haskell, 136 byte

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

Cobalah online!

Bagaimana itu bekerja

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

Luangkan banyak waktu untuk {22,24,26,30}.

nimi
sumber
3

Jelly, 38 35 34 33 31 28 25 24 23 20 19 byte

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

-5 byte berkat Leaky Nun

Cobalah online!

Saya pikir test case ketiga berfungsi, tetapi sangat lambat. 0dikeluarkan ketika tidak ada solusi.

Penjelasan (mungkin penjelasan ini salah):

ṀḊŒ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ý
sumber
1
18 byte
Leaky Nun
Terima kasih! Dan terima kasih karena tidak mengirimkannya sendiri!
Zacharý
Saya punya solusi 18 byte yang berbeda lebih dekat ke aslinya, saya pribadi yang seperti ini lebih baik:ṀḊŒPðḍ@þ@⁹Sḟ1ðÐḟḢL
Zacharý
Woah ... ṀḊsebenarnya adalah trik yang sangat keren!
Zacharý
Ups, itu tidak berhasil, dan begitu pula penulisan ulang saya! Ini akan menghasilkan 0, bukan 1
Zacharý
2

Julia, 91 byte

x->(t=[];for i in x z=findfirst(x->x==0,i%(2:maximum(x)));zt?1:push!(t,z) end;length(t))
Tanj
sumber
Um ... apakah Anda lupa memasukkan tautan ke dalam nama bahasa, atau itu sebenarnya bernama "[Julia]"?
Zacharý
Anda benar, namanya Julia tanpa tanda kurung
Tanj
Anda mungkin ingin memperbaikinya pada jawaban Anda yang lain juga!
Zacharý
Wow, itu banyak jawaban! Dan jika Anda ingin memasukkan tautan, sintaksnya adalah[Text to display](link to website)
Zacharý