Afficher les fractions continues

9

Votre défi est de convertir une fraction en sa forme de fraction continue.

Entrée : La fraction peut être entrée dans n'importe quel format, y compris (mais sans s'y limiter)

  • chaîne: "7/16"
  • liste: {7, 16}, (7, 16), [7, 16]
  • paire ordonnée simple: 7 16
  • fonction: f [7,16]

Sortie : Une fraction continue, en 2D, avec des barres de fraction horizontale séparant le numérateur du dénominateur. Seules les fractions continues avec des numérateurs égaux à 1 sont valides. Il n'est pas nécessaire de faire varier la taille de la police en fonction de la profondeur. Un zéro non significatif (pour les fractions appropriées) est facultatif.

Profondeur : votre code doit pouvoir afficher au moins 8 niveaux de profondeur.

Critère gagnant : le code le plus court gagne. Vous devez inclure plusieurs cas de test montrant l'entrée et la sortie.

Exemples de test (entrée suivie d'une sortie)

5/4 cinq quarts

5/3 cinq tiers

5/7 cinq septièmes

9/16 neuf seizièmes

89/150 quatre-vingt-neuf deux cent cinquantième

DavidC
la source
quels sont les critères de profondeur à laquelle vous devez aller? par exemple, pourquoi ne pouvons-nous pas simplement faire 0 + 89 / 250pour le dernier?
Poignée de porte
Je présupposais que le seul numérateur acceptable était 1. J'ajouterai cela.
DavidC
ah d'accord, je n'ai pas beaucoup de connaissances en mathématiques :) Wikipedia a aidé. Que diriez-vous des langues qui ne peuvent pas afficher les choses dans ce format? Est-ce que ça va si on fait quelque chose comme ça 0 + 1 / (1 + 1 / (1 + 1 / (2 + 1 / (3 + 1 / (1 + 1 / (1 + 1 / (2)))))))? Et sans les parenthèses? Ou si nous affichons simplement les chiffres bleus, comme 0 1 1 2 5 1 1 2?
Poignée de porte
1
Votre notation semble être mathématiquement correcte. Mais le point principal du défi est de trouver un moyen d'afficher la fraction sous forme de colonne et de ligne (que j'ai appelée plus largement 2D).
DavidC

Réponses:

5

Mathematica, 40 36 caractères

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

Exemple:

f[89/150]

Production:

Production

alephalpha
la source
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]

Tester:

$ 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

Fondamentalement, un port de réponse de la boîte à pain. Sortie plus sûre.

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)

Tester:

$ python cfrac2.py
(98,15)
      1
 6 + ---
           1
      1 + ---
                1
           1 + ---
                7
shane
la source
1
+1 Bonne idée! Bien qu'il y ait des problèmes si des nombres supérieurs à 9 sont produits. Vérifiez, par exemple, 40,3en entrée.
Sven Hohenstein
7

XSLT 1.0

Je pensais que ce serait bien d'afficher les fractions avec HTML, voici donc une solution XSLT.

<?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>

Pour le tester, enregistrez le xslt en tant que fraction.xslt et ouvrez le fichier suivant dans IE:

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

89/150

Danko Durbić
la source
J'AIME cette solution. Bon travail!
Cruncher
4

Ruby, 175 (avec art ASCII) ou 47 (sans)

Sans art ASCII, 47

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

Étant donné que Ruby ne peut pas vraiment faire de graphiques comme ça, je viens de sortir les nombres bleus dans vos exemples.

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

Avec 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, cet art ASCII a pris beaucoup de code, et j'étais même maléfique et j'utilisais rescue 0: P Sample:

c:\a\ruby>cont
[89,150]
0+      1
  -------------
  1+     1
    -----------
    1+    1
      ---------
      2+   1
        -------
        5+  1
          -----
          1+ 1
            ---
            1+1
              -
              2
Poignée de porte
la source
@DavidCarraher Ok, alors ça marche. Modifié
Poignée de porte
Vous affichez les quotients partiels. Bien qu'ils soient essentiels pour formuler une fraction continue, ils ne sont qu'une partie de l'exigence.
DavidC
@DavidCarraher Je suppose que je pourrais essayer une sorte d'art ASCII ... il n'y a vraiment pas beaucoup de moyen de le faire dans Ruby.
Poignée de porte
@DavidCarraher D'accord, je dois partir, mais je vais bientôt travailler sur une représentation ASCII de la fraction.
Poignée de porte
Génial. J'ai hâte de voir les résultats de vos efforts.
DavidC
4

Cahier Sage, 80

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

Voici ntout ce que Sage peut approximer par un nombre rationnel / à virgule flottante. La précision par défaut est de 53 bits, sauf si na Rational. Je dois aimer MathJax.

entrez la description de l'image ici

boothby
la source
4

C, 119 caractères

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);}

Voici quelques exemples de sortie:

$ 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

Bien que la ligne de fraction tronquée ne soit pas aussi jolie que certains des exemples ici, je tiens à souligner qu'il s'agissait d'une technique courante pour formater les fractions continues à l'époque où les ordinateurs de bureau n'étaient pas omniprésents.


D'accord, voici une version beaucoup plus longue (247 caractères) qui fait un formatage complet de la sortie:

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]);}

Quelques exemples de sa sortie:

$ 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 
boite à pain
la source
Wow, nous pouvons avoir un gagnant dans l'une des langues les moins susceptibles de gagner un CG! Impressionnant! :-)
Poignée de porte
3

APL (78)

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

Exemple:

      {(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 
marinus
la source
2

Mathematica, 77

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

Je viens d'apprendre Mathematica pour ça. Prend un programme étonnamment long pour ce faire.

TwiNight
la source
2

Perl 128 114 caractères

($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"

Mais comme cela utilise le placement de la console, vous devez effacer la console dans l'ordre avant de l'exécuter:

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 '

production:

       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

Premier message: 128 caractères

($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",$=

Divisé pour couper et coller :

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 '

Rendra:

            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

Même chose avec 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

Image en latex

F. Hauri
la source
1

Perl: 140 , 133 121 caractères

($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"

exemple:
#perl fraction.pl
5
7

   1
0+---
    1
 1+---
     1
  2+---
     2
Arvinds
la source
0

Razor Leaf sur 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)

L'invite fait vraiment mal là-bas…Oh, tu veux dire que je peux choisir? D'accord, c'est une liste. Quoi qu'il en soit, bonne chance pour que cela fonctionne.

Ry-
la source
0

Langue de Game Maker (Script), 61 71

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

Compilez avec toutes les variables non initialisées au format 0.

Timtech
la source
1
cela produit-il quelque chose? aussi, cela semble être faux; vous ajoutez une chaîne à un nombre. l'avez-vous essayé?
Poignée de porte
@ Doorknob Vous avez raison, je voulais donner ça à c.
Timtech
Il ne produit toujours rien ...
Poignée de porte
@ Doorknob Oui, cela ne renvoie rien, et j'ai eu quelques erreurs de syntaxe. Il devrait renvoyer la valeur correcte maintenant.
Timtech
0

En supposant que les nombres entrés sont co-premiers, appelez cette fonction de processus avec numérateur et dénominateur. Il peut aller à n'importe quelle profondeur jusqu'à ce qu'il trouve la forme continue, sans limite

Écrit en JAVA (238 caractères)

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));
}

processus (89 150);

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

processus (973,13421);

0 + 1
    ------
    13 + 1
        ------
        1 + 1
            ------
            3 + 1
                ------
                1 + 1
                    ------
                    5 + 1
                        ------
                        3 + 1
                            ------
                            1 + 1
                                ------
                                1 + 1
                                    ------
                                    4
Anurag
la source
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
tmartin
la source