Code-Golf: Sequência Farey (I)


10

Desafio

Nesta tarefa, você receberia um número inteiro N (menor que 10 ^ 5), emitindo a sequência Farey da ordem N.

A entrada N é fornecida em uma única linha, as entradas são terminadas por EOF.

Entrada

4
3
1
2

Resultado

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}

Restrições

  • O número de entradas não excederia 10 ^ 6 valores
  • Você pode usar qualquer idioma de sua escolha
  • A solução mais curta vence!

Isso vai ficar loooong ..... a saída que eu quero dizer.
st0le

N = 0 é permitido?
Eelvex 26/03

4
O que há com o »(I)« no título?
31411 Joey

2
@ Joey: Hmm. agora existe uma Farey Sequence (II). Deve ser a primeira edição! :-) #
3116 mellamokb

11
@mellamokb: Bem, esse é um desafio de código, portanto, nenhum conflito de título, em nenhum caso. Mas sim, esse tipo de resposta à minha pergunta.
Joey

Respostas:


5

J, 96

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

( /:~~.,(%~}:\)i.>:x:yfornece a lista; o restante é de E / S e formatação (com estilo incorreto))

Por exemplo:

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}  

Editar% s

  • (114 → 106) Anexo mais claro,
  • (106 → 105) Limite [:para At@
  • (105 → 101) Excluir ":conversão supérflua
  • (101 → 99) Use o infix \para a lista
  • (99 → 96)

Eu entendo |value error: rplc. Tem certeza de que não o fez load 'strings'anteriormente e se esqueceu disso?
precisa

11
@ Jess: absolutamente. Eu (quase) nunca uso 'strings'. Eu apenas uso o ambiente linux-j-7.01 padrão.
Eelvex 29/03

Ugh ... mudei para o j602 wde agora posso precisar voltar. :)
Jesse Millikan

3

Lisp comum, 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)'<)))

(novas linhas não são necessárias)

Muito brutal, mas idiomas com racionais nativos são um convite para isso.

Ungolfed com comentários:

                                        ; 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 caracteres

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, mas você tem certeza de que será rápido para 10 ^ 6 número de entradas?
Quixotic

@Debanjan No. Seria muito lento para 10 ^ 6 entradas. É linear em complexidade (em termos do número de termos), no entanto.
FR0DDY 26/03

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 ou similar ( wd). Entrada em stdin, saída em stdout.

Ainda intrigante sobre como jogar golfe no código de saída, que tem aproximadamente 100 caracteres.

Edit: (156-> 135) Tacit-> explícito para longas cadeias de verbos monádicos, menos geração de listas braindead

Edit: (135-> 117) Encontrado arrasado . Demorou o suficiente. Manuseio de cordas comutadas.

Edit: (117-> 112) Maneira ligeiramente menos desafiadora de excluir frações acima de 1. Abrir desnecessariamente.


Talvez você possa omitir um dos seus dois x:s?
Eelvex 30/03/11

@Eelvex: O da esquerda é 2 & x :, por exemplo, divide um número racional em numerador e denominador.
precisa

oic. Pena ... :(
Eelvex 30/03

2

Golfscript (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*', '}}"

Eu acho que você deve emitir "0/1" e "1/1" em vez de "0" e "1", respectivamente. Além disso, isso funciona apenas para o ruby ​​1.9?
Eelvex 27/03

11
@Eelvex: Ele gera 0/1 e 1/1 no meu sistema. E sim, requer 1,9 (por causa dos caracteres literais).
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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.