MATL , 17 13 bajtów
:tt!/XR6#uG))
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wielkość wejściowa może być ograniczona dokładnością zmiennoprzecinkową. Wszystkie przypadki testowe dają poprawny wynik.
Wyjaśnienie
To generuje wszystkie ułamki za k/m
pomocą k
, m
w [1 2 ...n]
, jako macierzy n
× n
. Wiersz wskazuje licznik, a kolumna wskazuje mianownik. W rzeczywistości wpis macierzy zawiera ułamek odwrotny m/k
zamiast k/m
, ale nie ma to znaczenia i można go zignorować w dalszej części objaśnienia.
Wpisy macierzy są domyślnie uważane za sortowane w porządku według kolumny. W tym przypadku odpowiada to wymaganej kolejności: mianownik, a następnie licznik.
W tej macierzy należy pominąć trzy typy wpisów:
- Wpisy
k/m
, k>m
które mają taką samą wartość jak poprzedni wpis (na przykład 2/4
nie są uwzględniane, ponieważ są takie same jak 1/2
)
- Wpisy
k/k
, k>1
. Wpisy, których licznik przekracza mianownik
- Wpisy
k/m
, k<m
(nie są częścią problemu).
Ignorowanie wpisów odbywa się za pomocą unique
funkcji, która stabilnie usuwa zduplikowane wartości i wysyła wskaźniki pozostałych wpisów. Dzięki temu wpisy typu 1 powyżej są automatycznie usuwane. Aby poradzić sobie z typami 2 i 3, wpisy macierzy po przekątnej i poniżej są ustawione na 0
. W ten sposób wszystkie wpisy zerowe zostaną usunięte z wyjątkiem pierwszego (odpowiadającego prawidłowej frakcji 1/1
).
Rozważ dane wejściowe 4
jako przykład.
: % 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