Code-Golf: Tarifsequenz (I)


10

Herausforderung

In dieser Aufgabe würden Sie eine ganze Zahl N (weniger als 10 ^ 5) erhalten und die Farey-Sequenz der Ordnung N ausgeben .

Der Eingang N ist in einer einzigen Zeile angegeben, die Eingänge werden durch EOF abgeschlossen.

Eingang

4
3
1
2

Ausgabe

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}

Einschränkungen

  • Die Anzahl der Eingänge würde 10 ^ 6 Werte nicht überschreiten
  • Sie können jede Sprache Ihrer Wahl verwenden
  • Kürzeste Lösung gewinnt!

Dies wird sehr lang ..... die Ausgabe meine ich.
st0le

Ist N = 0 erlaubt?
Eelvex

4
Was ist mit dem »(I)« im Titel?
Joey

2
@ Joey: Hmm. Es gibt jetzt eine Farey-Sequenz (II). Muss Erstausgabe sein! :-)
Mellamokb

1
@mellamokb: Nun, das ist allerdings eine Code-Herausforderung, also auf keinen Fall ein Titelkonflikt. Aber ja, diese Art beantwortet meine Frage.
Joey

Antworten:


5

J, 96

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

( /:~~.,(%~}:\)i.>:x:ygibt die Liste an; der Rest ist E / A und Formatierung (mit schlechtem Stil))

Z.B:

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}  

Bearbeitungen

  • (114 → 106) Klareres Anhängen,
  • (106 → 105) Kappe [:auf At@
  • (105 → 101) Überflüssige ":Konvertierung löschen
  • (101 → 99) Verwenden Sie das Infix \für die Liste
  • (99 → 96)

Ich verstehe |value error: rplc. Bist du sicher, dass du es nicht load 'strings'früher in der Sitzung getan hast und es vergessen hast ?
Jesse Millikan

1
@ Jesse: absolut. Ich benutze (fast) nie 'strings'. Ich benutze nur die Standard-Linux-j-7.01-Umgebung.
Eelvex

Ugh ... Ich habe für j602 gewechselt wdund jetzt muss ich möglicherweise zurück wechseln. :)
Jesse Millikan

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)'<)))

(Zeilenumbrüche nicht erforderlich)

Sehr brutal, aber Sprachen mit einheimischen Begründungen sind eine Einladung dazu.

Ungolfed mit Kommentaren:

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

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, aber sind Sie sicher, dass dies für 10 ^ 6 Eingänge schnell sein wird?
Quixotic

@Debanjan Nein. Es wäre sehr langsam für 10 ^ 6 Eingänge. Die Komplexität ist jedoch linear (in Bezug auf die Anzahl der Begriffe).
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 oder ähnliches ( wd). Eingabe auf stdin, Ausgabe auf stdout.

Immer noch rätselhaft, wie man den Ausgabecode spielt, der aus 100 Zeichen besteht.

Edit: (156-> 135) Tacit-> explizit für lange monadische Verbketten, weniger Braindead-Listengenerierung

Bearbeiten: (135-> 117) Raze gefunden . Hat lange genug gedauert. String-Handling umgeschaltet.

Bearbeiten: (117-> 112) Etwas weniger Kopf, um Brüche über 1 auszuschließen. Unnötiges Öffnen.


Vielleicht kannst du eines deiner beiden weglassen x:?
Eelvex

@Eelvex: Die linke ist 2 & x:, z. B. eine rationale Zahl in Zähler und Nenner aufteilen.
Jesse Millikan

oic. Schade ... :(
Eelvex

2

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

Ich denke, Sie sollten "0/1" und "1/1" anstelle von "0" bzw. "1" ausgeben. Funktioniert dies auch nur für Ruby 1.9?
Eelvex

1
@Eelvex: Es gibt 0/1 und 1/1 auf meinem System aus. Und ja, es erfordert 1,9 (wegen der Zeichenliterale).
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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.