MATL , 17 13 byte
:tt!/XR6#uG))
Cobalah online! Atau verifikasi semua kasus uji .
Ukuran input mungkin dibatasi oleh akurasi floating point. Semua test case memberikan hasil yang benar.
Penjelasan
Ini menghasilkan semua fraksi k/m
dengan k
, m
dalam [1 2 ...n]
, sebagai matriks n
× n
. Baris menunjukkan pembilang dan kolom menunjukkan penyebut. Sebenarnya entri matriks berisi fraksi terbalik m/k
, bukan k/m
, tetapi ini tidak relevan dan dapat diabaikan di sisa penjelasan.
Entri matriks secara implisit dianggap diurutkan dalam urutan kolom-utama. Dalam hal ini sesuai dengan urutan yang disyaratkan: penyebut, kemudian pembilang.
Tiga jenis entri perlu diabaikan dari matriks ini:
- Entri
k/m
,, k>m
yang memiliki nilai yang sama dengan entri sebelumnya (misalnya, 2/4
diabaikan karena sama dengan 1/2
)
- Entri
k/k
, k>1
. Entri yang memiliki pembilang melebihi penyebut
- Entri
k/m
, k<m
(ini bukan bagian dari masalah).
Mengabaikan entri dilakukan dengan unique
fungsi, yang secara stabil menghapus nilai duplikat dan menampilkan indeks entri yang bertahan. Dengan ini, entri tipe 1 di atas secara otomatis dihapus. Untuk menangani tipe 2 dan 3, entri matriks di diagonal dan di bawah ini diatur ke 0
. Dengan cara ini, semua entri nol akan dihapus kecuali yang pertama (sesuai dengan fraksi yang valid 1/1
).
Pertimbangkan input 4
sebagai contoh.
: % 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