Chọn từ một nhóm trọng số hiện có để tạo tổng mục tiêu


9

Khi tập tạ, tôi muốn tạo một trọng lượng cụ thể bằng cách gắn một vài tấm vào một thanh.

Tôi có các tấm sau:

  • 6 đĩa mỗi loại 1 kg
  • 6 đĩa 2,5 kg mỗi tấm
  • 6 đĩa mỗi loại 5 kg
  • 6 đĩa mỗi loại 10 kg

Thanh tự nặng 10 kg.

Chỉ được phép gắn các tấm theo cặp - chúng được gắn ở mỗi đầu của thanh và sự sắp xếp ở hai đầu phải hoàn toàn đối xứng (ví dụ: gắn hai tấm 5 kg ở một đầu và một tấm 10 kg ở đầu kia bị cấm vì lý do an toàn).

Tạo một chương trình hoặc một chức năng cho tôi biết tôi phải sử dụng bao nhiêu tấm để có được tổng trọng lượng cho trước. Đầu vào là một số nguyên lớn hơn 11; đầu ra là một danh sách / mảng / chuỗi gồm 4 số. Nếu không thể kết hợp các tấm hiện có để có trọng lượng mục tiêu, hãy tạo ra một mảng 0 / trống, một chuỗi không hợp lệ, ném một ngoại lệ hoặc một số như vậy.

Nếu có một số giải pháp, mã phải chỉ xuất một (không làm cho người dùng chọn - anh ta quá bận rộn với những thứ khác).

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

12 -> [2 0 0 0] - 2 plates of 1 kg plus the bar of 10 kg
13 -> [0 0 0 0] - a special-case output that means "impossible"
20 -> [0 0 2 0] - 2 plates of 5 kg + bar
20 -> [0 4 0 0] - a different acceptable solution for the above
21 -> [6 2 0 0] - 6 plates of 1 kg + 2 plates of 2.5 kg + bar
28 -> [0 0 0 0] - impossible
45 -> [0 2 6 0] - a solution for a random number in range
112 -> [2 4 6 6] - a solution for a random number in range
121 -> [6 6 6 6] - maximal weight for which a solution is possible

Nếu mã của bạn xuất các số theo thứ tự ngược lại (từ tấm nặng sang đèn sáng), vui lòng chỉ định rõ ràng điều này để tránh nhầm lẫn.


1
Đây không phải là một bản sao của câu hỏi đếm xu tối thiểu sao? Tôi không nghĩ rằng thuật toán tham lam tương tự thất bại, ngoại trừ hạn chế 6 của một loại tấm. Tôi nghĩ rằng điều đó có thể không đủ khác biệt, nhưng tôi không chắc chắn.
FryAmTheEggman

1
Thuật toán tham lam không hoạt động (ít nhất là không sửa đổi, ít nhất) chính xác vì số lượng có hạn
anatolyg

Có liên quan , nhưng đó là ASCII
admBorkBork

Vâng, lý do tôi đăng là tôi không chắc rằng sửa đổi là đủ quan trọng. Tôi đã đăng để cố gắng nhận phản hồi của cộng đồng và tôi sẽ xóa nhận xét của mình nếu có vẻ như cộng đồng không đồng ý với tôi.
FryAmTheEggman

Chúng ta có thể xuất tất cả các giải pháp thay vì chỉ một?
Luis Mendo

Câu trả lời:


5

Thạch , 22 byte

4ṗạµ×2,5,10,20S€+⁵iƓịḤ

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

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

4ṗạµ×2,5,10,20S€+⁵iƓịḤ  Main link. No arguments

4                       Set the left argument and initial return value to 4.
 ṗ                      Take the Cartesian power of [1, 2, 3, 4] and 4, i.e.,
                        generate all 4-tuples of integers between 1 and 4.
  ạ                     Take the absolute difference of all integers in the
                        4-tuples and the integer 4. This maps [1, 2, 3, 4] to
                        [3, 2, 1, 0] and places [0, 0, 0, 0] at index 0.
   µ                    Begin a new, monadic chain. Argument: A (list of 4-tuples)
     2,5,10,20          Yield [2, 5, 10, 20].
    ×                   Perform vectorized multiplication with each 4-tuple in A.
              S€        Sum each resulting 4-tuple.
                +⁵      Add 10 to each sum.
                   Ɠ    Read an integer from STDIN.
                  i     Find its first index in the array of sums (0 if not found).
                     Ḥ  Unhalve; yield the list A, with all integers doubled.
                    ị   Retrieve the 4-tuple at the proper index.

6

MATL , 29 28 byte

4t:qEZ^!"[l2.5AX]@Y*10+G=?@.

Đối với các đầu vào không có giải pháp, điều này tạo ra một đầu ra trống (không có lỗi).

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

Giải trình

4           % Push 4
t:q         % Duplicate 4 and transform into range [0 1 2 3]
E           % Multiply by 2: transform into [0 2 4 6]
Z^          % Cartesian power. Each row is a "combination" of the four numbers
!           % Transpose
"           % For each column
  [l2.5AX]  %   Push [1 2.5 5 10]
  @         %   Push current column
  Y*        %   Matrix multiply. Gives sum of products
  10+       %   Add 10
  G=        %   Compare with input: are they equal?
  ?         %   If so
    @       %     Push current column, to be displayed
    .       %     Break loop
            %   Implicit end
            % Implicit end
            % Implicit display

5

Toán học, 70 byte

Select[FrobeniusSolve[{2,5,10,20},2#-20],AllTrue[EvenQ@#&&#<7&]][[1]]&

Chức năng ẩn danh. Lấy một số làm đầu vào, và đưa ra một danh sách hoặc lỗi và trả về {}[[1]]nếu không có giải pháp.


4

Thạch, 25 byte

×2,5,10,20S+⁵⁼³
4ṗ4’ÇÐfḢḤ

Hãy thử nó ở đây.


2,5,10,20->2,5,⁵,20
Nữ tu bị rò rỉ

thực sự ... không phải ,là một con đê? Cả đời tôi là một lời nói dối
Leaky Nun

@LeakyNun ,là một dyad, nhưng nó cũng có thể được sử dụng cho nghĩa đen. 2,5,⁵,20không phải là một nghĩa đen mặc dù ( 2,520, nhưng ,, ,là các nguyên tử), vì vậy bạn cần một cái gì đó để kết hợp các liên kết.
Dennis

3

Python 3, 112 byte

lambda n:[i for i in[[i//4**j%4*2for j in range(4)]for i in range(256)]if i[0]+2.5*i[1]+5*i[2]+10*i[3]+10==n][0]

Một hàm ẩn danh nhận đầu vào, thông qua đối số, của khối mục tiêu và trả về số lượng của mỗi tấm dưới dạng danh sách. Nếu không có giải pháp tồn tại, một lỗi được đưa ra. Đây là lực lượng vũ phu thuần túy.

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

lambda n                                   Anonymous function with input target mass n
...for i in range(256)                     Loop for all possible arrangement indices i
[i//4**j%4*2for j in range(4)]             Create a base-4 representation of the index i,
                                           and multiply each digit by 2 to map from
                                           (0,1,2,3) to (0,2,4,6)
[...]                                      Package all possible arrangements in a list
...for i in...                             Loop for all possible arrangements i
i...if i[0]+2.5*i[1]+5*i[2]+10*i[3]+10==n  Return i if it gives the target mass
[...]                                      Package all solutions in a list
:...[0]                                    Return the first list element. This removes any
                                           multiple solutions, and throws an error if there
                                           being no solutions results in an empty list

Hãy thử nó trên Ideone



1

Pyth, 34 31 25 byte

h + fqQ +; s * VT [1 2,5 5;) yMM ^ U4 4] * 4] 0 
yMh + fqQ +; s * VT [2 5; y;) ^ U4 4] * 4] 0
yMhfqQ +; s * VT [2 5; y;) ^ U4 4

Bộ thử nghiệm.

Lỗi trong sự bất khả thi.

Đây thực chất là một lực lượng vũ phu.

Điều này khá nhanh, vì chỉ có 256 sắp xếp có thể.


1

Scala, 202 byte

Scala quyết định không nhận được nhiều tình yêu ở đây, vì vậy tôi trình bày một giải pháp (có thể không tối ưu) trong Scala.

def w(i:Int){var w=Map(20->0,10->0,5->0,2->0);var x=i-10;while(x>0){
var d=false;for(a<-w.keys)if(a<=x & w(a)<6 & !d){x=x-a;w=w.updated(a,w(a)+2);d=true;}
if(!d){println(0);return;}}
println(w.values);}

Chương trình xuất ra theo thứ tự ngược lại và có thêm rác so với các giải pháp trong bài. Khi không tìm thấy giải pháp, in 0.

Lưu ý: Tôi không thể xóa bất kỳ dòng mới hoặc dấu cách nào vì Scala bị câm, vì vậy tôi nghĩ để giảm kích thước, phương pháp phải được làm lại trừ khi tôi bỏ lỡ điều gì đó rõ ràng.


1

APL, 40 byte

{2×(4⍴4)⊤⍵⍳⍨10+2×,⊃∘.+/↓1 2.5 5 10∘.×⍳4}

Trong ⎕IO ← 0. Bằng tiếng Anh:

  1. 10+2×,∘.+⌿1 2.5 5 10∘.×⍳4: xây dựng mảng của tất cả các trọng số có thể, bằng cách tính tổng trọng lượng ngoài 4D của các trọng số cho mỗi loại trọng lượng;
  2. ⍵⍳⍨: tìm kiếm chỉ số của cái đã cho. Nếu không tìm thấy chỉ số là 1 + số kiểm đếm của mảng ở bước 1;
  3. (4⍴4)⊤: đại diện cho chỉ số trong cơ sở 4, nghĩa là tính tọa độ của đường cong đã cho trong không gian 4D;
  4. : đưa kết quả vào không gian vấn đề, trong đó tọa độ nên được hiểu là một nửa số lượng các tấm.

Ví dụ: {2 × (4⍴4) 10 + 2 ×, ⊃∘. + / ↓ 1 2.5 5 10∘. × 4} 112 2 4 6 6

Phần thưởng : vì APL là một ngôn ngữ mảng, một số trọng số có thể được kiểm tra cùng một lúc. Trong trường hợp này, kết quả được hoán vị:

      {2×(4⍴4)⊤⍵⍳⍨10+2×,⊃∘.+/↓1 2.5 5 10∘.×⍳4}12 13 20 21 28 45 112 121
2 0 0 6 0 0 2 6
0 0 0 2 0 2 4 6
0 0 2 0 0 2 6 6
0 0 0 0 0 2 6 6

1

JavaScript (ES6), 109 byte

n=>`000${[...Array(256)].findIndex((_,i)=>i+(i&48)*9+(i&12)*79+(i&3)*639+320==n*32).toString(4)*2}`.slice(-4)

Trả 00-2về lỗi. Giải pháp thay thế trả undefinedvề lỗi, cũng 109 byte:

n=>[...Array(256)].map((_,i)=>`000${i.toString(4)*2}`.slice(-4)).find(s=>+s[0]+s[1]*2.5+s[2]*5+s[3]*10+10==n)
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.