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


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


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

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


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

@ 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


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 

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 

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.


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


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

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.


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.


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.