コードゴルフ:フェイリーシーケンス(I)


10

チャレンジ

このタスクでは、整数N(10 ^ 5未満)が与えられ、次数NのFareyシーケンスが出力されます。

入力Nは1行で指定され、入力は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 Sequence(II)があります。初版でなければならない!:-)
mellamokb '30年

1
@mellamokb:ええと、それはコードのチャレンジですが、タイトルが衝突することはありません。しかし、そうです、それが私の質問に答えます。
ジョーイ

回答:


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'セッションでは、以前とそれを忘れ?
ジェシーミリカン、2011年

1
@ジェシー:絶対に。私は(ほとんど)使用しません'strings'。デフォルトのlinux-j-7.01環境を使用しています。
Eelvex 2011年

うーん...私はのためにj602に切り替えましたがwd、今は元に戻す必要があるかもしれません。:)
ジェシーミリカン

3

Common 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

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または同様のもの(wd)。stdinへの入力、stdoutへの出力。

それでも、100文字程度の出力コードをどうやってゴルフするかについて困惑しています。

編集:(156-> 135)暗黙的->長いモナド動詞連鎖の明示的、ブレインデッドリスト生成の減少

編集:(135-> 117)razeが見つかりました。十分に長くかかった。文字列の処理を切り替えました。

編集:(117-> 112)1を超える分数を除外するための少し無駄のある方法。不要なオープン。


たぶん、2つx:のうちの1つを省略できますか?
Eelvex 2011年

@Eelvex:左側は2&x:です。たとえば、有理数を分子と分母に分割します。
ジェシーミリカン、2011年

oic。残念... :(
Eelvex

2

ゴルフスクリプト(101)

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

2

ルビー、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」の代わりに「0/1」と「1/1」をそれぞれ出力する必要があると思います。また、これはruby 1.9でのみ機能しますか?
Eelvex 2011年

1
@Eelvex:私のシステムでは0/1と1/1を出力します。そして、はい、1.9が必要です(文字リテラルのため)。
ロージャッカー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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.