MATL、17 13バイト
:tt!/XR6#uG))
オンラインでお試しください!または、すべてのテストケースを確認します。
入力サイズは、浮動小数点の精度によって制限される場合があります。すべてのテストケースで正しい結果が得られます。
説明
これは、全ての画分を生成するk/m
と共にk
、m
内[1 2 ...n]
として、n
× n
マトリックス。行は分子を示し、列は分母を示します。実際、行列エントリにはのm/k
代わりに逆分数が含まれていますk/m
が、これは無関係であり、残りの説明では無視できます。
マトリックスエントリは、列優先の順序でソートされていると暗黙的に見なされます。この場合、これは必要な順序、分母、次に分子に対応します。
このマトリックスから3種類のエントリを無視する必要があります。
- エントリは
k/m
、k>m
前のエントリと同じ値を有し、(例えば、2/4
それは同じであるので、無視されます1/2
)
- エントリ
k/k
、k>1
。分母を超える分子を持つエントリ
- エントリー
k/m
、k<m
(これらは問題の一部ではありません)。
エントリの無視はunique
、重複する値を安定して削除し、残存エントリのインデックスを出力する関数を使用して行われます。これにより、上記のタイプ1のエントリは自動的に削除されます。タイプ2および3を処理するために、対角以下のマトリックスエントリはに設定され0
ます。これにより、最初のエントリ(有効な分数に対応)を除くすべてのゼロエントリが削除されます1/1
。
4
例として入力を検討してください。
: % 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