MATL , 17 13 octets
:tt!/XR6#uG))
Essayez-le en ligne! Ou vérifiez tous les cas de test .
La taille d'entrée peut être limitée par la précision en virgule flottante. Tous les cas de test donnent le résultat correct.
Explication
Cela génère toutes les fractions k/m
avec k
, m
dans [1 2 ...n]
, comme une matrice n
× n
. La ligne indique le numérateur et la colonne le dénominateur. En fait, l'entrée de la matrice contient la fraction inverse m/k
, au lieu de k/m
, mais cela n'est pas pertinent et peut être ignoré dans le reste de l'explication.
Les entrées de matrice sont implicitement considérées comme triées par ordre de colonne. Dans ce cas, cela correspond à l'ordre requis: dénominateur, puis numérateur.
Trois types d'entrées doivent être ignorés de cette matrice:
- Les inscriptions
k/m
, k>m
qui ont la même valeur que d' une entrée précédente (par exemple, 2/4
est ignoré parce qu'il est le même que 1/2
)
- Entrées
k/k
, k>1
. Entrées dont le numérateur dépasse le dénominateur
- Entrées
k/m
, k<m
(elles ne font pas partie du problème).
Ignorer les entrées se fait avec une unique
fonction qui supprime de manière stable les valeurs en double et génère les indices des entrées survivantes. Avec cela, les entrées de type 1 ci-dessus sont automatiquement supprimées. Pour gérer les types 2 et 3, les entrées de matrice en diagonale et en dessous sont définies sur 0
. De cette façon, toutes les entrées nulles seront supprimées sauf la première (correspondant à la fraction valide 1/1
).
Considérez la saisie 4
comme exemple.
: % 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