Pembilang ke-n

26

Anda dapat membuat daftar semua rasional 0 <r ≤ 1 dengan mencantumkannya diurutkan terlebih dahulu oleh penyebut dan kemudian oleh pembilang:

1  1  1  2  1  3  1  2  3  4  1  5  1  2  3  4  5
-  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
1  2  3  3  4  4  5  5  5  5  6  6  7  7  7  7  7

Perhatikan bahwa kami melewatkan angka rasional apa pun yang sudah terjadi sebelumnya. Misal 2/4 dilewati karena kami sudah mencantumkan 1/2.

Dalam tantangan ini, kami hanya tertarik pada pembilang. Melihat daftar di atas, tulislah fungsi atau program dengan mengambil bilangan bulat positif n yang mengembalikan pembilang ke - n dari daftar.


Testcases:

1 -> 1
2 -> 1
3 -> 1
4 -> 2
5 -> 1
6 -> 3
7 -> 1
8 -> 2
9 -> 3
50 -> 4
80 -> 15
orlp
sumber
2
Sebenarnya hanya daftar alasan di(0,1]
Robert Fraser
@RobertFraser Poin bagus.
orlp

Jawaban:

7

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/mdengan k, mdalam [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:

  1. Entri k/m,, k>myang memiliki nilai yang sama dengan entri sebelumnya (misalnya, 2/4diabaikan karena sama dengan 1/2)
  2. Entri k/k, k>1. Entri yang memiliki pembilang melebihi penyebut
  3. Entri k/m, k<m(ini bukan bagian dari masalah).

Mengabaikan entri dilakukan dengan uniquefungsi, 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 4sebagai 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
Luis Mendo
sumber
4

Jelly , 11 9 byte

gRỊTµ€Fị@

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

gRỊTµ€Fị@  Main link. Argument: n

    µ€     Map the monadic chain to the left over [1, ..., n]; for each k:
 R           Range; yield [1, ..., k].
g            Compute the GCD of k and each j in [1, ..., k].
  Ị          Insignificant; yield 1 for 1; 0 for 2, ..., k.
   T         Truth; yield all indices of 1's, i.e., all coprimes with k.
      F      Flatten the resulting 2D array.
       ị@    At-index swapped; return the n-th element.
Dennis
sumber
4

Mathematica, 53 byte

(Join@@Select[Range@a,a~GCD~#==1&]~Table~{a,#})[[#]]&
JungHwan Min
sumber
4

Haskell, 40 byte

((0:[n|d<-[1..],n<-[1..d],gcd n d<2])!!)

Fungsi anonim. Cukup mudah: menggunakan pemahaman daftar untuk menghasilkan daftar tanpa batas, mengulang semua pembilang ndan penyebut yang relatif prima d. Untuk mengonversi indeks-nol menjadi indeks-satu, kami menambahkan 0, yang memerlukan 4byte.

Tidak
sumber
n<-[0..d]menambahkan nol dengan cara yang lebih singkat dan menyimpan 4 byte
Angs
1

Pyth, 11 byte

@sm.mibdhdS

Cobalah online: Demonstrasi

Penjelasan:

@sm.mibdhdSQQ   implicit Qs at the end (Q = input number)
  m       SQ    map each denominator d from [1, 2, ..., Q] to:
   .m   hd        select the numerators b from [0, 1, ..., d]
     ibd             for which gcd(b, d) == 1 (which is the smallest possible gcd)
                  this gives [0, 1] for d=1, [1] for d=2, [1,2] for d=3, ...
 s              combine all lists to a big one
@           Q   print the Qth element
Jakube
sumber
1

Sebenarnya , 15 byte

Jawaban ini didasarkan pada jawaban Dennis 'Jelly . Saya menggunakan HNdi akhir untuk menghindari masalah dengan pengindeksan 0 dan perlu mengurangi n dan bertukar di awal atau akhir. Hmendapat nanggota pertama dari daftar pembilang yang menghasilkan dan Nmendapat anggota terakhir dari pilihan itu, yaitu npembilang ke-5, semua tanpa mengotak-atik operasi tumpukan. Saran bermain golf diterima. Cobalah online!

;R`;r;)♀┤░`MΣHN

Tidak melakukanolf

          Implicit input n.
;         Duplicate n. Leave one n on the stack for getting the nth numerator at the end.
R`...`M   Map the following function over the range [1..n]. Variable m.
  ;         Duplicate m. Leave one m on the stack for checking coprimality later.
  r         Push the range [0...m].
  ;)        Move a duplicate of range [0...m] to BOS.
  ♀┤        Push a list of 0's and 1's where a 1 denotes a number coprime to m (a numerator),
             and 0 denotes a fraction we have counted before.
  ░         Filter the second list (range [0...m]) 
             by the truthy values in the first list (our coprime check).
Σ         Sum all of the lists in the result into one list.
H         Push result[:n] using the duplicate of n from the beginning of the program.
N         Push result[:n][:-1], which is the same as result[n-1], our nth numerator.
          Implicit return.
Sherlock9
sumber
1

Python, 111 110 byte

from fractions import*
def g(n):
 x,y=1,1
 while n>1:
  x+=1
  if x>y:x,y=1,y+1
  if gcd(x,y)<2:n-=1
 return x

Fraksi diwakili dengan x/y. Argumen ndikurangi ketika fraksi pas baru ditemukan ( gcddari fractionscek dapat fraksi dikurangi). Dalam setiap iterasi loop, xditambahkan, maka, jika x>=y, serangkaian fraksi baru y+1dimulai, >karena "kasus khusus" (x,y)=(2,1), di-golf x>y.

Saya yakin ini bisa bermain golf lebih banyak, tetapi saya kehilangan tempat saya bisa memperbaikinya. Menemukannya.

Tautan ke kode dan uji kasus

AlexRacer
sumber
0

JavaScript (ES6), 95 byte

n=>[...Array(n*n).keys()].filter(i=>i%n<=i/n&g(i%n+1,i/n+1|0)<2,g=(a,b)=>b?g(b,a%b):a)[n-1]%n+1

Bekerja dengan menghasilkan semua fraksi dengan pembilang dan penyebut dari 1ke ndan menyaring yang lebih besar dari 1atau yang sebelumnya terlihat, kemudian mengambil yang nke.

Neil
sumber
0

Perl, 82 + 2 ( -plbendera) = 84 byte

perl -ple '{{$d>$n?($n++,(grep!($n%$_||$d%$_),2..$d)&&redo):($n=1,$d++)}++$i!=$_&&redo;$_=$n}'

Tidak Disatukan:

while (<>) {  # -p flag
    chomp();  # -l flag

    my $i = 0;
    my $n = 0;
    my $d = 0;

    for (;;) {
        for (;;) {
            if ($d <= $n) {
                $n = 1;
                $d++;
                last;
            }
            else {
                $n++;
                last unless grep { !($n % $_) && !($d % $_) } 2 .. $d;
            }
        }
        if (++$i == $_) {
            $_ = $n;
            last;
        }
    }
}
continue {
    print($_, "\n");
}
Denis Ibaev
sumber
0

JavaScript (ES6), 76

x=>eval("for(g=(a,b)=>b?g(b,a%b):a,d=n=0;x;g(n,d)-1||--x)n=++n>d?(++d,1):n")

Kurang golf

x=>{
  g=(a,b) => b ? g(b,a%b) : a; // gcd
  for (d=n=0; x; )
  {
     ++n;
     if (n > d)
     {
        ++d;
        n=1;
     }
     if (g(n,d) == 1) // if the fraction is irreducible 
        --x;
  }
  return n
}

Uji

f=
x=>eval("for(g=(a,b)=>b?g(b,a%b):a,d=n=0;x;g(n,d)-1||--x)n=++n>d?(d++,1):n")

;`1 -> 1
2 -> 1
3 -> 1
4 -> 2
5 -> 1
6 -> 3
7 -> 1
8 -> 2
9 -> 3
50 -> 4
80 -> 15`.split`\n`.forEach(
  r=>{
    var [a,k]=r.match(/\d+/g),r=f(a)
    console.log(r==k?'OK':'KO',a,r)
  }
)  

edc65
sumber
0

Clojure, 85 byte

#(if(= 1 %)1(numerator(nth(distinct(for[i(range)j(range 1(inc i))](/ j i)))(dec %))))

Gunakan pemahaman daftar untuk menghasilkan daftar semua rasional, lalu filter untuk mendapatkan yang berbeda saja. Mengambil nthitem dari daftar dan mengembalikan pembilangnya. Juga diperlukan kondisi terpisah untuk elemen pertama karena Clojure tidak dapat mengambil pembilang bilangan bulat. (untuk alasan apa pun yang menganggap bilangan bulat tidak Rasional - https://goo.gl/XETLo2 )

Lihat online - https://ideone.com/8gNZEB

cliffroot
sumber