Tampilkan Fraksi Lanjutan

9

Tantangan Anda adalah mengubah pecahan menjadi bentuk pecahan berkelanjutan.

Input : Fraksi dapat berupa input dalam format apa pun, termasuk (tetapi tidak terbatas pada)

  • string: "7/16"
  • daftar: {7, 16}, (7, 16), [7, 16]
  • pasangan sederhana yang dipesan: 7 16
  • fungsi: f [7,16]

Keluaran : Fraksi lanjutan, dalam 2D, dengan bilah fraksi horizontal yang memisahkan pembilang dari penyebut. Hanya pecahan lanjutan dengan pembilang yang sama dengan 1 yang valid. Tidak perlu membuat ukuran font bervariasi sesuai dengan kedalaman. Angka nol di depan (untuk fraksi yang tepat) adalah opsional.

Kedalaman : Kode Anda harus dapat menampilkan setidaknya 8 level kedalaman.

Kriteria menang : Kode terpendek menang. Anda harus menyertakan beberapa test case yang menunjukkan input dan output.

Contoh Uji (Input diikuti oleh output)

5/4 lima perempat

5/3 lima pertiga

5/7 lima ketujuh

9/16 sembilan belas belas

89/150 delapan puluh sembilan dua ratus lima puluh

DavidC
sumber
apa kriteria untuk seberapa dalam Anda harus melangkah? misalnya, mengapa kita tidak bisa melakukan 0 + 89 / 250yang terakhir saja?
Gagang Pintu
Saya mengandaikan bahwa satu-satunya pembilang yang dapat diterima adalah 1. Saya akan menambahkan itu.
DavidC
ah oke, tidak punya banyak latar belakang matematika :) Wikipedia membantu. Bagaimana dengan bahasa yang tidak dapat menampilkan hal-hal dalam format ini? Apakah boleh jika kita melakukan sesuatu seperti 0 + 1 / (1 + 1 / (1 + 1 / (2 + 1 / (3 + 1 / (1 + 1 / (1 + 1 / (2)))))))? Bagaimana dengan tanpa tanda kurung? Atau jika kita hanya menampilkan angka biru, seperti 0 1 1 2 5 1 1 2?
Gagang Pintu
1
Notasi Anda tampaknya benar secara matematis. Tetapi poin utama dari tantangannya adalah mencari cara untuk menampilkan fraksi dalam format kolom dan baris (yang saya sebut di atas secara longgar sebagai 2D).
DavidC

Jawaban:

5

Mathematica, 40 36 karakter

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

Contoh:

f[89/150]

Keluaran:

Keluaran

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

Uji:

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

Python 2, alt. versi, 95

Pada dasarnya port jawaban dari kotak roti. Output lebih aman.

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)

Uji:

$ python cfrac2.py
(98,15)
      1
 6 + ---
           1
      1 + ---
                1
           1 + ---
                7
shane
sumber
1
+1 Ide bagus! Meskipun ada masalah jika angka lebih besar dari 9 diproduksi. Periksa, misalnya, 40,3sebagai input.
Sven Hohenstein
7

XSLT 1.0

Saya pikir akan lebih baik untuk menampilkan pecahan dengan HTML, jadi inilah solusi 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>

Untuk mengujinya, simpan xslt sebagai fraction.xslt dan buka file berikut di 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ć
sumber
Saya suka solusi ini. Kerja bagus!
Cruncher
4

Ruby, 175 (dengan seni ASCII) atau 47 (tanpa)

Tanpa seni ASCII, 47

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

Karena Ruby tidak dapat melakukan gambar seperti itu, saya hanya menampilkan angka biru pada contoh Anda.

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

Dengan Seni ASCII, 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, seni ASCII itu mengambil banyak kode, dan saya bahkan jahat dan menggunakan rescue 0: P Contoh:

c:\a\ruby>cont
[89,150]
0+      1
  -------------
  1+     1
    -----------
    1+    1
      ---------
      2+   1
        -------
        5+  1
          -----
          1+ 1
            ---
            1+1
              -
              2
Gagang pintu
sumber
@ DavidCarraher Ok, lalu bekerja. Diedit
Gagang Pintu
Anda menghasilkan negosiasi parsial. Meskipun mereka penting untuk merumuskan fraksi lanjutan, mereka hanya bagian dari persyaratan.
DavidC
@ Davidvidarrarr Saya kira saya bisa mencoba semacam seni ASCII ... benar-benar tidak banyak cara untuk melakukan ini di Ruby.
Gagang Pintu
@ DavidVarraher Oke, saya harus pergi, tapi saya akan segera membuat representasi fraksi ASCII.
Gagang Pintu
Bagus. Saya berharap dapat melihat hasil dari upaya Anda.
DavidC
4

Sage Notebook, 80

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

Di sini nbisa apa saja yang dapat diperkirakan oleh Sage dengan angka rasional / mengambang. Presisi standar adalah 53 bit, kecuali na Rational. Harus mencintai MathJax.

masukkan deskripsi gambar di sini

stan
sumber
4

C, 119 karakter

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

Berikut adalah beberapa contoh 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

Sementara garis fraksi terpotong tidak cukup cantik seperti beberapa contoh di sini, saya ingin menunjukkan bahwa ini adalah teknik umum untuk memformat fraksi lanjutan pada hari-hari sebelum komputer desktop ada di mana-mana.


Oke, ini versi yang jauh lebih lama (247 karakter) yang memformat output secara penuh:

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

Beberapa contoh outputnya:

$ 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 
kotak roti
sumber
Wow, kami mungkin memiliki pemenang dalam salah satu bahasa yang paling tidak mungkin memenangkan CG! Impresif! :-)
Gagang Pintu
3

APL (78)

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

Contoh:

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

Mathematica, 77

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

Baru belajar Mathematica untuk ini. Secara mengejutkan butuh waktu lama untuk melakukan ini.

TwiNight
sumber
2

Perl 128 114 karakter

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

Tetapi karena ini menggunakan penempatan konsol, Anda harus menghapus konsol sebelum menjalankan:

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 '

keluaran:

       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

Posting pertama: 128 karakter

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

Dipisahkan untuk pasta cut'n :

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 '

Will 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

Sama menggunakan 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

Gambar Lateks

F. Hauri
sumber
1

Perl: 140 , 133 121 karakter

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

contoh:
#perl fraction.pl
5
7

   1
0+---
    1
 1+---
     1
  2+---
     2
Arvinds
sumber
0

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

Prompt sangat menyakitkan di sana ...Oh, maksudmu aku bisa memilih? Oke, ini daftarnya. Bagaimanapun, semoga sukses menjalankan ini.

Ry-
sumber
0

Bahasa Game Maker (Script), 61 71

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

Kompilasi dengan semua variabel tidak diinisialisasi sebagai 0.

Timtech
sumber
1
apakah ini menghasilkan sesuatu? juga, tampaknya salah; Anda menambahkan string ke nomor. Apakah kamu sudah mencobanya?
Gagang Pintu
@ Doorknob Anda benar, saya bermaksud memberikannya kepada c.
Timtech
Masih tidak menghasilkan apa-apa ...
Gagang Pintu
@ Doorknob Ya, itu tidak mengembalikan apa-apa, dan saya punya beberapa kesalahan sintaks. Seharusnya mengembalikan nilai yang benar sekarang.
Timtech
0

Dengan asumsi nomor input sebagai co-prime, panggil fungsi proses ini dengan pembilang dan penyebut. Itu dapat pergi ke kedalaman sampai menemukan bentuk lanjutan, tanpa batas

Ditulis dalam JAWA (238 karakter)

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

proses (89.150);

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

proses (973,13421);

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