Mostrar fracciones continuas

9

Su desafío es convertir una fracción en su forma de fracción continua.

Entrada : la fracción se puede ingresar en cualquier formato, incluido (pero no limitado a)

  • cadena: "7/16"
  • lista: {7, 16}, (7, 16), [7, 16]
  • par ordenado simple: 7 16
  • función: f [7,16]

Salida : una fracción continua, en 2D, con barras de fracción horizontales que separan el numerador del denominador. Solo las fracciones continuas con numeradores iguales a 1 son válidas. No es necesario hacer que el tamaño de la fuente varíe según la profundidad. Un cero a la izquierda (para fracciones apropiadas) es opcional.

Profundidad : su código debe poder mostrar al menos 8 niveles de profundidad.

Criterio ganador : el código más corto gana. Debe incluir varios casos de prueba que muestren entrada y salida.

Ejemplos de prueba (entrada seguida de salida)

5/4 cinco cuartos

5/3 cinco tercios

5/7 cinco séptimos

16/9 nueve dieciseisavos

89/150 ochenta nueve doscientos cincuenta

DavidC
fuente
¿Cuál es el criterio de cuán profundo debes ir? por ejemplo, ¿por qué no podemos hacer 0 + 89 / 250lo último?
Pomo de la puerta
Estaba presuponiendo que el único numerador aceptable era 1. Agregaré eso.
DavidC
ah bien, no tengo muchos conocimientos matemáticos :) Wikipedia ayudó. ¿Qué hay de los idiomas que no pueden mostrar cosas en este formato? ¿Está bien si hacemos algo así 0 + 1 / (1 + 1 / (1 + 1 / (2 + 1 / (3 + 1 / (1 + 1 / (1 + 1 / (2)))))))? ¿Qué pasa sin el paréntesis? ¿O si solo mostramos los números azules, como 0 1 1 2 5 1 1 2?
Pomo de la puerta
1
Su notación parece ser matemáticamente correcta. Pero el punto principal del desafío es encontrar una manera de mostrar la fracción en formato de columna y fila (a lo que me referí más arriba como 2D).
DavidC

Respuestas:

5

Mathematica, 40 36 caracteres

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

Ejemplo:

f[89/150]

Salida:

Salida

alephalpha
fuente
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]

Prueba:

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

Python 2, alt. versión, 95

Básicamente un puerto de respuesta de breadbox. Salida más segura.

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)

Prueba:

$ python cfrac2.py
(98,15)
      1
 6 + ---
           1
      1 + ---
                1
           1 + ---
                7
shane
fuente
1
+1 ¡Buena idea! Aunque hay problemas si se producen números mayores que 9. Verifique, por ejemplo, 40,3como entrada.
Sven Hohenstein
7

XSLT 1.0

Pensé que sería bueno mostrar las fracciones con HTML, así que aquí hay una solución 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>

Para probarlo, guarde el xslt como fracción.xslt y abra el siguiente archivo en 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ć
fuente
ME ENCANTA esta solución. ¡Buen trabajo!
Cruncher
4

Ruby, 175 (con arte ASCII) o 47 (sin)

Sin arte ASCII, 47

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

Como Ruby realmente no puede hacer gráficos como ese, acabo de mostrar los números azules en sus ejemplos.

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

Con 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, ese arte ASCII tomó mucho código, e incluso estaba siendo malvado y estaba usando 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
Pomo de la puerta
fuente
@DavidCarraher Ok, entonces funciona. Editado
Pomo de la puerta
Sacas los cocientes parciales. Aunque son esenciales para formular una fracción continua, son solo una parte del requisito.
DavidC
@DavidCarraher Supongo que podría probar algún tipo de arte ASCII ... realmente no hay mucha manera de hacer esto en Ruby.
Pomo de la puerta
@DavidCarraher Bien, tengo que irme, pero pronto trabajaré para hacer una representación ASCII de la fracción.
Pomo de la puerta
Excelente. Espero ver los resultados de su esfuerzo.
DavidC
4

Cuaderno Sabio, 80

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

Aquí npuede haber cualquier cosa que Sage pueda aproximar mediante un número de punto racional / flotante. La precisión predeterminada es de 53 bits, a menos que nsea ​​a Rational. Tengo que amar a MathJax.

ingrese la descripción de la imagen aquí

boothby
fuente
4

C, 119 caracteres

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

Aquí hay algunos ejemplos de resultados:

$ 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

Si bien la línea de fracción truncada no es tan bonita como algunos de los ejemplos aquí, deseo señalar que esta era una técnica común para formatear fracciones continuas en los días anteriores a que las computadoras de escritorio fueran ubicuas.


De acuerdo, aquí hay una versión mucho más larga (247 caracteres) que formatea completamente la salida:

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

Algunos ejemplos de su salida:

$ 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 
caja de pan
fuente
¡Guau, podemos tener un ganador en uno de los idiomas menos probables para ganar un CG! ¡Impresionante! :-)
Pomo de la puerta
3

APL (78)

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

Ejemplo:

      {(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
fuente
2

Mathematica, 77

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

Acabo de aprender Mathematica para esto. Toma un programa sorprendentemente largo para hacer esto.

TwiNight
fuente
2

Perl 128 114 caracteres

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

Pero como esto usa la ubicación de la consola, debe borrar la consola en orden antes de ejecutarla:

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 '

salida:

       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

Primera publicación: 128 caracteres

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

Dividido para cortar y pegar :

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 '

Renderizará:

            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

Lo mismo con 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

Imagen de látex

F. Hauri
fuente
1

Perl: 140 , 133 121 caracteres

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

ejemplo:
#perl fraccion.pl
5
7

   1
0+---
    1
 1+---
     1
  2+---
     2
Arvinds
fuente
0

Hoja de afeitar en 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)

El aviso realmente duele allí ...¿Quieres decir que tengo que elegir? De acuerdo, es una lista. De todos modos, buena suerte para que esto funcione.

Ry-
fuente
0

Game Maker Language (Script), 61 71

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

Compile con todas las variables no inicializadas como 0.

Timtech
fuente
1
¿esto genera algo? Además, parece estar mal; Estás agregando una cadena a un número. ¿Lo intentaste?
Pomo de la puerta
@Doorknob Tienes razón, tenía la intención de dárselo c.
Timtech
Todavía no emite nada ...
Pomo de la puerta
@Doorknob Sí, no devuelve nada, y tuve algunos errores de sintaxis. Debería devolver el valor correcto ahora.
Timtech
0

Suponiendo que los números de entrada son primos, llame a esta función de proceso con numerador y denominador. Puede ir a cualquier profundidad hasta encontrar la forma continua, sin límite.

Escrito en JAVA (238 caracteres)

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

proceso (89,150);

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

proceso (973,13421);

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