ตัวที่ n


26

คุณสามารถสร้างรายการของปันส่วนทั้งหมด 0 <r ≤ 1 โดยแสดงรายการที่พวกเขาสั่งซื้อครั้งแรกโดยตัวส่วนแล้วตามด้วยตัวเศษ:

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

โปรดทราบว่าเราข้ามจำนวนตรรกยะใด ๆ ที่เกิดขึ้นก่อนหน้านี้ เช่น 2/4 ถูกข้ามไปเพราะเราได้แสดงไว้แล้ว 1/2

ในความท้าทายนี้เราสนใจเฉพาะตัวเศษเท่านั้น ดูรายการด้านบนเขียนฟังก์ชันหรือโปรแกรมโดยใช้จำนวนเต็มบวกnที่ส่งคืนตัวเศษที่n จากรายการ


Testcases:

1 -> 1
2 -> 1
3 -> 1
4 -> 2
5 -> 1
6 -> 3
7 -> 1
8 -> 2
9 -> 3
50 -> 4
80 -> 15


2
จริง ๆ แล้วเป็นเพียงรายการของเหตุผลใน(0,1]
Robert Fraser

@RobertFraser จุดที่ดี
orlp

คำตอบ:


7

MATL , 17 13 ไบต์

:tt!/XR6#uG))

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

ขนาดอินพุตอาจถูก จำกัด ด้วยความแม่นยำของจุดลอย กรณีทดสอบทั้งหมดให้ผลลัพธ์ที่ถูกต้อง

คำอธิบาย

นี้สร้างเศษส่วนทั้งหมดk/mด้วยk, mใน[1 2 ...n]ฐานะที่เป็นn× nเมทริกซ์ แถวหมายถึงตัวเศษและคอลัมน์หมายถึงตัวส่วน อันที่จริงรายการเมทริกซ์มีส่วนของค่าผกผันm/kแทนk/mแต่นี่ไม่เกี่ยวข้องและสามารถละเว้นได้ในคำอธิบายที่เหลือ

รายการเมทริกซ์จะถูกพิจารณาโดยปริยายว่าจะเรียงลำดับตามคอลัมน์ที่สำคัญ ในกรณีนี้สิ่งนี้สอดคล้องกับคำสั่งที่ต้องการ: ตัวส่วนแล้วเป็นตัวเศษ

สามประเภทของรายการจะต้องถูกละเลยจากเมทริกซ์นี้:

  1. คอมเมนต์k/m, k>mที่มีค่าเช่นเดียวกับรายการก่อนหน้า (ตัวอย่างเช่น2/4จะไม่ใส่ใจเพราะมันเป็นเช่นเดียว1/2)
  2. ผลงานk/k, k>1. รายการที่มีตัวเศษเกินส่วน
  3. คอมเมนต์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

4

เยลลี่ , 11 9 ไบต์

gRỊTµ€Fị@

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทุก

มันทำงานอย่างไร

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.


4

Haskell, 40 ไบต์

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

ฟังก์ชั่นที่ไม่ระบุชื่อ สวยตรงไปตรงมา: ใช้ความเข้าใจรายการเพื่อสร้างรายการที่ไม่มีที่สิ้นสุดวนลูป numerators ทั้งหมดnและ ddenominators ในการแปลง zero-index เป็น indexed หนึ่งเราจะทำการเพิ่ม a 0ซึ่งใช้เวลาเป็น4ไบต์


n<-[0..d]เพิ่มศูนย์ในวิธีที่สั้นลงและบันทึก 4 ไบต์
Angs


1

Pyth, 11 ไบต์

@sm.mibdhdS

ลองใช้งานออนไลน์: การสาธิต

คำอธิบาย:

@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

1

ที่จริงแล้ว 15 ไบต์

คำตอบนี้จะขึ้นอยู่กับเดนนิสคำตอบของวุ้น ฉันใช้HNเมื่อสิ้นสุดเพื่อหลีกเลี่ยงปัญหาเกี่ยวกับการจัดทำดัชนี 0 และต้องการลดค่า n และสลับที่จุดเริ่มต้นหรือสิ้นสุด Hรับnสมาชิกรายแรกของรายชื่อตัวนับที่เป็นผลลัพธ์และNรับสมาชิกคนสุดท้ายของตัวเลือกนั้น ๆ เช่นnตัวเศษที่สองซึ่งทั้งหมดนี้ไม่มีการเล่นซุกซนกับการดำเนินการสแต็ก ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ ลองออนไลน์!

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

Ungolfing

          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.

1

Python 111 111ไบต์

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

x/yส่วนที่เป็นตัวแทนด้วย อาร์กิวเมนต์nจะลดลงเมื่อพบเศษส่วนที่เหมาะสมใหม่ ( gcdจากการfractionsตรวจสอบสามารถลดลงเศษส่วน) ในการวนซ้ำแต่ละครั้งของการวนซ้ำxจะเพิ่มขึ้นจากนั้นหากx>=yมีการy+1เริ่มต้นเศษส่วนชุดใหม่>เนื่องจาก "กรณีพิเศษ" (x,y)=(2,1)ที่มีx>yอยู่

ฉันแน่ใจว่านี่สามารถเล่นกอล์ฟได้มากกว่านี้ แต่ฉันขาดไปซึ่งฉันสามารถปรับปรุงได้ พบมัน

เชื่อมโยงกับรหัสและกรณีทดสอบ


0

JavaScript (ES6), 95 ไบต์

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

ทำงานโดยสร้างเศษส่วนทั้งหมดด้วยตัวเศษและส่วนจาก1ถึงnและกรองส่วนที่มากกว่า1หรือที่เคยเห็นก่อนหน้านี้จากนั้นนำค่าnth


0

Perl, 82 + 2 ( -plตั้งค่าสถานะ) = 84 ไบต์

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

Ungolfed:

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");
}

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")

น้อย golfed

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
}

ทดสอบ

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)
  }
)  


0

Clojure, 85 ไบต์

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

ใช้ list comprehension เพื่อสร้างรายการของ rationals ทั้งหมดจากนั้นกรองมันเพื่อให้ได้ค่าที่ต่างกันเท่านั้น ใช้nthไอเท็มของรายการและส่งคืนตัวเศษ นอกจากนี้ยังจำเป็นต้องใช้เงื่อนไขแยกต่างหากสำหรับองค์ประกอบแรกเนื่องจาก Clojure ไม่สามารถใช้ตัวเศษของจำนวนเต็มได้ (ไม่ว่าด้วยเหตุผลใดก็ตามที่พิจารณาว่าจำนวนเต็มไม่ใช่เหตุผล - https://goo.gl/XETLo2 )

ดูออนไลน์ - https://ideone.com/8gNZEB

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.