코드-골프 : 패 레이 시퀀스 (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 값을 초과하지 않습니다
  • 원하는 언어를 사용할 수 있습니다
  • 최단 솔루션이 승리합니다!

이것은 loooong을 얻을 것입니다 .... 출력을 의미합니다.
st0le

N = 0이 허용됩니까?
Eelvex

4
제목에서»(I)«는 무엇입니까?
Joey

2
@Joey : 흠. 이제 Farey Sequence (II)가 있습니다. 초판이어야합니다! :-)
mellamokb

1
@mellamokb : 글쎄, 그것은 코드 도전이지만, 어떤 경우에도 제목 충돌이 없습니다. 그러나 예, 그런 종류의 질문에 대답합니다.
Joey

답변:


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'이 세션의 초기에 하지 않았다고 확신 합니까?
Jesse Millikan

1
@Jesse : 물론입니다. 나는 (거의) 절대 사용하지 않습니다 'strings'. 기본 linux-j-7.01 환경을 사용합니다.
Eelvex

어 ... 나는 j602로 전환 wd했고 지금은 다시 전환해야 할 수도 있습니다. :)
Jesse Millikan

3

커먼 리스프, 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) Tacit-> 긴 수도원 동사 체인에 대해 명시 적이며 브레인 데드 목록 생성이 적습니다.

편집 : (135-> 117) raze 발견 . 충분히 오래 걸 렸어요 문자열 처리를 전환했습니다.

편집 : (117-> 112) 1. 위의 분수를 배제하는 약간 적은 뇌사 방법. 불필요하게 열립니다.


어쩌면 두 가지 중 하나를 생략 할 수 x:있습니까?
Eelvex

@Eelvex : 왼쪽은 2 & x입니다. 예를 들어 유리수를 분자와 분모로 나눕니다.
Jesse Millikan

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"을 출력해야한다고 생각합니다. 또한 루비 1.9에서만 작동합니까?
Eelvex

1
@ Elelx : 내 시스템에서 0/1과 1/1을 출력합니다. 그리고 네, 1.9가 필요합니다 (문자 리터럴 때문에).
Lowjacker

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.