Hiển thị phân số tiếp tục


9

Thách thức của bạn là chuyển đổi một phân số thành dạng phân số tiếp tục của nó.

Đầu vào : Phân số có thể là đầu vào ở bất kỳ định dạng nào, bao gồm (nhưng không giới hạn)

  • chuỗi: "7/16"
  • danh sách: {7, 16}, (7, 16), [7, 16]
  • cặp đơn đặt hàng đơn giản: 7 16
  • chức năng: f [7,16]

Đầu ra : Một phân số tiếp tục, ở dạng 2D, với các thanh phân số nằm ngang ngăn cách tử số với mẫu số. Chỉ các phân số tiếp tục có tử số bằng 1 là hợp lệ. Không cần thiết phải làm cho kích thước phông chữ thay đổi theo độ sâu. Một số 0 đứng đầu (cho các phân số thích hợp) là tùy chọn.

Độ sâu : Mã của bạn phải có khả năng hiển thị ít nhất 8 cấp độ sâu.

Tiêu chí chiến thắng : Mã ngắn nhất sẽ thắng. Bạn phải bao gồm một số trường hợp thử nghiệm hiển thị đầu vào và đầu ra.

Ví dụ kiểm tra (Đầu vào theo sau là đầu ra)

5/4 năm phần tư

5/3 năm phần ba

5/7 năm phần bảy

16/9 chín mười sáu

89/150 tám mươi chín hai trăm năm mươi


các tiêu chí cho bạn phải đi sâu như thế nào? ví dụ, tại sao chúng ta không thể làm 0 + 89 / 250cho người cuối cùng?
Doorknob

Tôi đã đoán trước rằng tử số duy nhất được chấp nhận là 1. Tôi sẽ thêm nó.
DavidC

ah được rồi, đừng có nhiều nền tảng toán học :) Wikipedia đã giúp. Làm thế nào về các ngôn ngữ không thể hiển thị những thứ trong định dạng này? Có ổn không nếu chúng ta làm một cái gì đó như thế 0 + 1 / (1 + 1 / (1 + 1 / (2 + 1 / (3 + 1 / (1 + 1 / (1 + 1 / (2)))))))nào? Nếu không có dấu ngoặc đơn thì sao? Hoặc nếu chúng ta chỉ hiển thị các số màu xanh, như thế 0 1 1 2 5 1 1 2nào?
Doorknob

1
Ký hiệu của bạn có vẻ đúng về mặt toán học. Nhưng điểm chính của thử thách là tìm ra cách hiển thị phân số ở định dạng cột và hàng (mà tôi đã đề cập ở trên một cách lỏng lẻo là 2D).
DavidC

Câu trả lời:


5

Toán học, 40 36 ký tự

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

Thí dụ:

f[89/150]

Đầu ra:

Đầu ra


10

Con trăn 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]

Kiểm tra:

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

Con trăn 2, alt. phiên bản 95

Về cơ bản là một cổng câu trả lời của Breadbox. Đầu ra an toàn hơn.

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)

Kiểm tra:

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

1
+1 Ý kiến ​​hay! Mặc dù có vấn đề nếu số lượng lớn hơn 9 được sản xuất. Kiểm tra, ví dụ, 40,3như là đầu vào.
Sven Hohenstein

7

XSLT 1.0

Tôi nghĩ thật tuyệt khi hiển thị các phân số với HTML, vì vậy đây là một giải pháp 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>

Để kiểm tra nó, hãy lưu xslt dưới dạng binary.xslt và mở tệp sau trong IE:

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

89/150


Tôi yêu giải pháp này. Công việc tốt đẹp!
Cruncher

4

Ruby, 175 (với nghệ thuật ASCII) hoặc 47 (không có)

Không có nghệ thuật ASCII, 47

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

Vì Ruby thực sự không thể làm đồ họa như vậy, tôi chỉ xuất các số màu xanh trong ví dụ của bạn.

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

Với nghệ thuật 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

Ồ, nghệ thuật ASCII đó đã chiếm rất nhiều mã, và tôi thậm chí còn xấu xa và sử dụng rescue 0: P Mẫu:

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

@DavidCarraher Ok, sau đó nó hoạt động. Đã chỉnh sửa
Doorknob

Bạn xuất ra các chỉ tiêu một phần. Mặc dù chúng rất cần thiết cho việc xây dựng một phần tiếp tục, chúng chỉ là một phần của yêu cầu.
DavidC

@DavidCarraher Tôi cho rằng tôi có thể thử một số loại nghệ thuật ASCII ... thực sự không có nhiều cách để làm điều này trong Ruby.
Doorknob

@DavidCarraher Được rồi, tôi phải rời đi, nhưng tôi sẽ sớm thực hiện việc trình bày phân số ASCII.
Doorknob

Tuyệt quá. Tôi mong muốn được nhìn thấy kết quả của nỗ lực của bạn.
DavidC

4

Sage Notebook, 80

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

Ở đây ncó thể là bất cứ điều gì Sage có thể xấp xỉ bằng một số điểm hợp lý / dấu phẩy động. Độ chính xác mặc định là 53 bit, trừ khi nlà a Rational. Phải yêu MathJax.

nhập mô tả hình ảnh ở đây


4

C, 119 ký tự

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

Dưới đây là một số ví dụ về đầu ra:

$ 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

Mặc dù dòng phân số bị cắt ngắn trông không đẹp mắt như một số ví dụ ở đây, tôi muốn chỉ ra rằng đây là một kỹ thuật phổ biến để định dạng các phân số tiếp tục trở lại trong những ngày trước khi máy tính để bàn có mặt ở khắp mọi nơi.


Được rồi, đây là phiên bản dài hơn nhiều (247 ký tự) có định dạng đầy đủ về đầu ra:

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

Một số ví dụ về đầu ra của nó:

$ 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 

Ồ, chúng ta có thể có một người chiến thắng ở một trong những ngôn ngữ ít có khả năng nhất để giành được CG! Ấn tượng! :-)
Doorknob

3

APL (78)

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

Thí dụ:

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

Toán học, 77

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

Chỉ cần học Mathicala cho việc này. Có một chương trình dài đáng ngạc nhiên để làm điều này.


2

Perl 128 114 ký tự

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

Nhưng vì điều này sử dụng vị trí bàn điều khiển, bạn phải xóa bàn điều khiển theo thứ tự trước khi chạy:

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 '

đầu ra:

       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

Bài đầu tiên: 128 ký tự

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

Tách để dán 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 '

Sẽ kết xuất:

            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

Tương tự sử dụng 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

Hình ảnh cao su


1

Perl: 140 , 133 121 ký tự

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

ví dụ:
#perl phân số.pl
5
7

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

0

Dao cạo lá trên 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ời nhắc thực sự đau ở đóOh, bạn có nghĩa là tôi có thể chọn? Được rồi, đó là một danh sách. Dù sao, chúc may mắn có được điều này để chạy.


0

Ngôn ngữ nhà sản xuất trò chơi (Script), 61 71

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

Biên dịch với tất cả các biến chưa được khởi tạo như 0.


1
đầu ra này có gì không? Ngoài ra, nó có vẻ là sai; bạn đang nối một chuỗi vào một số. bạn đã thử à?
Doorknob

@Doorknob Bạn nói đúng, ý tôi là đưa nó cho c.
Timtech

Nó vẫn không xuất ra bất cứ thứ gì ...
Doorknob

@Doorknob Vâng, nó không trả về bất cứ điều gì và tôi đã có một số lỗi cú pháp. Nó sẽ trả về giá trị chính xác ngay bây giờ.
Timtech

0

Giả sử các số đầu vào là đồng nguyên tố, gọi hàm quá trình này với tử số và mẫu số. Nó có thể đi đến bất kỳ độ sâu nào cho đến khi tìm thấy hình thức tiếp tục, không giới hạn

Viết bằng JAVA (238 ký tự)

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

quá trình (89.150);

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

quá trình (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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.