Partisi Terbesar Jumlah Terbesar Secara Khusus

8

terkait dan terinspirasi oleh - Menemukan partisi bebas jumlah

Satu set Adidefinisikan di sini sebagai bebas-jumlah yang jelas jika

  • 1) terdiri dari setidaknya tiga elemen |A| ≥ 3,, dan
  • 2) sum-sum yang berbeda A + A = { x + y | x, y in A}(dengan x,ybeda, yaitu, x≠y) tidak memiliki elemen yang sama A.

(Usang -... Tidak menggunakan ini akan maju Kiri di sini hanya karena beberapa jawaban mungkin telah menggunakannya Itu tidak cocok dengan kondisi di atas Atau, persamaan x + y = ztidak memiliki solusi untuk x,y,z ∈ A(lagi dengan x,y,zyang berbeda, yaitu, x≠y, x≠z, y≠z.) )

Sebagai contoh sederhana, {1,3,5}jelas bebas-jumlah, tetapi {1,3,4}tidak. {1,3}dan {3}juga tidak, karena mereka bukan setidaknya tiga elemen.

Tantangannya di sini adalah menemukan subset bebas jumlah terbesar dari input yang diberikan.

Memasukkan

  • Seperangkat Abilangan bulat yang tidak berurutan dalam format apa pun yang nyaman .
  • Bilangan bulat bisa positif, negatif, atau nol, tetapi dapat dianggap sesuai dengan [int]tipe data asli bahasa Anda (atau setara).
  • Set dijamin hanya memiliki elemen yang berbeda (tidak ada multiset di sini).
  • Set belum tentu diurutkan.

Keluaran

  • Subset terbesar dari A(yang bisa menjadi Adirinya sendiri), yang jelas bebas-jumlah. Output dapat dalam format apa pun yang sesuai.
  • Jika tidak ada subset seperti itu, output satu set kosong atau nilai falsey lainnya .
  • Jika beberapa himpunan bagian terikat untuk terbesar, hasilkan salah satu atau semua dari mereka.
  • Subset tidak perlu diurutkan, atau dalam urutan yang sama dengan input. Misalnya, untuk input {1,3,5}output {5,1,3}dapat diterima.

Aturan tambahan

  • Celah standar dilarang.
  • Ini adalah , jadi semua aturan golf biasa berlaku, dan kode terpendek menang.

Contohnya

Input     -> Output (any or all)
{0}       -> {}
{1, 2, 3} -> {}
{1, 3, 5} -> {1, 3, 5}
{1, 2, 3, 4, 5} -> {1, 2, 5}  {1, 2, 4}  {1, 3, 5}  {2, 3, 4}  {2, 4, 5}  {3, 4, 5}
{-5, 4, 3, -2, 0} -> {-5, 4, 3}  {-5, 4, -2}  {4, 3, -2}
{-5, 4, 3, -2} -> {-5, 4, 3}  {-5, 4, -2}  {4, 3, -2}
{-17, 22, -5, 13, 200, -1, 1, 9} -> {-17, 22, -5, 13, 200, -1, 1}  {-17, 22, -5, 200, -1, 1, 9}  {-17, -5, 13, 200, -1, 1, 9}
AdmBorkBork
sumber

Jawaban:

4

MATL , 47 43 byte

nW:qB!ts2#Sw2>)PZ)"1G@)XJ2XN!"@sJ@X-m~*]?J.

Cobalah online!

Penjelasan

Ini menggunakan dua loop: loop luar untuk menghasilkan semua himpunan bagian yang mungkin, dan loop dalam untuk mengambil semua pasangan elemen dan melihat apakah jumlah sama dengan elemen lain dari subset.

Himpunan bagian dari setidaknya 3 elemen diuji dalam urutan penurunan jumlah elemen. Kode berhenti segera setelah bagian yang valid ditemukan.

          % Take input implicitly
nW:q      % Generate [0 1 ... 2^n-1] where n is input length
B!        % Convert to binary. Gives a matrix. Each number corresponds to a column.
          % This will be used to select the elements of each subset
ts        % Duplicate. Sum of each column
2#S       % Sort. Output the sorted array and the indices of the sorting. Each index
          % corresponds to one possible subset
w2>       % Swap. Logical index of values that exceed 2. This is used to pick only
          % subsets of more than 2 elements
)         % Keeps only indices of subsets that have at least 3 elements
P         % Flip. This moves subsets with more elements to the front. As soon as a
          % subset fulfills the condition the outer loop will be exited, so we need
          % to start with the bigger subsets
Z)        % Index into columns of binary matrix. Each column is the binary pattern
          % defining a subset with at least 3 elements, starting with bigger subsets
"         % For each column. Each iteration corresponds to a subset
  1       %   Push 1
  G@)     %   Pick actual elements of each subset (logical index into input)
  XJ      %   Copy to clipboard J
  2XN!    %   All pairs of 2 elements from that subset. Each pair is a column
  "       %   For each column. Each iteration corresponds to a pair of elements
    @s    %     Sum of those two elements
    J@X-  %     Array with the other elements (obtained with set difference)
    m~    %     True if the sum of the two elemens is not a member of the array
    *     %     Multiply. Corresponds to logical AND
  ]       %   End for
  ?       %   If result is true: no sum of two elements equalled any element
    J     %     Push found subset (will be displayed implicitly)
    .     %     Exit loop
          %   End if implicitly
          % End for implicitly
          % Display stack implicitly
Luis Mendo
sumber
3

Python, 137 byte

Pendekatan naif. Putaran semua himpunan bagian dari input yang mengandung setidaknya 3 nilai, memeriksa properti untuk masing-masing. Mengembalikan []ketika tidak ada hasil ditemukan atau [S]jika setidaknya satu hasil ditemukan (di mana Sada beberapa tuple).

from itertools import*
lambda a:[c for n in range(3,len(a)+1)for c in combinations(a,n)if all(x+y-z for(x,y,z)in permutations(c,3))][-1:]
Lynn
sumber
2

Javascript 246 263

a=>([...Array(1<<(l=a.length))].map((x,i)=>i.toString(2)).filter(n=>/1.*1.*1/.test(n)).map(s=>('0'.repeat(l)+s).slice(-l).replace(/./g,(b,p)=>+b&&o.push(a[p]),o=[])&&o).filter(u=>u.every((x,i)=>!u.some((y,j)=>j-i&&u.some((z,k)=>k-j&&!(z-x-y))))))

Begitu lama :( ... Tapi itu pengkodean yang bagus .. (saya pikir)

Kurang golf:

f=a=>(
    [...Array(1<<(l=a.length))]
        .map((x,i)=>i.toString(2))
        .filter(n=>/1.*1.*1/.test(n))
        .map(s=>
            ('0'.repeat(l)+s).slice(-l).replace(/./g,
                (b,p)=>+b&&o.push(a[p])
            ,o=[])&&o
        )
        .filter(u=>
            u.every((x,i)=>
                !u.some((y,j)=>
                    j-i&&u.some((z,k)=>k-j&&!(z-x-y))
                )
            )
        )
)

document.body.innerHTML = JSON.stringify( f([1,2,3,4,5]), null, 1 );

Washington Guedes
sumber
2

Mathematica - 89 84 83 77 76 byte

6 byte disimpan berkat @ Sp3000

Mungkin bisa bermain golf lebih banyak, apakah ada cara yang lebih pendek untuk menyaring?

Select[Subsets@#,Length@#>2&&Intersection[#,Tr/@#~Subsets~{2}]=={}&]~Last~0&

Fungsi anonim, kembali 0tanpa jawaban.

Maltysen
sumber
2

Ruby, 107 byte

Input adalah sebuah array. Mengumpulkan satu subset kualifikasi untuk setiap ukuran subset mulai 3dari panjang input, lalu mengembalikan yang terbesar dari yang ditemukan. Kembali niljika tidak ada hasil yang ditemukan.

Karena spek yang saling bertentangan, ada dua solusi yang saat ini memiliki bytecount yang sama.

Menggunakan definisi pertama: ( { x + y | x, y ∈ A } ∩ A = ∅)

->s{((3..s.size).map{|i|s.combination(i).find{|e|e.combination(2).map{|a,b|a+b}&e==[]}}-[p])[-1]}

Menggunakan definisi kedua ( ∀ x, y, z ∈ A: x + y ≠ z)

->s{((3..s.size).map{|i|s.combination(i).find{|e|e.permutation(3).all?{|a,b,c|a+b!=c}}}-[p])[-1]}
Nilai Tinta
sumber
0

Pyth, 27 byte

ef!f!*Fm-Fd.pYfqlY3yTfglT3y

Suite uji.

Biarawati Bocor
sumber
Bagaimana cara kerjanya? Saya sepertinya mendapatkan output yang tidak terduga ketika menjalankannya di TIO.
AdmBorkBork
Maaf, perbaiki sekarang.
Leaky Nun
1
Tidak berfungsi untuk input 1,3,5,100, karena juga mencetak subset 1,3,5yang tidak maksimal.
Jakube
1
@Jakube Jatuhkan inisial edan kemudian posting sebagai solusi terpisah: D
Leaky Nun
1
Kita harus mencetak subset terbesar, atau semua subset terbesar. Jadi eitu wajib.
Jakube