MATL , 17 13 byte
:tt!/XR6#uG))
Provalo online! Oppure verifica tutti i casi di test .
La dimensione dell'input può essere limitata dalla precisione in virgola mobile. Tutti i casi di test danno il risultato corretto.
Spiegazione
Questo genera tutte le frazioni k/m
con k
, m
in [1 2 ...n]
, come una matrice n
× n
. La riga indica il numeratore e la colonna indica il denominatore. In realtà la voce matrice contiene la frazione inversa m/k
, invece di k/m
, ma questo è irrilevante e può essere ignorato nel resto della spiegazione.
Le voci della matrice sono implicitamente considerate ordinate in ordine di colonna maggiore. In questo caso ciò corrisponde all'ordine richiesto: denominatore, quindi numeratore.
Tre tipi di voci devono essere ignorati da questa matrice:
- Le voci
k/m
, k>m
che hanno lo stesso valore di una voce precedente (ad esempio, 2/4
vengono ignorate perché sono uguali a 1/2
)
- Inserimenti
k/k
, k>1
. Voci che hanno un numeratore che supera il denominatore
- Voci
k/m
, k<m
(non fanno parte del problema).
La mancata osservanza delle voci viene eseguita con una unique
funzione, che rimuove stabilmente valori duplicati e genera gli indici delle voci sopravvissute. Con questo, le voci di tipo 1 sopra vengono automaticamente rimosse. Per gestire i tipi 2 e 3, le voci della matrice in diagonale e in basso sono impostate su 0
. In questo modo, tutte le voci zero verranno rimosse tranne la prima (corrispondente alla frazione valida 1/1
).
Considera l'input 4
come esempio.
: % 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