Hedef değere kadar kombinasyonlar oluşturun


14

Meydan okuma

Bir sayı listeniz ve bir hedef değeriniz olduğunu varsayalım. Liste değerine döndürerek, hedef değere kadar ekleyen tüm sayı kombinasyonlarınızı bulun.

Giriş ve çıkış

Giriş, bir sayı listesi (mutlaka benzersiz değil) ve bir hedef toplamı numarası alacaktır. Çıktı, her liste orijinal giriş listesindeki değerlerin konumuna karşılık gelen tamsayı değerleri içeren bir dizi boş olmayan liste olacaktır.

Örnekler

Input: values = [1, 2, 1, 5], target = 8
Output: [ [0,1,3], [1,2,3] ]

Input: values = [4.8, 9.5, 2.7, 11.12, 10], target = 14.8
Output: [ [0,4] ]

Input: values = [7, 8, 9, -10, 20, 27], target = 17
Output: [ [1,2], [0,3,4], [3,5] ]

Input: values = [1, 2, 3], target = 7
Output: [ ]

puanlama

Bu , bu yüzden en kısa kod kazanır!


6
İlgili , muhtemelen bir dupe.
Giuseppe

Bu bir dupe olduğunu düşünüyorum ama eski olduğu için oldukça eski bir kapatmak istiyorum.
Rock Garf Hunter Post

4
Kayan nokta sayıları gerçekten zor bir şey ekliyor mu? Fikir birliğinin ne olduğundan emin değilim, ancak muhtemelen birçok dilde hassas hatalara neden olacaklar.
Arnauld

Kayan noktalara izin vermek niyetindeydim, evet
soapergem

14
Bleh, endeksler? Sanırım bu, tekrarlanan değerlerin alt kümelerde nasıl ele alındığına dair bir soru ortaya çıkarsa da, değerlerin bir listesini döndüren daha güzel bir meydan okuma olacağını düşünüyorum.
xnor

Yanıtlar:


3

Kabuk , 10 bayt

ηλfo=¹ṁ⁰tṖ

1 endeksli. Çevrimiçi deneyin!

açıklama

ηλfo=¹ṁ⁰tṖ  Inputs are a number n (explicit, accessed with ¹) and a list x (implicit).
η           Act on the incides of x
 λ          using this function:
         Ṗ   Take all subsets,
        t    remove the first one (the empty subset),
  f          and keep those that satisfy this:
      ṁ⁰      The sum of the corresponding elements of x
   o=¹        equals n.

Bu, Husk'a en son eklemeyi kullanır η(endekslere göre hareket edin). Fikir, ηdaha yüksek bir sıra fonksiyonu α(burada satır içi lambda fonksiyonu) ve bir liste alır xve ( yukarıdaki programda bulunan) αindeksleme fonksiyonunu ve indekslerini çağırmasıdır . Örneğin, bir indeks alt kümesi alır, indekslemeyi üstlerine eşler ve sonuçları toplar.xxṁ⁰x


9

JavaScript (ES6), 96 bayt

Körili sözdiziminde girdi alır (list)(target).

a=>s=>a.reduce((b,_,x)=>[...b,...b.map(y=>[...y,x])],[[]]).filter(b=>!b.reduce((p,i)=>p-a[i],s))

Test senaryoları

IEEE 754 hassas hatası nedeniyle 4.8 ve 10 değiştirilirse 2. test durumunda başarısız olur - yani 14.8 - 4.8 - 10 == 0ama 14.8 - 10 - 4.8 != 0. Metada bir yerde daha alakalı bir referans olsa da, bunun iyi olduğunu düşünüyorum .

Yorumlananlar

a => s =>                 // given an array a[] of length N and an integer s
  a.reduce((b, _, x) =>   // step #1: build the powerset of [0, 1, ..., N-1]
    [ ...b,               //   by repeatedly adding to the previous list b[]
      ...b                //   new arrays made of:
      .map(y =>           //     all previous entries stored in y[]
        [...y, x]         //     followed by the new index x
      )                   //   leading to:
    ],                    //   [[]] -> [[],[0]] -> [[],[0],[1],[0,1]] -> ...
    [[]]                  //   we start with a list containing an empty array
  )                       // end of reduce()
  .filter(b =>            // step #2: filter the powerset
    !b.reduce((p, i) =>   //   keeping only entries b
      p - a[i],           //     for which sum(a[i] for i in b)
      s                   //     is equal to s
    )                     //   end of reduce()
  )                       // end of filter()

7
Bir değil iki reduces? Bunu onaylamalıyım.
Neil

1
@Neil Daha az bilinen "reduceMapReduce"
Lord Farquaad


7

R , 85 84 bayt

function(l,k){N=combn
o={}
for(i in I<-1:sum(l|1))o=c(o,N(I,i,,F)[N(l,i,sum)==k])
o}

Çevrimiçi deneyin!

1 endeksli.

combnGenellikle döndürür matrix, ancak ayar simplify=Fbir döner listbize sağlayan, bunun yerine chep birlikte sonuçları oncatenate. combn(I,i,,F)tüm endeks kombinasyonlarını döndürür ve N(l,i,sum)==keşit olanları belirlemek için bu listeye bir indeks olarak alırız k.


7

J , 32 31 bayt

(=1#.t#])<@I.@#t=.1-[:i.&.#.1"0

Çevrimiçi deneyin!

                  1-[:i.&.#.1"0         Make a list of all masks
                                        for the input list. We flip the bits
                                        to turn the unnecessary (0...0)         
                                        into (1...1) that would be missing.
                                        Define it as t.

(=1#.t#])                               Apply the masks, sum and
                                        compare with the target

         <@I.@#                         Turn the matching masks into 
                                        lists of indices

Ben bestelerin tümü verilen yardım edecek bir açık tanımı gibi hissediyorum, ama ne yazık ki sadece aynı uzunluğa var: 4 :'<@I.t#~x=1#.y#~t=.#:}.i.2^#y'. Çevrimiçi deneyin!
cole

5

Japt , 14 bayt

m, à f_x!gU ¥V

Çevrimiçi test edin!

Nasıl çalışır

m, à f_x!gU ¥V   Implicit: U = input array, V = target sum
m,               Turn U into a range [0, 1, ..., U.length - 1].
   à             Generate all combinations of this range.
     f_          Filter to only the combinations where
       x           the sum of
        !gU        the items at these indices in U
            ¥V     equals the target sum.
                 Implicit: output result of last expression

Güzel numara m,. Ben Êo à k@VnXx@gXaynı bayt sayım için.
Shaggy





2

Python 3 , 144 bayt

lambda a,t:[[e for e,_ in x]for r in range(len(a))for x in combinations(list(enumerate(a)),r+1)if sum(y for _,y in x)==t]
from itertools import*

Çevrimiçi deneyin!

0 endeksli. 44 bayt, sadece elemanların kendileri yerine endeksleri döndürmek için harcadı.


2

Brachylog , 18 15 bayt

hiᶠ⊇Shᵐ+~t?∧Stᵐ

Çevrimiçi deneyin!

-3 bayt çünkü artık jeneratör olarak çalışıyor . (Muhtemelen daha fazla golf oynamak mümkündür, ancak endeks kullanma ihtiyacı etrafında çalışmak gariptir.)

    S              The variable S
   ⊇               is a sublist of
  ᶠ                the list of all
 i                 pairs [element, index] from
h                  the first element of
                   the input;
     hᵐ            the first elements of each pair
       +           add up to
        ~t         the last element of
          ?        the input
           ∧       which isn't necessarily
            S      S,
             tᵐ    from which the last elements of each pair
                   are output.

hiᶠ⊇z+ʰXh~t?∧Xtaynı uzunlukta çıkıyor.
İlişkisiz String


1

APL (NARS), 49 karakter, 98 bayt

{∨/b←⍺=+/¨{∊⍵⊂w}¨n←{⍵⊤⍨k⍴2}¨⍳¯1+2*k←≢w←⍵:⍸¨b/n⋄⍬}

1 endeksli; Ölçek:

  f←{∨/b←⍺=+/¨{∊⍵⊂w}¨n←{⍵⊤⍨k⍴2}¨⍳¯1+2*k←≢w←⍵:⍸¨b/n⋄⍬}
  ⎕fmt 8 f 1 2 1 5
┌2──────────────┐
│┌3────┐ ┌3────┐│
││2 3 4│ │1 2 4││
│└~────┘ └~────┘2
└∊──────────────┘
  ⎕fmt   14.8  f  4.8 9.5 2.7 11.12 10
┌1────┐
│┌2──┐│
││1 5││
│└~──┘2
└∊────┘
  ⎕fmt 17 f 7, 8, 9, ¯10, 20, 27
┌3──────────────────┐
│┌2──┐ ┌2──┐ ┌3────┐│
││4 6│ │2 3│ │1 4 5││
│└~──┘ └~──┘ └~────┘2
└∊──────────────────┘
  ⎕fmt 7 f 1 2 3
┌0┐
│0│
└~┘

yorum Yap:

{∨/b←⍺=+/¨{∊⍵⊂w}¨n←{⍵⊤⍨k⍴2}¨⍳¯1+2*k←≢w←⍵:⍸¨b/n⋄⍬}
                             ⍳¯1+2*k←≢w←⍵         copy ⍵ in w, len(⍵) in k, return 1..2^(k-1) 
                 n←{⍵⊤⍨k⍴2}¨                     traslate in binary each element of  1..2^(k-1) and assign the result to n
          {∊⍵⊂w}¨                                for each binary element of n return the elemets of ⍵ in the place where there are the 1s
    b←⍺=+/¨                                       sum them and see if the sum is ⍺, that binary array saved in b
  ∨/                                     :⍸¨b/n   if or/b, get all the elements of n that are 1s for array b, and calculate each all indexs
                                               ⋄⍬ else return Zilde as void set

0

Pyth, 11 bayt

fqvzs@LQTyU

Buradan çevrimiçi olarak deneyin veya tüm test senaryolarını burada bir kerede doğrulayın .

fqvzs@LQTyUQ   Implicit: Q=input 1 (list of numbers), z=input 2 (target value, as string)
               Trailing Q inferred
          UQ   Generate range [0-<length of Q>)
         y     Powerset of the above
f              Keep elements of the above, as T, when the following is truthy:
      L T        Map elements of T...
     @ Q         ... to the indicies in Q
    s            Take the sum
 q               Is the above equal to...
  vz             z as an integer
               Implicit print of the remaining results
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.