Tạo các kết hợp cộng với giá trị đích


14

Thử thách

Giả sử bạn có một danh sách các số và giá trị đích. Tìm tập hợp tất cả các kết hợp số của bạn cộng với giá trị đích, trả về chúng dưới dạng chỉ mục danh sách.

Đầu vào và đầu ra

Đầu vào sẽ lấy một danh sách các số (không nhất thiết phải là duy nhất) và số tổng của mục tiêu. Đầu ra sẽ là một tập hợp các danh sách không trống, mỗi danh sách chứa các giá trị nguyên tương ứng với vị trí của các giá trị trong danh sách đầu vào ban đầu.

Ví dụ

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: [ ]

Chấm điểm

Đây là , vì vậy đoạn mã ngắn nhất sẽ thắng!


6
Liên quan , có thể là một bản dupe.
Giuseppe

Tôi nghĩ rằng đây là một bản dupe nhưng tôi muốn đóng cái cũ hơn vì nó đã lỗi thời.
Đăng Rock Garf Hunter

4
Các số dấu phẩy động có thực sự thêm một cái gì đó vào thử thách không? Không chắc chắn sự đồng thuận là gì, nhưng chúng có thể sẽ dẫn đến lỗi chính xác trong nhiều ngôn ngữ.
Arnauld

Tôi đang có ý định cho phép các điểm nổi, vâng
soapergem

14
Bleh, chỉ số? Tôi nghĩ rằng đây sẽ là một thử thách đẹp hơn khi trả về một danh sách các giá trị, mặc dù tôi đoán rằng sẽ đặt ra một câu hỏi với cách các giá trị lặp lại được xử lý trong các tập hợp con.
xnor

Câu trả lời:


3

Husk , 10 byte

ηλfo=¹ṁ⁰tṖ

1 chỉ mục. Hãy thử trực tuyến!

Giải trình

ηλ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.

Điều này sử dụng bổ sung mới nhất cho Husk, η(hành động trên các chỉ số). Ý tưởng là ηcó một hàm bậc cao hơn α(ở đây là hàm lambda nội tuyến) và một danh sách x, và gọi αhàm lập chỉ mục của x(nằm trong chương trình trên) và các chỉ số của x. Ví dụ: ṁ⁰lấy một tập hợp con của các chỉ mục, ánh xạ lập chỉ mục để xvượt qua chúng và tính tổng các kết quả.


9

JavaScript (ES6), 96 byte

Đưa đầu vào theo cú pháp currying (list)(target).

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

Các trường hợp thử nghiệm

Điều này sẽ thất bại trong trường hợp thử nghiệm thứ 2 nếu 4,8 và 10 bị tráo đổi do lỗi chính xác của IEEE 754 - tức là 14.8 - 4.8 - 10 == 0nhưng 14.8 - 10 - 4.8 != 0. Tôi nghĩ rằng điều này là tốt , mặc dù có thể có một tài liệu tham khảo phù hợp hơn ở đâu đó trong meta.

Đã bình luận

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
Không phải một mà là hai reduces? Tôi đã phải nâng cao điều này.
Neil

1
@Neil "lessMapReduce" ít được biết đến
Lord Farquaad


7

R , 85 84 byte

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}

Hãy thử trực tuyến!

1 chỉ mục.

combnthường trả về một matrix, nhưng thiết lập simplify=Ftrả về một listthay vào đó, cho phép chúng ta ckết hợp tất cả các kết quả lại với nhau. combn(I,i,,F)trả về tất cả các kết hợp của các chỉ mục và chúng tôi lấy N(l,i,sum)==kmột chỉ mục vào danh sách đó để xác định các chỉ số bằng nhau k.


7

J , 32 31 byte

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

Hãy thử trực tuyến!

                  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

Tôi cảm thấy như một định nghĩa rõ ràng sẽ giúp đưa ra tất cả các tác phẩm, nhưng tiếc là tôi chỉ có cùng độ dài : 4 :'<@I.t#~x=1#.y#~t=.#:}.i.2^#y'. Hãy thử trực tuyến!
cole

5

Japt , 14 byte

m, à f_x!gU ¥V

Kiểm tra nó trực tuyến!

Làm thế nào nó hoạt động

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

Thủ thuật hay với m,. Tôi đã có Êo à k@VnXx@gXcùng số byte.
Xù xì





2

Python 3 , 144 byte

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*

Hãy thử trực tuyến!

Chỉ số 0. 44 byte chi cho việc trả về các chỉ số thay vì chỉ các phần tử.


2

Brachylog , 18 15 byte

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

Hãy thử trực tuyến!

-3 byte bởi vì bây giờ nó hoạt động như một trình tạo . (Có lẽ bạn có thể chơi gôn nhiều hơn, nhưng làm việc xung quanh nhu cầu sử dụng các chỉ số thì thật khó xử.)

    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?∧Xtđi ra cùng chiều dài.
Chuỗi không liên quan

1

Perl 6 , 45 byte

->\a,\b{grep {a[$_].sum==b},^a .combinations}

Kiểm tra nó

Mở rộng:

->
  \a, # input list
  \b, # input target
{

  grep

  {
      a[ $_ ].sum # use the list under test as indexes into 「a」
    ==
      b
  },

  ^a              # Range upto 「a」 (uses 「a」 as a number)
  .combinations   # get all of the combinations
}

1

APL (NARS), 49 ký tự, 98 byte

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

1 chỉ số; kiểm tra:

  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│
└~┘

bình luận:

{∨/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

Bình thường, 11 byte

fqvzs@LQTyU

Dùng thử trực tuyến tại đây hoặc xác minh tất cả các trường hợp thử nghiệm cùng một lúc tại đây .

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.