Code-Golf: sequenza Farey (I)


10

Sfida

In questa attività ti verrà assegnato un numero intero N (inferiore a 10 ^ 5), in uscita la sequenza Farey dell'ordine N.

L'ingresso N è dato su una sola riga, gli ingressi sono terminati da EOF.

Ingresso

4
3
1
2

Produzione

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}

vincoli

  • Il numero di ingressi non supererebbe i valori 10 ^ 6
  • Puoi usare qualsiasi lingua tu scelga
  • Vince la soluzione più breve!

Questo andrà avanti ..... l'output intendo.
via

N = 0 è consentito?
Eelvex,

4
Cosa c'è con »(I)« nel titolo?
Joey,

2
@Joey: Hmm. c'è una Farey Sequence (II) ora. Deve essere la prima edizione! :-)
mellamokb

1
@mellamokb: Beh, quella è una sfida al codice, comunque, quindi nessun scontro tra titoli in ogni caso. Ma sì, questo tipo di risposte risponde alla mia domanda.
Joey,

Risposte:


5

J, 96

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

( /:~~.,(%~}:\)i.>:x:yfornisce l'elenco; il resto è I / O e formattazione (con cattivo stile))

Per esempio:

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}  

Le modifiche

  • (114 → 106) Aggiunta più chiara,
  • (106 → 105) Da Cap [:a At@
  • (105 → 101) Elimina la ":conversione superflua
  • (101 → 99) Usa infix \per l'elenco
  • (99 → 96)

Ho capito |value error: rplc. Sei sicuro di non averlo fatto load 'strings'prima nella sessione e te ne dimentichi?
Jesse Millikan,

1
@Jesse: assolutamente. Io (quasi) non lo uso mai 'strings'. Uso solo l'ambiente linux-j-7.01 predefinito.
Eelvex,

Ugh ... sono passato a j602 wde ora potrebbe essere necessario tornare indietro. :)
Jesse Millikan,

3

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

(newline non necessario)

Molto brutale, ma le lingue con razionali native sono un invito a questo.

Ungolfed con commenti:

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

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, ma sei sicuro che questo sarà veloce per 10 ^ 6 numero di ingressi?
Chisciotte,

@Debanjan No. Sarebbe molto lento per 10 ^ 6 ingressi. È lineare nella complessità (in termini di numero di termini), tuttavia.
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 o simile ( wd). Input su stdin, output su stdout.

Ancora sconcertante su come giocare a golf il codice di output, che è di circa 100 caratteri.

Modifica: (156-> 135) Tacito-> esplicito per lunghe catene di verbi monadici, meno generazione di liste di Braindead

Modifica: (135-> 117) Trovato raze . Mi ha preso abbastanza a lungo. Gestione della stringa cambiata.

Modifica: (117-> 112) Modo leggermente meno frenato per escludere le frazioni sopra 1. Apertura non necessaria.


Forse puoi omettere una delle tue due x:s?
Eelvex,

@Eelvex: quello sinistro è 2 & x: ad es. Dividere un numero razionale in numeratore e denominatore.
Jesse Millikan,

OIC. Peccato ... :(
Eelvex,

2

Golfscript (101)

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

2

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

Penso che dovresti produrre rispettivamente "0/1" e "1/1" invece di "0" e "1". Inoltre, funziona solo con ruby ​​1.9?
Eelvex,

1
@Eelvex: emette 0/1 e 1/1 sul mio sistema. E sì, richiede 1,9 (a causa dei caratteri letterali del personaggio).
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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.