高尔夫代码:弗雷序列(I)


10

挑战

在此任务中,您将得到一个整数N(小于10 ^ 5),输出N阶的Farey序列

输入N在单行中给出,输入由EOF终止。

输入项

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}

约束条件

  • 输入数量不会超过10 ^ 6个值
  • 您可以使用任何选择的语言
  • 最短的解决方案获胜!

这会很糟糕.....我的意思是输出。
st0le 2011年

是否允许N = 0?
Eelvex 2011年

4
标题中的»(I)«是什么?
乔伊

2
@乔伊:嗯。现在有一个Farey序列(II)。必须是第一版!:-)
mellamokb 2011年

1
@mellamokb:嗯,那是一个代码挑战,因此无论如何标题都不会冲突。但是,是的,这回答了我的问题。
Joey

Answers:


5

J,96

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

/:~~.,(%~}:\)i.>:x:y给出列表;其余为I / O和格式设置(样式错误))

例如:

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}  

编辑

  • (114→106) 附加更清晰,
  • (106→105) 上限[:@
  • (105→101) 删除多余的":转换
  • (101→99) 使用中缀\作为列表
  • (99→96)

我懂了|value error: rplc。您确定您没有load 'strings'在会议的早些时候忘记它吗?
杰西·米利坎

1
@杰西:绝对。我(几乎)从未使用过'strings'。我只是使用默认的linux-j-7.01环境。
Eelvex 2011年

......我切换到j602 wd,现在可能需要切换回去。:)
Jesse Millikan

3

普通Lisp 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)'<)))

(不需要换行)

非常残酷,但是具有本地理性的语言是一个诱因。

取消评论:

                                        ; 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个字符

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,但是您确定这对于10 ^ 6的输入数量会很快吗?
Quixotic

@Debanjan否。输入10 ^ 6的速度确实会很慢。但是,它的复杂度是线性的(就术语数而言)。
fR0DDY 2011年

2

Ĵ,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或类似(wd)。在stdin上输入,在stdout上输出。

仍然对如何打高尔夫球(大约100个字符)的输出代码感到困惑。

编辑:(156-> 135)隐性->明确,适用于长单子词动词链,脑残列表生成少

编辑:(135-> 117);实测刮去。花了我足够长的时间。切换字符串处理。

编辑:(117-> 112)略微减少死角的方式来排除高于1.的分数。不必要的打开。


也许您可以省略两个x:S之一?
Eelvex

@Eelvex:左边的是2&x:例如,将有理数分成分子和分母。
杰西·米利坎

oic。可惜...:(
Eelvex 2011年

2

高尔夫脚本(101)

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

2

Ruby,110 108 102 97 94 92 91 89

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

我认为您应该分别输出“ 0/1”和“ 1/1”,而不是“ 0”和“ 1”。另外,这仅适用于ruby 1.9吗?
Eelvex

1
@Eelvex:在我的系统上确实输出0/1和1/1。是的,它需要1.9(因为字符文字)。
Lowjacker 2011年

1

哈斯克尔(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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.