기존 가중치 세트에서 선택하여 목표 합계를 만듭니다. 결합하여 목표 무게를 얻는 것이 불가능한

역도를 할 때 여러 접시를 막대에 부착하여 특정 무게를 만들고 싶습니다.

다음과 같은 번호판이 있습니다.

  • 1kg 6 장
  • 각각 2.5kg 6 장
  • 각 5kg 6 장
  • 각각 10kg 6 장

바 자체의 무게는 10kg입니다.

플레이트는 한 쌍으로 만 부착 할 수 있습니다. 막대의 각 끝에 부착되어 있고 두 끝의 배치는 완전히 대칭이어야합니다 (예 : 한쪽 끝에 2 개의 5kg 플레이트를 부착하고 한쪽에 10kg 플레이트를 부착) 다른 쪽 끝은 안전상의 이유로 금지되어 있습니다).

주어진 총 중량을 얻기 위해 사용해야하는 각 종류의 플레이트 수를 알려주는 프로그램이나 기능을 만드십시오. 입력은 11보다 큰 정수입니다. 출력은 4 숫자의 목록 / 배열 / 문자열입니다. 기존 플레이트를 결합하여 목표 무게를 얻는 것이 불가능한 경우 0 / 빈 배열, 유효하지 않은 문자열을 출력하고 예외 또는 그와 유사한 것을 던져보십시오.

여러 솔루션이있는 경우 코드는 하나만 출력해야합니다 (사용자가 다른 것을 너무 바쁘게 선택하지 마십시오).

테스트 사례 :

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

코드가 숫자를 반대 순서로 (굵은 판에서 밝은 것까지) 출력하는 경우 혼동을 피하기 위해 명시 적으로 지정하십시오.



답변

젤리 , 22 바이트

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

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

작동 원리

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.

답변

MATL , 29 28 바이트

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

솔루션이없는 입력의 경우 빈 출력이 생성됩니다 (오류 없음).

온라인으로 사용해보십시오!

설명

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

답변

Mathematica, 70 바이트

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

익명의 기능. 숫자를 입력으로 받아서 목록이나 오류를 출력하고 {}[[1]]해결 방법이 없으면 반환 합니다.


답변

젤리, 25 바이트

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

여기에서 시도하십시오.


답변

파이썬 3, 112 바이트

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]

인수를 통해 목표 매스의 입력을 받아서 각 플레이트의 번호를 목록으로 반환하는 익명 함수입니다. 솔루션이 없으면 오류가 발생합니다. 이것은 순수한 무차별 힘입니다.

작동 원리

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

Ideone에서 사용해보십시오


답변

Brachylog , 50 바이트

,L##l4,L:{.~e[0:3]}a:[2:5:10:20]*+:10+?,L:{:2*.}a.

false가능하지 않은 경우 반환 합니다.


답변

Pyth, 34 31 25 바이트

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

테스트 스위트.

불가능한 오류.

이것은 본질적으로 무차별적인 힘입니다.

256 개의 가능한 배열 만 있기 때문에 이것은 매우 빠릅니다.