倍数でセットをカバーする


14

1より大きい整数のセットを取り、それをXと呼びましょう。S(i)を、iで割り切れるXのすべてのメンバーのセットとして定義しますi> 1)。これらのサブセットから、次のようなセットのグループを選択したい

  • 彼らの和集合はXです

  • Xの要素は2つのセットにありません。

例えば、我々は再編成することができます{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}123と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いいえ、できません。プログラムは、永久にループしたりクラッシュしたりするだけでなく、不可能なケースを識別できる必要があります。
ポストロックガーフハンター

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 == ...])
Mr. Xcoderのおかげで-2バイト
ステートメントをマージして-8バイトMr. Xcoderで
-5バイトのおかげMr. Xcoderで
-7バイトのおかげ/Zacharý
+7バイトのバグ修正
ovsのおかげで-1バイト

注意

最大数が大きくなると、最適化されないため、これは非常に遅くなります。それがために氏Xcoderのデバイス上で2分以内にしませんでした[22, 24, 26, 30]


5

Clingo、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).(または更新する必要がありますか?)ところで、clingoの良い紹介を提案できますか?
クリスチャンシーバーズ

1
@ChristianSieversおっと、これはバグでしたが、現在修正しています。このUNSATISFIABLEような場合に出力されるはずです。ほとんどポタスコガイドを使用しました
アンダースカセオルグ

4

Mathematica、105バイト

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


オンラインで試して
、ctrl + vでコードをコピーして貼り付け、コード
の最後に入力を貼り付け、
shift + enterを押して実行します

入力

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

リスト
がない場合、入力を0 として出力します


良い使用Check
Keyu Gan

作業バージョンを取得した後、最初の回答を元に戻さないのはなぜですか?
ニール

これはまったく新しいアプローチだったからですか?問題はありますか?
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€Ḣ

Leaky Nunのおかげで-5バイト

オンラインでお試しください!

私が考える第3のテストケースの作品を、それは非常に遅いです。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


ありがとう!そして、あなた自身でそれを提出しないでくれてありがとう!
ザカリー

オリジナルに近い別の18バイトのソリューションがありますが、私はこの方が好きṀḊŒPðḍ@þ@⁹Sḟ1ðÐḟḢL
です。–ザカリー

うわー... ṀḊ実際には本当にクールなトリックです!
ザカリー

おっと、それは機能せず、私の書き直しもしません!この出力すべき0、ない1
ザカリー

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

ええと...言語名にリンクを含めるのを忘れましたか、それとも実際には「[Julia]」という名前ですか?
ザカリー

あなたは正しい、名前は括弧なしのジュリア
タンジ

あなたは他の答えでもそれを修正したいかもしれません!
ザカリー

うわー、それは多くの答えでした!あなたがリンクを挿入する場合や、構文は次のとおりです[Text to display](link to website)
ザカリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.