MATL , 17 13 bytes
:tt!/XR6#uG))
Pruébalo en línea! O verificar todos los casos de prueba .
El tamaño de entrada puede estar limitado por la precisión del punto flotante. Todos los casos de prueba dan el resultado correcto.
Explicación
Esto genera todas las fracciones k/m
con k
, m
en [1 2 ...n]
, como una matriz n
× n
. La fila indica el numerador y la columna indica el denominador. En realidad, la entrada de la matriz contiene la fracción inversa m/k
, en lugar de k/m
, pero esto es irrelevante y puede ignorarse en el resto de la explicación.
Las entradas de matriz se consideran implícitamente ordenadas en orden de columna mayor. En este caso esto corresponde al orden requerido: denominador, luego numerador.
Se deben descartar tres tipos de entradas de esta matriz:
- Entradas
k/m
, k>m
, que tienen el mismo valor como una entrada anterior (por ejemplo, 2/4
no es considerada ya que es el mismo que 1/2
)
- Entradas
k/k
, k>1
. Entradas que tienen un numerador que excede el denominador
- Entradas
k/m
, k<m
(estos no son parte del problema).
Hacer caso omiso de las entradas se realiza con una unique
función, que elimina de manera estable los valores duplicados y genera los índices de las entradas supervivientes. Con esto, las entradas de tipo 1 anteriores se eliminan automáticamente. Para tratar con los tipos 2 y 3, las entradas de matriz en la diagonal y debajo se establecen en 0
. De esta forma, se eliminarán todas las entradas cero, excepto la primera (correspondiente a la fracción válida 1/1
).
Considere la entrada 4
como un ejemplo.
: % 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