Thay đổi vấn đề về tiền xu khi sử dụng N xu và mỗi mệnh giá


13

Các vấn đề thay đổi xu là rất tốt tài liệu. Cung cấp vô số tiền có mệnh giá x_1cho x_mbạn cần tìm số lượng kết hợp cộng lại y. Ví dụ: đã cho x = {1,2,3}y = 4chúng tôi có bốn kết hợp:

  1. {1,1,1,1}
  2. {1,1,2}
  3. {1,3}
  4. {2,2}

Giới thiệu

Có một số biến thể của vấn đề thay đổi tiền xu. Trong biến thể này, chúng tôi có hai hạn chế bổ sung:

  1. Mỗi mệnh giá phải được sử dụng ít nhất một lần.
  2. Chính xác một số lượng tiền cố định phải được sử dụng trong tổng số.

Ví dụ, đưa ra x = {1,2,3}, y = 36n = 15nơi nlà tổng số tiền phải được sử dụng, chúng tôi nhận được bốn kết hợp:

  1. {1,2,2,2,2,2,2,2,3,3,3,3,3,3,3} (1 cái, 7 twos, 7 threes)
  2. {1,1,2,2,2,2,2,3,3,3,3,3,3,3,3} (2 cái, 5 twos, 8 threes)
  3. {1,1,1,2,2,2,3,3,3,3,3,3,3,3,3} (3 cái, 3 twos, 9 threes)
  4. {1,1,1,1,2,3,3,3,3,3,3,3,3,3,3} (4 cái, 1 twos, 10 threes)

Thử thách

Thách thức là viết một hàm enumeratetheo ngôn ngữ bạn chọn, liệt kê tất cả các kết hợp như được mô tả ở trên:

  1. Danh sách mệnh giá. Ví dụ {1,5,10,25}. Bạn có thể sử dụng danh sách hoặc mảng.
  2. Một số nguyên không âm ybiểu thị tổng của mọi kết hợp.
  3. Một số nguyên không âm nbiểu thị tổng số xu.

Thứ tự của các đối số không quan trọng. Chức năng Pointfree được cho phép.

Đầu ra của enumeratehàm phải là một danh sách kết hợp. Mỗi kết hợp phải là duy nhất và nó phải là một danh sách các nsố nguyên cộng lại y. Mỗi mệnh giá phải xuất hiện ít nhất một lần trong mỗi kết hợp và không được kết hợp. Thứ tự của các số nguyên và các kết hợp không thành vấn đề. Bạn có thể sử dụng danh sách hoặc mảng cho đầu ra.

Hãy ghi nhớ các trường hợp cạnh sau:

  1. Nếu cả hai ynbằng 0 và danh sách các mệnh giá đều trống thì đầu ra là danh sách của một kết hợp, kết hợp trống (nghĩa là {{}}).
  2. Mặt khác, nếu ybằng 0, nbằng 0 hoặc danh sách các mệnh giá trống thì đầu ra là danh sách các tổ hợp số không (nghĩa là {}).
  3. Tổng quát hơn, nếu ynhỏ hơn tổng của các mệnh giá hoặc nnhỏ hơn số mệnh giá thì đầu ra là một danh sách các kết hợp bằng không.

Ghi điểm sẽ dựa trên kích thước của toàn bộ chương trình theo byte. Lưu ý rằng điều này bao gồm enumeratechức năng, chức năng của trình trợ giúp, báo cáo nhập, v.v. Nó không bao gồm các trường hợp kiểm tra.


Khá chắc chắn tôi đã thấy thử thách này ở đâu đó ...
Leaky Nun

Tôi hy vọng câu hỏi này không phải là một bản sao. Tôi không thể tìm thấy câu hỏi tương tự trên Code Golf. Do đó, tôi đã đăng nó.
Aadit M Shah

@PeterTaylor Nếu ynhỏ hơn tổng của các mệnh giá thì đến một lúc nào đó trong giải pháp đệ quy của bạn, bạn sẽ đạt được trường hợp cơ sở nơi danh sách các mệnh giá trống. Do đó, câu trả lời sẽ là {}(tức là không tìm thấy giải pháp). Nếu nít hơn số mệnh giá thì cuối cùng bạn sẽ đạt được trường hợp cơ bản n = 0nhưng y != 0. Do đó, câu trả lời sẽ lại là {}.
Aadit M Shah

@PeterTaylor Thật vậy. Tôi có thể đã giả định quá nhiều về các chi tiết thực hiện. Bạn có biết làm thế nào để khắc phục điều đó?
Aadit M Shah

10
Tôi đề nghị bạn xóa cờ "Được chấp nhận" cho đến khi bạn nhận được câu trả lời hoạt động. Và nói chung, thật hợp lý khi chờ đợi một vài ngày trước khi chấp nhận.
Peter Taylor

Câu trả lời:


2

05AB1E, 20 byte

g-¹sã€{Ùvy¹«DO³Qiˆ}¯

Đầu vào là theo thứ tự: list of values, nr of coins, sum to reach.

Giải thích ngắn gọn

  1. Nhận tất cả các hoán vị của danh sách chiều dài: final length - length of unique coin list
  2. Thêm danh sách các đồng tiền duy nhất vào các danh sách này.
  3. Nếu tổng bằng tổng tìm kiếm, hãy lưu danh sách
  4. Xuất tất cả các danh sách đã lưu

Dùng thử trực tuyến

Trình biên dịch trực tuyến không thể xử lý số lượng lớn tiền xu.


4

MATL , 22 byte

Z^!S!Xu!tsi=Z)"1G@m?@!

Thứ tự đầu vào là: mảng mệnh giá, số xu đã lấy ( n), tổng mong muốn ( y).

Mỗi sự kết hợp được hiển thị trên một dòng khác nhau. Đầu ra trống được hiển thị dưới dạng một chuỗi rỗng (vì vậy không có gì).

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

Mã hết bộ nhớ trong trình biên dịch trực tuyến cho ví dụ trong thử thách, nhưng hoạt động ngoại tuyến với một máy tính hiện đại, hợp lý:

>> matl
 > Z^!S!Xu!tsi=Z)"1G@m?@!
 > 
> [1 2 3]
> 15
> 36
1 1 1 1 2 3 3 3 3 3 3 3 3 3 3
1 1 1 2 2 2 3 3 3 3 3 3 3 3 3
1 1 2 2 2 2 2 3 3 3 3 3 3 3 3
1 2 2 2 2 2 2 2 3 3 3 3 3 3 3

Giải trình

Z^      % Implicitly input array of denomminations and number of coins n. Compute 
        % Cartesian power. This gives 2D array with each "combination"
        % on a different row
!S!     % Sort each row
Xu      % Deduplicate rows
!       % Transpose: rows become columns. Call this array A
ts      % Push a copy, compute sum of each column
i       % Input y (desired sum)
=       % Logical array that contains true if the "combination" has the desired sum
Z)      % Keep only those columns in array A
"       % For each column
  1G    %   Push array of denominations again
  @     %   Push current column
  m     %   Is each denomination present in the column?
  ?     %   If so
    @!  %     Push current column again. Transpose into a row
        %   End if
        % End for
        % Implicitly display stack contents

3

Con trăn 3 120 106 byte

from itertools import*
lambda d,t,l:[i+d for i in combinations_with_replacement(d,l-len(d))if sum(i+d)==t]

Một hàm ẩn danh nhận đầu vào của một bộ mệnh giá của mẫu (x_1, x_2, x_3 ... , x_k) , giá trị đích và một số đồng tiền thông qua đối số và trả về một danh sách các bộ dữ liệu của biểu mẫu [(solution_1), (solution_2), (solution_3), ... (solution_k)].

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

Itertools's combinations_with_replacementchức năng được sử dụng để tạo ra tất cả l-len(d)kết hợp với thay thế, các hệ phái. Bằng cách nối thêm dvào từng kết hợp này, đảm bảo rằng mỗi mệnh giá xuất hiện ít nhất một lần và kết hợp mới có độ dàil . Nếu các phần tử của tổng hợp thành t, kết hợp được thêm vào danh sách trả về dưới dạng một tuple.

Hãy thử nó trên Ideone


Một phương thức thay thế cho 108 byte

from itertools import*
lambda d,t,l:set(tuple(sorted(i+d))for i in product(d,repeat=l-len(d))if sum(i+d)==t)

Một hàm ẩn danh nhận đầu vào của một bộ mệnh giá của biểu mẫu (x_1, x_2, x_3 ... , x_k), giá trị đích và một số đồng tiền thông qua đối số và trả về một bộ dữ liệu của biểu mẫu{(solution_1), (solution_2), (solution_3), ... (solution_k)} .

Cách thức hoạt động (phiên bản khác)

Điều này sử dụng productchức năng từ itertoolsđể tạo ra tất cả các l-len(d)sắp xếp của các mệnh giá. Bằng cách nối thêm dvào mỗi kết hợp này, đảm bảo rằng mỗi mệnh giá xuất hiện ít nhất một lần và kết hợp mới có độ dài l. Nếu các phần tử của tổng hợp thành t, tổ hợp được sắp xếp, chuyển đổi từ danh sách sang bộ dữ liệu và được thêm vào bộ dữ liệu trả về. Cuối cùng, gọi setsẽ loại bỏ bất kỳ bản sao.

Dùng thử trên Ideone (phiên bản khác)


0

JavaScript (ES6), 135 byte

g=(a,n,y,r)=>n>0?y>0&&a.map((x,i)=>g(a.slice(i),n-1,y-x,[...r,x])):n|y||console.log(r)
(a,n,y)=>g(a,n-a.length,a.reduce((y,x)=>y-x,y),a)
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.