MATL , 17 13 байт
:tt!/XR6#uG))
Спробуйте в Інтернеті! Або перевірити всі тестові випадки .
Розмір введення може бути обмежений точністю з плаваючою комою. Усі тестові випадки дають правильний результат.
Пояснення
Це генерує всі дроби k/m
з k
, m
в [1 2 ...n]
, як n
× n
матриця. Рядок позначає чисельник, а стовпець - знаменник. Насправді запис матриці містить зворотний дріб m/k
замість k/m
, але це не має значення і може бути проігноровано в решті пояснення.
Записи матриці неявно вважаються відсортованими в порядку основного стовпця. У цьому випадку це відповідає необхідному порядку: знаменнику, потім чисельнику.
Три матриці записів не потрібно враховувати з цієї матриці:
- Записи
k/m
, k>m
які мають те саме значення, що і попередній запис (наприклад, 2/4
не враховуються, оскільки це те саме, що 1/2
)
- Записи
k/k
, k>1
. Записи, у яких чисельник перевищує знаменник
- Записи
k/m
, k<m
(це не є частиною проблеми).
Ігнорування записів виконується unique
функцією, яка стабільно видаляє дублюючі значення та виводить індекси збережених записів. При цьому записи типу 1 вище автоматично видаляються. Для роботи з типами 2 і 3 матричні записи по діагоналі та нижче встановлюються на 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