MATL , 17 13 Bytes
:tt!/XR6#uG))
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Die Eingabegröße kann durch die Gleitkommagenauigkeit begrenzt sein. Alle Testfälle liefern das richtige Ergebnis.
Erläuterung
Dies erzeugt alle Brüche k/m
mit k
, m
in [1 2 ...n]
, als n
× n
Matrix. Die Zeile gibt den Zähler und die Spalte den Nenner an. Tatsächlich enthält der Matrixeintrag m/k
stattdessen den inversen Bruch , k/m
was jedoch irrelevant ist und in der weiteren Erläuterung ignoriert werden kann.
Matrixeinträge gelten implizit als in der Reihenfolge des Spaltenhauptteils sortiert. In diesem Fall entspricht dies der erforderlichen Reihenfolge: Nenner, dann Zähler.
Drei Arten von Einträgen müssen in dieser Matrix nicht berücksichtigt werden:
- Einträge
k/m
, k>m
die den gleichen Wert haben wie ein vorheriger Eintrag (wird beispielsweise 2/4
ignoriert, weil es der gleiche ist wie 1/2
)
- Einträge
k/k
, k>1
. Einträge, deren Zähler den Nenner überschreitet
- Einträge
k/m
, k<m
(diese sind nicht Teil des Problems).
Das Ignorieren von Einträgen erfolgt mit einer unique
Funktion, die doppelte Werte stabil entfernt und die Indizes der überlebenden Einträge ausgibt. Einträge vom Typ 1 werden dabei automatisch entfernt. Für die Typen 2 und 3 werden die Matrixeinträge in der Diagonale und darunter auf gesetzt 0
. Auf diese Weise werden alle Null-Einträge mit Ausnahme des ersten entfernt (entsprechend dem gültigen Bruch 1/1
).
Betrachten Sie die Eingabe 4
als Beispiel.
: % 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