Code-Golf: Trình tự Farey (I)


10

Thử thách

Trong tác vụ này, bạn sẽ được cấp một số nguyên N (nhỏ hơn 10 ^ 5), xuất chuỗi Farey theo thứ tự N.

Đầu vào N được cho trong một dòng duy nhất, đầu vào được kết thúc bằng EOF.

Đầu vào

4
3
1
2

Đầu ra

F4 = {0/1, 1/4, 1/3, 1/2, 2/3, 3/4, 1/1}
F3 = {0/1, 1/3, 1/2, 2/3, 1/1}
F1 = {0/1, 1/1}
F2 = {0/1, 1/2, 1/1}

Những ràng buộc

  • Số lượng đầu vào sẽ không vượt quá 10 ^ 6 giá trị
  • Bạn có thể sử dụng bất kỳ ngôn ngữ nào bạn chọn
  • Giải pháp ngắn nhất sẽ thắng!

Điều này sẽ nhận được loooong ..... ý tôi là đầu ra.
st0le

N = 0 có được phép không?
Eelvex

4
Cái gì với »(I)« trong tiêu đề?
Joey

2
@Jey: Hừm. bây giờ có một chuỗi Farey (II). Phải là phiên bản đầu tiên! :-)
mellamokb

1
@mellamokb: Tuy nhiên, đó là một thách thức về mã, vì vậy, không có xung đột tiêu đề trong mọi trường hợp. Nhưng vâng, đó là câu trả lời cho câu hỏi của tôi.
Joey

Câu trả lời:


5

J, 96

('F',],' = {0/1',', 1/1}',~('r';'/')rplc~', ',"1":"0@(3 :'}./:~~.,(%~}:\)i.1x+y')&".);._2(1!:1)3

( /:~~.,(%~}:\)i.>:x:yđưa ra danh sách; phần còn lại là I / O và định dạng (với kiểu xấu))

Ví dụ:

4
3
1
2
F4 = {0/1, 1/4, 1/3, 1/2, 2/3, 3/4, 1/1}
F3 = {0/1, 1/3, 1/2, 2/3, 1/1}          
F1 = {0/1, 1/1}                         
F2 = {0/1, 1/2, 1/1}  

Chỉnh sửa

  • (114 → 106) Bổ sung rõ ràng hơn,
  • (106 → 105) Cap [:để Tại@
  • (105 → 101) Xóa ":chuyển đổi không cần thiết
  • (101 → 99) Sử dụng infix \cho danh sách
  • (99 → 96)

Tôi nhận được |value error: rplc. Bạn có chắc chắn rằng bạn đã không load 'strings'sớm hơn trong phiên và quên nó?
Jesse Millikan

1
@Jlie: hoàn toàn. Tôi (gần như) không bao giờ sử dụng 'strings'. Tôi chỉ sử dụng môi trường linux-j-7.01 mặc định.
Eelvex

Ugh ... Tôi đã chuyển sang j602 wdvà bây giờ tôi có thể cần phải quay lại. :)
Jesse Millikan

3

Lisp thường gặp, 156

(do((l()()))((not(set'n(read()()))))(dotimes(j n)(dotimes(i(1+ j))(push(/(1+ i
)(1+ j))l)))(format t"~&F~D = {0/1~{, ~A~}/1}"n(sort(delete-duplicates l)'<)))

(dòng mới không cần thiết)

Rất tàn bạo, nhưng ngôn ngữ với lý trí bản địa là một lời mời đến đó.

Ungolfed với ý kiến:

                                        ; at each iteration:
(do ((l()()))                           ; - reset l to nil
    ((not (set 'n (read()()))))         ; - read a term (nil for eof)
                                        ;   assign it to n
                                        ;   stop looping if nil
  (dotimes (j n)                        ; for j in 0..n-1
    (dotimes (i (1+ j))                 ;   for i in 0..j
      (push (/ (1+ i) (1+ j)) l)))      ;     prepend i+1/j+1 to l
  (format t "~&F~D = {0/1~{, ~A~}/1}"   ; on a new line, including 0/1,
                                        ; forcing the format for 1
          n                             ; print sequence index, and
          (sort                         ; sorted sequence of
           (delete-duplicates l)        ;   unique fractions
           '<)))                        ; (in ascending order)

3

Python, 186 ký tự

import sys
p=sys.stdout.write
while 1:
 a=0;b=c=x=1;d=y=N=input();p("F%d = {%d/%d, %d/%d"%(d,a,b,c,d))
 while y-1:x=(b+N)/d*c-a;y=(b+N)/d*d-b;p(", %d/%d"%(x,y));a=c;c=x;b=d;d=y
 p("}\n")

+ 1, nhưng bạn có chắc rằng điều này sẽ nhanh chóng cho 10 ^ 6 số lượng đầu vào?
Quixotic

@Debanjan Không. Sẽ rất chậm cho 10 ^ 6 đầu vào. Đó là tuyến tính về độ phức tạp (về số lượng thuật ngữ), mặc dù.
fR0DDY

2

J, 156 135 117 112

d=:3 :0
wd;'F';(":y);' = {';(}.,(', ';2|.'/';|.)"1(<@":)"0(2)x:/:~~.,(-.@>*%)"0/~i.x:>:y),<'}'
)
d@".;._2(1!:1)3

j602 hoặc tương tự ( wd). Đầu vào trên stdin, đầu ra trên thiết bị xuất chuẩn.

Vẫn còn băn khoăn về cách đánh golf mã đầu ra, có 100 ký tự hoặc hơn.

Chỉnh sửa: (156-> 135) Tacit-> tường minh cho chuỗi động từ đơn âm dài, tạo danh sách ít chữ nổi

Chỉnh sửa: (135-> 117) Tìm thấy cào . Mất tôi đủ lâu. Chuyển đổi xử lý chuỗi xung quanh.

Chỉnh sửa: (117-> 112) Cách ít bản lĩnh hơn để loại trừ các phân số trên 1. Mở không cần thiết.


Có lẽ bạn có thể bỏ qua một trong hai của bạn x:?
Eelvex

@Eelvex: Số bên trái là 2 & x:, ví dụ: chia một số hữu tỷ thành tử số và mẫu số.
Jesse Millikan

oic Đáng tiếc ... :(
Mười hai lần

2

Golf (101)

~:c[,{){.}c(*}%.c/zip{+}*]zip{~{.@\%.}do;1=},{~<},{~\10c?*\/}${'/'*}%', '*'F'c`+' = {0/1, '+\', 1/1}'

2

Hồng ngọc, 110 108 102 97 94 92 91 89 89

#!ruby -lp
$_="F#$_ = {#{a=[];1.upto(eval$_){|d|a|=(0..d).map{|n|n.quo d}};a.sort*', '}}"

Tôi nghĩ bạn nên xuất "0/1" và "1/1" thay vì "0" và "1" tương ứng. Ngoài ra, điều này chỉ hoạt động cho ruby ​​1.9?
Eelvex

1
@Eelvex: Nó xuất 0/1 và 1/1 trên hệ thống của tôi. Và vâng, nó yêu cầu 1.9 (vì nghĩa đen của nhân vật).
Lowjacker

1

Haskell, 148

f n="F"++show n++" = {"++(intercalate", ".("0/1":).map(\(i:%d)->show i++"/"++show d).sort.nub$[i%d|d<-[1..n],i<-[1..d-1]])++"}"
main=interact$f.read
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.