역도를 할 때 여러 접시를 막대에 부착하여 특정 무게를 만들고 싶습니다.
다음과 같은 번호판이 있습니다.
- 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]]
해결 방법이 없으면 반환 합니다.
답변
답변
파이썬 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
답변
답변
Pyth, 34 31 25 바이트
h + fqQ +; s * VT [1 2.5 5;) yMM ^ U4 4] * 4] 0yMh + fqQ +; s * VT [2 5; y;) ^ U4 4] * 4] 0yMhfqQ +; s * VT [2 5; y;) ^ U4 4
불가능한 오류.
이것은 본질적으로 무차별적인 힘입니다.
256 개의 가능한 배열 만 있기 때문에 이것은 매우 빠릅니다.