Fortsetzung der Brüche anzeigen


9

Ihre Herausforderung besteht darin, einen Bruch in seine fortgesetzte Bruchform umzuwandeln.

Eingabe : Der Bruch kann in einem beliebigen Format eingegeben werden, einschließlich (aber nicht beschränkt auf)

  • Zeichenfolge: "7/16"
  • Liste: {7, 16}, (7, 16), [7, 16]
  • einfach geordnetes Paar: 7 16
  • Funktion: f [7,16]

Ausgabe : Ein fortgesetzter Bruch in 2D mit horizontalen Bruchbalken, die den Zähler vom Nenner trennen. Es sind nur fortgesetzte Brüche mit Zählern gleich 1 gültig. Es ist nicht erforderlich, die Schriftgröße je nach Tiefe zu variieren. Eine führende Null (für richtige Brüche) ist optional.

Tiefe : Ihr Code muss mindestens 8 Tiefenstufen anzeigen können.

Gewinnkriterium : Der kürzeste Code gewinnt. Sie müssen mehrere Testfälle einschließen, die die Eingabe und Ausgabe anzeigen.

Testbeispiele (Eingabe gefolgt von Ausgabe)

5/4 fünf Viertel

5/3 fünf Drittel

5/7 fünf Siebtel

9/16 neun Sechzehntel

89/150 neunundachtzig zweihundertfünfzig


Was sind die Kriterien dafür, wie tief Sie gehen müssen? Warum können wir zum Beispiel nicht einfach 0 + 89 / 250das letzte tun ?
Türknauf

Ich nahm an, dass der einzig akzeptable Zähler 1 war. Ich werde das hinzufügen.
DavidC

ah okay, habe nicht viel mathematischen Hintergrund :) Wikipedia hat geholfen. Wie wäre es mit Sprachen, die Dinge in diesem Format nicht anzeigen können? Ist es okay, wenn wir so etwas machen 0 + 1 / (1 + 1 / (1 + 1 / (2 + 1 / (3 + 1 / (1 + 1 / (1 + 1 / (2)))))))? Was ist ohne die Klammer? Oder wenn wir nur die blauen Zahlen anzeigen, wie 0 1 1 2 5 1 1 2?
Türknauf

1
Ihre Notation scheint mathematisch korrekt zu sein. Der Hauptpunkt der Herausforderung besteht jedoch darin, einen Weg zu finden, um den Bruch im Spalten- und Zeilenformat anzuzeigen (das ich oben lose als 2D bezeichnet habe).
DavidC

Antworten:


5

Mathematica, 40 36 Zeichen

f=If[⌊#⌋≠#,⌊#⌋+"1"/#0[1/(#-⌊#⌋)],#]&

Beispiel:

f[89/150]

Ausgabe:

Ausgabe


10

Python 2, 158 155 147 142

a,b=input()
c=[]
while b:c+=[a/b];a,b=b,a%b
n=len(c)
while b<n-1:print'  '*(n+b),'1\n',' '*4*b,c[b],'+','-'*(4*(n-b)-7);b+=1
print' '*4*b,c[b]

Prüfung:

$ python cfrac.py
(89,150)
                 1
 0 + -------------------------
                   1
     1 + ---------------------
                     1
         1 + -----------------
                       1
             2 + -------------
                         1
                 5 + ---------
                           1
                     1 + -----
                             1
                         1 + -
                             2

Python 2, alt. Version, 95

Grundsätzlich eine Portierung der Antwort von Breadbox. Sicherere Ausgabe.

a,b=input();i=2
while a%b:print'%*d\n%*d + ---'%(i+5,1,i,a/b);a,b=b,a%b;i+=5
print'%*d'%(i,a/b)

Prüfung:

$ python cfrac2.py
(98,15)
      1
 6 + ---
           1
      1 + ---
                1
           1 + ---
                7

1
+1 Gute Idee! Es gibt jedoch Probleme, wenn Zahlen größer als 9 erzeugt werden. Überprüfen Sie zB 40,3als Eingabe.
Sven Hohenstein

7

XSLT 1.0

Ich dachte, es wäre schön, die Brüche mit HTML anzuzeigen. Hier ist eine XSLT-Lösung.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                              xmlns:msxsl="urn:schemas-microsoft-com:xslt" >
  <xsl:template match="/f">
    <xsl:variable name="c" select="floor(@a div @b)"/>
    <xsl:variable name="next">
      <f a="{@b}" b="{@a mod @b}"/>
    </xsl:variable>
    <table>
      <tr>
        <td valign="top" rowspan="2" style="padding-top:12px">
          <xsl:value-of select="$c"/>+
        </td>
        <td align="center" style="border-bottom:1px solid black">1</td>
      </tr>
      <tr>
        <td>
          <xsl:apply-templates select="msxsl:node-set($next)"/>
        </td>
      </tr>
    </table>
  </xsl:template>
  <xsl:template match="/f[@a mod @b=0]">
    <xsl:value-of select="@a div @b"/>
  </xsl:template>
</xsl:stylesheet>

Speichern Sie zum Testen die xslt als fraktion.xslt und öffnen Sie die folgende Datei im IE:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet  href="fraction.xslt" type="text/xsl"?>
<f a="89" b="150"/>

89/150


Ich liebe diese Lösung. Gute Arbeit!
Cruncher

4

Ruby, 175 (mit ASCII-Grafik) oder 47 (ohne)

Ohne ASCII-Kunst 47

n,d=eval gets
while d!=0
puts n/d
n,d=d,n%d
end

Da Ruby solche Grafiken nicht wirklich erstellen kann, gebe ich nur die blauen Zahlen in Ihren Beispielen aus.

c:\a\ruby>cont
[5,4]
1
4

c:\a\ruby>cont
[5,3]
1
1
2

c:\a\ruby>cont
[5,7]
0
1
2
2

c:\a\ruby>cont
[9,16]
0
1
1
3
2

c:\a\ruby>cont
[89,150]
0
1
1
2
5
1
1
2

Mit ASCII Art, 181 178 175

n,d=eval gets
a=[]
n,d=d,n%d,a.push(n/d)while d!=0
i=0
j=2*a.size-3
k=a.size-2
a.map{|x|puts' '*i+"#{x}+"+' '*k+?1
i+=2
k-=1
puts' '*i+?-*j
j-=2}rescue 0
puts' '*i+a.last.to_s

Wow, diese ASCII-Kunst hat viel Code in Anspruch genommen, und ich war sogar böse und benutzte rescue 0: P Beispiel:

c:\a\ruby>cont
[89,150]
0+      1
  -------------
  1+     1
    -----------
    1+    1
      ---------
      2+   1
        -------
        5+  1
          -----
          1+ 1
            ---
            1+1
              -
              2

@ DavidCarraher Ok, dann funktioniert es. Bearbeitet
Türknauf

Sie geben die Teilquotienten aus. Obwohl sie für die Formulierung einer fortgesetzten Fraktion wesentlich sind, sind sie nur ein Teil der Anforderung.
DavidC

@ DavidCarraher Ich nehme an, ich könnte eine Art ASCII-Kunst ausprobieren ... in Ruby gibt es wirklich nicht viel Möglichkeiten, dies zu tun.
Türknauf

@DavidCarraher Okay, ich muss gehen, aber ich werde bald daran arbeiten, eine ASCII-Darstellung des Bruches zu erstellen.
Türknauf

Groß. Ich freue mich auf die Ergebnisse Ihrer Bemühungen.
DavidC

4

Salbei Notizbuch, 80

c=continued_fraction(n)
LatexExpr('{'+'+\\frac{1}{'.join(map(str,c))+'}'*len(c))

Hier nkann alles sein, was Sage durch eine rationale / Gleitkommazahl approximieren kann. Die Standardgenauigkeit beträgt 53 Bit, sofern nicht na Rational. Ich muss MathJax lieben.

Geben Sie hier die Bildbeschreibung ein


4

C, 119 Zeichen

n,d,r;main(i){for(scanf("%d%d",&n,&d);r=n%d;n=d,d=r,i+=5)
printf("%*d\n%*d + ---\n",i+5,1,i,n/d);printf("%*d\n",i,n/d);}

Hier einige Beispiele für die Ausgabe:

$ echo 15 98 | ./cfrac
     1
0 + ---
          1
     6 + ---
               1
          1 + ---
                    1
               1 + ---
                    7
$ echo 98 15 | ./cfrac
     1
6 + ---
          1
     1 + ---
               1
          1 + ---
               7
$ echo 98 14 | ./cfrac
7

Obwohl die abgeschnittene Bruchlinie nicht so hübsch aussieht wie einige der Beispiele hier, möchte ich darauf hinweisen, dass dies eine übliche Technik zum Formatieren fortgesetzter Brüche in den Tagen war, bevor Desktop-Computer allgegenwärtig waren.


Okay, hier ist eine viel längere Version (247 Zeichen), die die Ausgabe vollständig formatiert:

c,h,i,j,n,d,w[99];char s[99][99];main(r){for(scanf("%d%d",&n,&r);d=r;n=d)
h+=w[c++]=sprintf(s[c],"%d + ",n/d,r=n%d);for(;j+=w[i],i<c-1;puts(""))
for(printf("%*d\n%*s",j+(r=h-j)/2,1,j,s[i++]);--r;printf("-"));
s[i][w[i]-2]=0;printf("%*s\n",j-1,s[i]);}

Einige Beispiele für seine Ausgabe:

$ echo 89 150 | ./cfr
                 1
0 + ---------------------------
                   1
    1 + -----------------------
                     1
        1 + -------------------
                       1
            2 + ---------------
                         1
                5 + -----------
                           1
                    1 + -------
                             1
                        1 + ---
                             2 
$ echo 151 8919829 | ./cfr
                 1
0 + ----------------------------
                     1
    59071 + --------------------
                       1
            1 + ----------------
                         1
                2 + ------------
                           1
                    1 + --------
                             1
                        1 + ----
                             21 
$ echo 293993561 26142953 | ./cfr
               1
11 + ---------------------
                 1
     4 + -----------------
                   1
         14 + ------------
                       1
              4410 + -----
                      104 

Wow, wir haben vielleicht einen Gewinner in einer der am wenigsten wahrscheinlichen Sprachen, der einen CG gewinnt! Beeindruckend! :-)
Türknauf

3

APL (78)

{(v↑' '⍪⍉⍪⍕⍺),(' +'↑⍨v←⊃⍴x),x←('1'↑⍨⊃⌽⍴v)⍪v←'─'⍪⍕⍪⍵}/⊃{⍵≤1:⍺⋄a w←0⍵⊤⍺⋄a,⍵∇w}/⎕

Beispiel:

      {(v↑' '⍪⍉⍪⍕⍺),(' +'↑⍨v←⊃⍴x),x←('1'↑⍨⊃⌽⍴v)⍪v←'─'⍪⍕⍪⍵}/⊃{⍵≤1:⍺⋄a w←0⍵⊤⍺⋄a,⍵∇w}/⎕
⎕:
      89 150
   1             
 0+───────────── 
     1           
   1+─────────── 
       1         
     1+───────── 
         1       
       2+─────── 
           1     
         5+───── 
             1   
           1+─── 
               1 
             1+─ 
               2 

2

Mathematica, 77

Fold[#2+1/ToString[#1]&,First[#1],Rest[#1]]&[Reverse[ContinuedFraction[#1]]]&

Habe gerade Mathematica dafür gelernt. Dazu ist ein überraschend langes Programm erforderlich.


2

Perl 128 114 Zeichen

($a,$b)=split;$_=" "x7;until($b<2){$==$a/$b;($a,$b)=($b,$a%$b);$_.="1\e[B\e[7D$= + ---------\e[B\e[4D"}$_.="$a\n"

Da hier jedoch die Konsolenplatzierung verwendet wird, müssen Sie die Konsole vor dem Ausführen in der richtigen Reihenfolge löschen:

clear
perl -pe '($a,$b)=split;$_=" "x7;until($b<2){$==$a/$b;($a,$b)=($b,$a%$b);$_.=
"1\e[B\e[7D$= + ---------\e[B\e[4D"}$_.="$a\n"' <<<$'5 7 \n189 53 \n9 16 \n89 150 '

Ausgabe:

       1
 0 + ---------
          1
    1 + ---------
             1
       2 + ---------
                2
       1
 3 + ---------
          1
    1 + ---------
             1
       1 + ---------
                1
          3 + ---------
                   1
             3 + ---------
                      2
       1
 0 + ---------
          1
    1 + ---------
             1
       1 + ---------
                1
          3 + ---------
                   2
       1
 0 + ---------
          1
    1 + ---------
             1
       1 + ---------
                1
          2 + ---------
                   1
             5 + ---------
                      1
                1 + ---------
                         1
                   1 + ---------
                            2

Erster Beitrag: 128 Zeichen

($a,$b)=split;$c=7;while($b>1){$==$a/$b;($a,$b)=($b,$a%$b);printf"%s1\n%${c}d + %s\n"," "x($c+=5),$=,"-"x9}printf" %${c}d\n",$=

Für Cut'n Paste aufgeteilt :

perl -ne '($a,$b)=split;$c=7;while($b>1){$==$a/$b;($a,$b)=($b,$a%$b);printf
"%s1\n%${c}d + %s\n"," "x($c+=5),$=,"-"x9}printf" %${c}d\n",$a' \
    <<<$'5 7 \n189 53 \n9 16 \n89 150 '

Wird rendern:

            1
      0 + ---------
                 1
           1 + ---------
                      1
                2 + ---------
                      2
            1
      3 + ---------
                 1
           1 + ---------
                      1
                1 + ---------
                           1
                     3 + ---------
                                1
                          3 + ---------
                                2
            1
      0 + ---------
                 1
           1 + ---------
                      1
                1 + ---------
                           1
                     3 + ---------
                           2
            1
      0 + ---------
                 1
           1 + ---------
                      1
                1 + ---------
                           1
                     2 + ---------
                                1
                          5 + ---------
                                     1
                               1 + ---------
                                          1
                                    1 + ---------
                                          2

Gleiches gilt für LaTeX:

perl -ne 'END{print "\\end{document}\n";};BEGIN{print "\\documentclass{article}\\pagestyle".
  "{empty}\\begin{document}\n";};($a,$b)=split;$c="";print "\$ $a / $b = ";while($b>1){$==$a
  /$b;($a,$b)=($b,$a%$b);printf"%s + \\frac{1}{",$=;$c.="}";}printf"%d%s\$\n\n",$a,$c'  \
   <<<$'5 7 \n189 53 \n9 16 \n89 150 ' >fracts.tex

pslatex fracts.tex 

dvips -f -ta4 <fracts.dvi |
  gs -sDEVICE=pnmraw -r600 -sOutputFile=- -q -dNOPAUSE - -c quit |
  pnmcrop |
  pnmscale .3 |
  pnmtopng >fracts.png

Latexbild


1

Perl: 140 , 133, 121 Zeichen

($a,$b)=<STDIN>;while($b>1)
{$g=$i+++4;print" "x$g."1\n"." "x$i,int($a/$b)."+---\n";($a=$b)=($b,$a%$b)}
print" "x$g."$a\n"

Beispiel:
#perlfraktion.pl
5
7

   1
0+---
    1
 1+---
     1
  2+---
     2

0

Rasiermesserblatt auf Firefox, 108 127

%r=(i,n,d)=>
    mn"#{n/d|0}"
    if i<8&&n%d
        mo"+"
        mfrac
            mn"1"
            me%r(i+1,d,n%d)
math%[a,b]=data;r(0,a,b)

Die Aufforderung tut dort wirklich weh ...Oh, du meinst, ich darf wählen? Okay, es ist eine Liste. Wie auch immer, viel Glück beim Laufen.


0

Game Maker Language (Skript), 61 71

a=argument0;b=argument1;while b!=0{c+=string(a/b)a,b=b,a mod b}return c

Kompilieren Sie mit allen nicht initialisierten Variablen als 0.


1
Gibt dies etwas aus? auch scheint es falsch zu sein; Sie hängen eine Zeichenfolge an eine Zahl an. Hast Du es versucht?
Türknauf

@ Doorknob Du hast recht, das wollte ich geben c.
Timtech

Es gibt immer noch nichts aus ...
Türknauf

@ Doorknob Ja, es gibt nichts zurück und ich hatte einige Syntaxfehler. Es sollte jetzt den richtigen Wert zurückgeben.
Timtech

0

Nehmen Sie diese Prozessfunktion mit Zähler und Nenner an, indem Sie die eingegebenen Zahlen als Co-Primzahl annehmen. Es kann in jede Tiefe gehen, bis es die fortgesetzte Form findet, keine Begrenzung

Geschrieben in JAVA (238 Zeichen)

String space = "";
private void process(int n, int d) {
    System.out.println(space+(n/d)+" + 1");
    space += "    ";
    System.out.println(space+"------");
    if((n % d)==1)
        System.out.println(space+d);
    else
        process(d,(n % d));
}

Verfahren (89, 150);

0 + 1
    ------
    1 + 1
        ------
        1 + 1
            ------
            2 + 1
                ------
                5 + 1
                    ------
                    1 + 1
                        ------
                        1 + 1
                            ------
                            2

Verfahren (973, 13421);

0 + 1
    ------
    13 + 1
        ------
        1 + 1
            ------
            3 + 1
                ------
                1 + 1
                    ------
                    5 + 1
                        ------
                        3 + 1
                            ------
                            1 + 1
                                ------
                                1 + 1
                                    ------
                                    4

0

K, 136

{-1@((!#j)#\:" "),'j:(,/{(x,"+ 1";(" ",(2*y)#"-"),"\t")}'[a;1+|!#a:$-1_i]),$*|i:*:'1_{(i;x 2;x[1]-(i:x[1]div x 2)*x@2)}\[{~0~*|x};1,x];}

.

k)f:{-1@((!#j)#\:" "),'j:(,/{(x,"+ 1";(" ",(2*y)#"-"),"\t")}'[a;1+|!#a:$-1_i]),$*|i:*:'1_{(i;x 2;x[1]-(i:x[1]div x 2)*x@2)}\[{~0~*|x};1,x];}
k)f[5 4]
1+ 1
  --
  4

k)f[5 3]
1+ 1
  ----
  1+ 1
    --
    2

k)f[5 7]
0+ 1
  ------
  1+ 1
    ----
    2+ 1
      --
      2

k)f[9 16]
0+ 1
  --------
  1+ 1
    ------
    1+ 1
      ----
      3+ 1
        --
        2

k)f[89 150]
0+ 1
  --------------
  1+ 1
    ------------
    1+ 1
      ----------
      2+ 1
        --------
        5+ 1
          ------
          1+ 1
            ----
            1+ 1
              --
              2
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.