Visualizza le frazioni continue


9

La tua sfida è convertire una frazione nella sua forma di frazione continua.

Input : la frazione può essere inserita in qualsiasi formato, incluso (ma non limitato a)

  • stringa: "7/16"
  • elenco: {7, 16}, (7, 16), [7, 16]
  • coppia ordinata semplice: 7 16
  • funzione: f [7,16]

Output : una frazione continua, in 2D, con barre di frazione orizzontali che separano il numeratore dal denominatore. Sono valide solo le frazioni continue con numeratori pari a 1. Non è necessario variare la dimensione del carattere in base alla profondità. Uno zero iniziale (per le frazioni appropriate) è facoltativo.

Profondità : il codice deve essere in grado di visualizzare almeno 8 livelli di profondità.

Criterio vincente : vince il codice più corto. È necessario includere diversi casi di test che mostrano input e output.

Esempi di test (input seguito da output)

5/4 cinque quarti

5/3 cinque terzi

5/7 cinque setti

9/16 nove sedicesimi

89/150 ottantanove duecentocinquanta


quali sono i criteri per quanto devi approfondire? per esempio, perché non possiamo fare solo 0 + 89 / 250l'ultimo?
Maniglia della porta

Stavo presupponendo che l'unico numeratore accettabile fosse 1. Aggiungerò quello.
DavidC,

ah va bene, non ho molti precedenti matematici :) Wikipedia ha aiutato. Che ne dici di lingue che non possono mostrare cose in questo formato? Va bene se facciamo qualcosa del genere 0 + 1 / (1 + 1 / (1 + 1 / (2 + 1 / (3 + 1 / (1 + 1 / (1 + 1 / (2)))))))? Che dire senza la parentesi? O se mostriamo solo i numeri blu, come 0 1 1 2 5 1 1 2?
Maniglia della porta

1
La tua notazione sembra essere matematicamente corretta. Ma il punto principale della sfida è trovare un modo per visualizzare la frazione nel formato di colonne e righe (che ho definito liberamente come 2D).
DavidC,

Risposte:


5

Mathematica, 40 36 caratteri

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

Esempio:

f[89/150]

Produzione:

Produzione


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]

Test:

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

Python 2, alt. versione, 95

Fondamentalmente una porta della risposta breadbox. Uscita più sicura.

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)

Test:

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

1
+1 Buona idea! Sebbene ci siano problemi se vengono prodotti numeri maggiori di 9. Controllare, ad esempio, 40,3come input.
Sven Hohenstein,

7

XSLT 1.0

Ho pensato che sarebbe stato bello mostrare le frazioni con HTML, quindi ecco una soluzione 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>

Per provarlo, salva xslt come fraction.xslt e apri il seguente file in IE:

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

89/150


ADORO questa soluzione. Bel lavoro!
Cruncher,

4

Rubino, 175 (con arte ASCII) o 47 (senza)

Senza arte ASCII, 47

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

Dal momento che Ruby non può davvero fare una grafica del genere, ho appena emesso i numeri blu nei tuoi esempi.

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, quell'arte ASCII ha assorbito un sacco di codice e stavo persino facendo il male e usando rescue 0: P Esempio:

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

@DavidCarraher Ok, allora funziona. Modificato
Maniglia della porta

Si generano i quozienti parziali. Sebbene siano essenziali per la formulazione di una frazione continua, sono solo una parte del requisito.
DavidC,

@DavidCarraher Suppongo che potrei provare una sorta di arte ASCII ... non c'è davvero molto modo di farlo in Ruby.
Maniglia della porta

@DavidCarraher Okay, devo andarmene, ma lavorerò presto per creare una rappresentazione ASCII della frazione.
Maniglia della porta

Grande. Non vedo l'ora di vedere i risultati del tuo sforzo.
DavidC,

4

Sage Notebook, 80

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

Qui npuò esserci tutto ciò che Sage può approssimare con un numero in virgola mobile / razionale. La precisione predefinita è 53 bit, a meno che non nsia a Rational. Devo amare MathJax.

inserisci qui la descrizione dell'immagine


4

C, 119 caratteri

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

Ecco alcuni esempi di output:

$ 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

Mentre la linea di frazione troncata non è così carina come alcuni degli esempi qui, desidero sottolineare che questa era una tecnica comune per la formattazione di frazioni continue nei giorni precedenti l'onnipresenza dei computer desktop.


Ok, ecco una versione molto più lunga (247 caratteri) che esegue la formattazione completa dell'output:

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

Alcuni esempi del suo output:

$ 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, potremmo avere un vincitore in una delle lingue meno probabili per vincere un CG! Degno di nota! :-)
Maniglia della porta

3

APL (78)

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

Esempio:

      {(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]]]&

Ho appena imparato Mathematica per questo. Ci vuole un programma sorprendentemente lungo per farlo.


2

Perl 128 114 caratteri

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

Ma poiché questo utilizza il posizionamento della console, è necessario cancellare la console nell'ordine prima di eseguire:

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 '

produzione:

       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

Primo post: 128 caratteri

($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 spacco per taglia e incolla :

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 '

Renderà:

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

Immagine in lattice


1

Perl: 140 , 133 121 caratteri

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

esempio:
#perl fraction.pl
5
7

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

0

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

Il prompt fa davvero male lì ...Oh, vuoi dire che devo scegliere? Va bene, è un elenco. Comunque, buona fortuna per farlo funzionare.


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

Compilare con tutte le variabili non inizializzate come 0.


1
questo produce qualcosa? inoltre, sembra essere sbagliato; stai aggiungendo una stringa a un numero. Hai provato?
Maniglia della porta

@Doorknob Hai ragione, intendevo darlo a c.
Timtech,

Non emette ancora nulla ...
Maniglia della porta

@Doorknob Sì, non restituisce nulla e ho riscontrato alcuni errori di sintassi. Dovrebbe restituire il valore corretto ora.
Timtech,

0

Supponendo che i numeri di input siano co-prime, chiamare questa funzione di processo con numeratore e denominatore. Può andare a qualsiasi profondità fino a quando non trova la forma continua, senza limiti

Scritto in JAVA (238 caratteri)

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

processo (89.150);

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

processo (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
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.