Bir kümeyi katlarla örtme


14

1'den büyük bir tamsayı kümesi alıp X diyelim . Biz tanımlayacak S (i) ' tüm üyelerinin grubu olduğu X- bölünebilir i i> 1 . Bu alt kümelerden bir grup kümesi seçmek ister misiniz?

  • Sendikaları küme X

  • Setlerin ikisinde X'in hiçbir elemanı yoktur .

Örneğin şu şekilde yeniden gruplandırabiliriz {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}

Bazı kümeler bu şekilde ifade edilemez. Örneğin, alırsak {3..12}, 123 ve 4'ün katları, setlerimizin karşılıklı olarak birbirini dışlamasını önler.

Bazı kümeler birden çok şekilde ifade edilebilir, örneğin {4..8}şu şekilde temsil edilebilir:

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

ama aynı zamanda şu şekilde de temsil edilebilir:

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

Görev

Amacımız girdi olarak bir set alacak ve bu şekilde onu kapsayan en az sayıda altkümeyi çıktılayacak bir program yazmaktır. Hiçbiri yoksa, pozitif bir tam sayı dışında bir değer çıkarmanız gerekir (örneğin 0).

Bu bir sorusudur, bu nedenle cevaplar bayt cinsinden puanlandırılacak, daha az bayt daha iyi olacaktır.

Testler

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

Hiçbiri yoksa, pozitif bir tam sayı dışında bir değer çıkarmalısınız (örneğin 0). Programımız bunun yerine tanımlanmamış davranışla sonuçlanamaz mı?
Bay Xcoder

Ayrıca, gibi bir test durumu ekleyebilir misiniz [5..5]? Gibi şeyler alabilir miyiz [8..4]?
Bay Xcoder

@ Mr.Xcoder Hayır olmayabilir. Programlar sadece sonsuza kadar döngü ya da çökme değil imkansız vakaları tespit edebilmelidir.
Rock Garf Hunter Post

1
" 12Her ikisinin katları 3ve 4setlerimizin birbirini dışlamasını engellemek ": neden? Her 12iki alt kümeye gitmek gerektiren sorun ifadesinde başka bir şey görmüyorum .
Peter Taylor

1
Ayrıca, test senaryolarında ne var? [22,24,26,30]hepsi katlarıdır 2. Bunu silmek ve korumalı alana yerleştirmenin daha iyi olmayacağından emin misiniz?
Peter Taylor

Yanıtlar:


6

Python 2 , 167 bayt

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*

Çevrimiçi deneyin!

Zacharý sayesinde -9 bayt
-Bay Xcoder
-2 bayt-set yerine liste kullanarak -4 bayt
-5 bayt kullanmak a in [...]yerine -4 bayt any([a == ...]).
Bay Xcoder sayesinde -2 bayt-
ifadeleri birleştirerek -8 bayt Bay Xcoder
sayesinde -5 bayt-Bay
Xcoder / Zacharý sayesinde
+7 bayt ovs
sayesinde hata -1 baytını düzeltmek için

Not

Hiçbir şekilde optimize edilmediğinden bu, daha büyük maksimum sayılar için son derece yavaştır; Bay Xcoder'ın cihazında 2 dakika içinde olmadı [22, 24, 26, 30].


5

Clingo , 51 bayt

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

gösteri

$ 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

Bu, çözümü olmayan vakaları tespit etmiyor gibi görünüyor x(3..12).(veya güncellemem gerekiyor mu?) BTW, clingo'ya iyi bir giriş önerebilir misiniz?
Christian Sievers

1
@ChristianSievers Hata! Bu bir hataydı, şimdi düzelttiğim bir hata. UNSATISFIABLEBöyle bir durumda çıktı vermelidir . Çoğunlukla Potassco rehberini kullandım .
Anders Kaseorg

4

Mathematica, 105 bayt

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


Çevrimiçi
kopyalamayı deneyin ve kodu ctrl + v ile
yapıştırın, girişi kodun sonuna yapıştırın,
shift + çalıştırmak için enter tuşuna basın

giriş

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

bir liste
yoksa giriş çıkışları 0 olarak alır


Güzel kullanımCheck
Keyu Gan

Çalışan bir sürümünüz olduğunda neden ilk cevabınızı geri almadınız?
Neil

Çünkü bu tamamen yeni bir yaklaşımdı? Bir problem mi var?
J42161217

4

Haskell, 136 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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

Çok zaman ayırın {22,24,26,30}.


3

Jöle, 38 35 34 33 31 28 25 24 23 20 19 bayt

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

Leaky Nun sayesinde -5 bayt

Çevrimiçi deneyin!

Ben düşünüyorum Üçüncü test durumu eserler, ama çok yavaş. 0çözüm olmadığında verilir.

Açıklama (bu açıklamayı yanlış yapmış olabilir):

ṀḊŒ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


Teşekkürler! Ve bunu kendiniz göndermediğiniz için teşekkür ederiz!
Zacharý

Orijinalime yakın 18 baytlık farklı bir çözümüm var, bunu daha ṀḊŒPðḍ@þ@⁹Sḟ1ðÐḟḢL
kişiselim

Vay ... ṀḊaslında harika bir numara!
Zacharý

Hata! Bu işe yaramıyor ve yeniden yazmıyorum! Bu çıkış 0 değil, 1 olmalıdır
Zacharý

2

Julia, 91 bayt

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

Um ... dilin içine bir bağlantı eklemeyi unuttunuz mu yoksa aslında "[Julia]" mı?
Zacharý

Haklısın, adı
braketsiz

Bunu diğer yanıtlarınızda da düzeltmek isteyebilirsiniz!
Zacharý

Vay canına, bu birçok cevaptı! Ve bir bağlantı eklemek istiyorsanız, sözdizimi[Text to display](link to website)
Zacharý
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.