Số lượng tối thiểu để tổng hợp thành chính xác n


15

Câu hỏi đầu tiên ở đây, đừng mắng tôi nếu đây là một thử thách trùng lặp hoặc xấu.

Giới thiệu

Tôi đã nghĩ về thử thách này bản thân mình, và nó dường như là một câu đố cơ bản tốt cho những người mới chơi mã. Nó cũng có thể giúp tôi quyết định nên học ngôn ngữ chơi gôn nào.

Thử thách

Cho một mảng các số nguyên nhỏ hơn hoặc bằng n, xuất hoặc trả về số lượng số tối thiểu từ mảng tổng hợp chính xác n.

Bạn có thể chọn để viết một chức năng hoặc một chương trình đầy đủ.

Đầu vào

Bạn có thể giả định một cách an toàn 0 <= n < 2^31.

Lấy một mảng hoặc danh sách của bất kỳ loại nào ( vectorđối với C ++ hoặc Java LinkedListđược cho phép), cùng với nvà một tham số tùy chọn length, chỉ định độ dài của mảng.

Bạn cũng có thể lấy đầu vào là một chuỗi được phân tách nbằng dấu cách, được phân tách bằng dấu phẩy hoặc dấu cách:

1 5 7 3 7 3 6 3 2 6 3,10

1 5 7 3 7 3 6 3 2 6 3 10

nếu nó dễ dàng hơn

Đầu ra

Đầu ra hoặc trả về số lượng số tối thiểu từ mảng tổng hợp chính xác n. Sử dụng ví dụ trên:

1 5 7 3 7 3 6 3 2 6 3,10

Chương trình của bạn nên in:

2

bởi vì số lượng tối thiểu của các số tổng 102( 73).

Trong trường hợp không có giải pháp, hãy in hoặc trả về âm bản, 0"Không có giải pháp" (mặc dù điều đó sẽ không thông minh), (như được đề xuất) hoặc bất kỳ giá trị giả nào khác, ngoại trừ một chuỗi trống.

Ví dụ đầu vào và đầu ra

Đầu vào:

1 5 7 3 7 3 6 3 2 6 3,10
143 1623 1646 16336 1624 983 122,18102
5 6 9,12

Đầu ra:

2
3
-1

Chấm điểm

Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte thắng.

Câu trả lời hàng đầu sẽ được chấp nhận vào Giáng sinh.


Tôi đã chỉnh sửa thông số kỹ thuật của bạn, bởi vì chúng tôi thường cho phép các phương thức I / O tương tự cho các chức năng và chương trình; xem sự đồng thuận ở đây . Hãy quay lại nếu bạn không đồng ý.
lirtosiast

Chúng tôi có thể đầu ra falsecho các trường hợp không có giải pháp?
Sản xuất ETH

@ETHproductions Chắc chắn, sẽ thêm điều đó.
TheCoffeeCup

Bạn có xem xét falsey đầu ra trống, vì chuỗi rỗng là falsey trong Pyth?
lirtosiast

@ThomasKwa Tôi không thích đầu ra chuỗi trống, nhưng bạn có thể đưa nó vào như "nếu x được cho phép ..." trong câu trả lời của bạn ...
TheCoffeeCup

Câu trả lời:


7

Bình thường, 12 11 byte

lhafqsTQyEY

Điều này được ncoi là dòng đầu tiên và danh sách trên dòng thứ hai.

lhafqsTQyEY     (Implicit: Q = 1st line of input; E = 2nd line)
         E      The list
        yE      Powerset (sorted by increasing length; empty set first)
   f            Filter by lambda T:
     sT         sum(T)
    q                  ==
       Q                  Q
   fqSTQyE      Sublists that sum to Q, sorted by increasing length
  a       Y     append an empty array (in case none match)
lh              take the length of the first element (0 for empty array)

Thử nó ở đây .


1
Mã của bạn và lời giải thích của bạn không phù hợp.
isaacg

@isaacg Bây giờ đã sửa.
lirtosiast

5

Japt , 30 21 18 byte

Hóa ra có một phương pháp hiệu quả hơn nhiều. ;)

Uà f_x ¥V} ml n- g

Kiểm tra nó trực tuyến! (Lưu ý: n-đã được thay đổi thành n@X-Y}vì lý do tương thích)

Điều này nhận đầu vào là một mảng được phân tách bằng dấu cách hoặc dấu phẩy, theo sau là một số. Đầu ra undefinedcho các trường hợp thử nghiệm mà không có giải pháp.

Uà f_  x ¥ V} ®   l} n- g
UàfmZ{Zx ==V} mZ{Zl} n- g

            // Implicit: U = input array, V = input integer
Uà fZ{   }  // Generate all possible combinations of U, then filter to only items Z where
Zx ==V      //   the sum of Z is equal to V.
mZ{Zl}      // Map each remaining combination to its length.
n-          // Sort by subtraction; smaller items end up in the front.
g           // Take the first item.
            // Implicit: output last expression

Tôi không thể tin rằng tôi đã không nghĩ về phiên bản này khi tôi viết ban đầu ...

Một số tối ưu hóa đã được thực hiện kể từ đó có ích ở đây:

  • Một U ở đầu chương trình thường có thể bị bỏ lại.
  • Ã là một lối tắt cho .
  • n bây giờ sắp xếp số đúng theo mặc định.

Mỗi cái này lấy ra một byte, tổng cộng là 15:

à f_x ¥VÃml n g

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


Đó là 25 byte, không phải 21.
Albert Renshaw

1
@AlbertRenshaw Japt hỗ trợ mã hóa IEC_8859-1 , trong đó mỗi ký tự này là 1 byte. Bạn có thể lưu chương trình này dưới dạng tệp văn bản được mã hóa theo tiêu chuẩn IEC_8859-1, sau đó tải nó lên trình thông dịch trực tuyến .
Sản xuất ETH

À, tốt quá! Cảm ơn đã thông báo cho tôi
Albert Renshaw

1

Toán học, 73 65 byte

Min[Length/@Select[IntegerPartitions[#2,#2,#],Sort@#==Union@#&]]&

Hàm thuần túy, trả về nếu không có giải pháp.


1

Python 3, 128 byte

Đây không phải là chơi golf như tôi muốn, nhưng tôi sẽ làm việc sau.

from itertools import*
def s(a,n):
 for i in range(len(a)):
  for j in permutations(a,i+1):
   if sum(j)==n:return i+1
 return 0


1

CJam, 34 byte

0q~_,2,m*\f.*{:+1$=},\;0f-{,}$0=,+

Hãy thử trực tuyến . Định dạng đầu vào là tổng theo sau là danh sách các giá trị, ví dụ:

18102 [143 1623 1646 16336 1624 983 122]

Lưu ý rằng điều này sẽ đưa ra một ngoại lệ nếu không tìm thấy giải pháp. Ngoại lệ chuyển sang stderr khi CJam được chạy từ dòng lệnh và kết quả đúng (0 ) vẫn được in thành thiết bị xuất chuẩn. Vì vậy, điều này đáp ứng sự đồng thuận được thiết lập tại nên cho phép gửi đi với một lỗi?

Mã có thể trông dài hơn bạn mong đợi. Lý do chính là vì CJam không có tích hợp để tạo kết hợp. Hoặc ít nhất đó là lý do của tôi, và tôi đang gắn bó với nó.

Giải trình:

0       Push 0 result for exception case.
q~      Get and interpret input.
_,      Copy and get length of input value list.
2,      Push [0 1].
m*      Cartesian power. This generates all possible lists of 0/1 values with the
        same length as the input value list.
\       Swap input value list to top.
f.*     Apply element-wise product of input value list with all 0/1 lists.
        We now have all combinations of values, with 0 in place of unused values.
{       Start filter block.
  :+      Sum values.
  1$      Copy target sum to top.
  =       Compare.
},      Filter.
\;      Swap target sum to top and discard.
0f-     Remove 0 values. We now have all solution lists.
{,}$    Sort by length.
0=      Get first solution, which after sorting is the shortest.
        This will raise an exception if the list of solutions is empty, bailing
        out with the initial 0 on the stack.
,       Get length of solution.
+       Add the 0 we initially pushed for the exception case.

1

JavaScript (ES6), 84 byte

f=(a,n,m=1e999,x)=>n&&a.map((v,i)=>(x=[...a],x.splice(i,1),x=f(x,n-v)+1)<m?m=x:0)&&m

Giải trình

Có một Arraycủa Numbers và một Numbernhư là đối số. Trả về một số Infinitynếu không có kết quả. Đây là một hàm đệ quy trừ nvà loại bỏ từng phần tử khỏi mảng một cho đến khi n == 0.

f=(a,n,m=1e999,x)=> // m and x are not passed, they are here to declare them in the local
                    //     scope instead of globally, initialise m to Infinity
  n&&               // if n == 0, return 0
  a.map((v,i)=>     // iterate over each number in a
    (x=[...a],      // x = copy of a
    x.splice(i,1),  // remove the added number from the array
    x=f(x,n-v)+1)   // x = result for the numbers in this array
      <m?m=x:0      // set m to minimum result
  )
  &&m               // return m

Kiểm tra

Xét nghiệm này bộ mđể Infinitysau này thay vì như một đối số mặc định để làm cho nó hoạt động trong Chrome (thay vì chỉ Firefox).


1

Haskell, 72 byte

import Data.List
n#l=head$sort[length x|x<-subsequences l,sum x==n]++[0]

Trả về 0nếu không có giải pháp.

Ví dụ sử dụng: 10 # [1,5,7,3,7,3,6,3,2,6,3]-> 2.

Tìm tất cả các danh sách phụ của danh sách đầu vào lcó tổng n. Lấy độ dài của mỗi danh sách phụ và sắp xếp như vậy. Nối một0 và lấy phần tử đầu tiên.

Nếu danh sách singleton được phép xuất ra, ví dụ: [2]chúng ta có thể lưu 7 byte : n#l=minimum[length x|x<-subsequences l,sum x==n]. Trong trường hợp không có giải pháp, danh sách trống []được trả về.

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.