MATL , 17 13 바이트
:tt!/XR6#uG))
온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .
부동 소수점 정확도에 의해 입력 크기가 제한 될 수 있습니다. 모든 테스트 사례가 올바른 결과를 제공합니다.
설명
, in을 × 행렬 로 사용하여 모든 분수 k/m
를 생성합니다 . 행은 분자를 나타내고 열은 분모를 나타냅니다. 실제로 행렬 항목에는 역 분수가 포함됩니다.k
m
[1 2 ...n]
n
n
m/k
대신에k/m
있지만 이는 관련이 없으며 나머지 설명에서는 무시할 수 있습니다.
행렬 항목은 암시 적으로 열 주요 순서로 정렬 된 것으로 간주됩니다. 이 경우에는 필요한 순서 (분모, 분자)에 해당합니다.
이 매트릭스에서는 세 가지 유형의 항목을 무시해야합니다.
- 이전 항목과 동일한 값을 가진 Entries
k/m
, k>m
예를 들어2/4
는 동일하기 때문에 무시 1/2
)
- 출품작
k/k
, k>1
. 분자가 분모를 초과하는 항목
- 항목
k/m
, k<m
(이 문제의 일부가 아닌).
항목 무시 unique
는 중복 값을 안정적으로 제거하고 생존 항목의 색인을 출력 하는 함수 로 수행됩니다 . 이를 통해 위의 유형 1 항목이 자동으로 제거됩니다. 유형 2와 3을 처리하기 위해 대각선과 아래의 행렬 항목이로 설정됩니다 0
. 이런 식으로 첫 번째 항목을 제외한 모든 0 항목이 제거됩니다 (유효 분수에 해당 1/1
).
4
예를 들어 입력 을 고려하십시오 .
: % Input n implicitly. Push range [1 2 ...n]
% STACK: [1 2 3 4]
t % Duplicate
% STACK: [1 2 3 4], [1 2 3 4]
t! % Duplicate and transpose
% STACK: [1 2 3 4], [1 2 3 4], [1; 2; 3; 4]
/ % Divide element-wise with broadcast: gives matrix with all pairs
% STACK: [1 2 3 4], [1 2 3 4;
0.5000 1 1.5000 2;
0.3333 0.6667 1 1.3333;
0.2500 0.5000 0.7500 1 ]
XR % Upper triangular part above the diagonal. This sets to 0 all entries
% corresponding to fractions that equal or exceed 1. (Since the matrix
% actually contains the inverse fractions, nonzero entries will contain
% values greater than 1)
% STACK: [1 2 3 4], [0 2 3 4;
0 0 1.5000 2;
0 0 0 1.3333;
0 0 0 0 ]
6#u % Indices of first appearance of unique elements
% STACK: [1 2 3 4], [1; 5; 9; 10; 13; 15]
G % Push input n again
% STACK: [1 2 3 4], [1; 5; 9; 10; 13; 15], 4
) % Index: get the n-th entry from the array of indices of unique elements
% STACK: [1 2 3 4], 10
) % Index (modular): get the corresponding real part. Display implicitly
% STACK: 2