연속 분수 표시


9

당신의 과제는 분수를 연속 분수 형태로 변환하는 것입니다.

입력 : 분수는 다음을 포함한 모든 형식으로 입력 할 수 있습니다 (단, 이에 한하지 않음).

  • 문자열 : "7/16"
  • 목록 : {7, 16}, (7, 16), [7, 16]
  • 단순 주문 쌍 : 7 16
  • 기능 : f [7,16]

출력 : 분자를 분모에서 분리하는 수평 분수 막대가있는 2D 연속 분수입니다. 분자가 1 인 연속 분수 만 유효합니다. 글꼴 크기를 깊이에 따라 변경할 필요는 없습니다. 선행 제로 (적절한 분수의 경우)는 선택 사항입니다.

깊이 : 코드는 8 단계 이상의 깊이를 표시 할 수 있어야합니다.

승리 기준 : 가장 짧은 코드가 승리합니다. 입력 및 출력을 보여주는 몇 가지 테스트 사례를 포함해야합니다.

테스트 예 (입력 후 출력)

5/4 5 분의 4

5/3 5 분의 3

5/7 다섯 번째 일곱째

9/16 아홉 열 여섯째

89/150 여든 아홉 이백 오십 오


얼마나 깊이 가야하는지에 대한 기준은 무엇입니까? 예를 들어, 왜 우리 0 + 89 / 250는 마지막 것을 위해 할 수 없습니까?
Doorknob

허용되는 유일한 분자는 1이라고 가정했습니다.
DavidC

아 괜찮아요, 수학 배경이별로 없어요 :) Wikipedia가 도와주었습니다. 이 형식으로 표시 할 수없는 언어는 어떻습니까? 우리가 같은 일을해도 괜찮 0 + 1 / (1 + 1 / (1 + 1 / (2 + 1 / (3 + 1 / (1 + 1 / (1 + 1 / (2)))))))습니까? 괄호 없이는 어떻습니까? 또는 파란색 숫자 만 표시하면 0 1 1 2 5 1 1 2?
Doorknob

1
표기법이 수학적으로 올바른 것으로 보입니다. 그러나 도전의 요점은 분수를 열 및 행 형식으로 표시하는 방법을 찾는 것입니다 (위에서 2D라고 느슨하게 언급했습니다).
DavidC

답변:


5

매스 매 티카, 40 36 자

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

예:

f[89/150]

산출:

산출


10

파이썬 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]

테스트:

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

파이썬 2, Alt. 버전, 95

기본적으로 breadbox의 답변 포트입니다. 보다 안전한 출력.

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)

테스트:

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

1
+1 좋은 생각입니다! 9보다 큰 숫자가 생성되면 문제가 있습니다. 예를 40,3들어 입력으로 확인하십시오 .
Sven Hohenstein

7

XSLT 1.0

HTML로 분수를 표시하는 것이 좋을 것이라고 생각했기 때문에 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>

테스트하려면 xslt를 fraction.xslt로 저장하고 IE에서 다음 파일을 엽니 다.

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

89/150


나는이 해결책을 좋아한다. 잘 했어!
Cruncher

4

루비, 175 (ASCII 아트 사용) 또는 47 (없음)

ASCII 아트없이 47

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

루비는 실제로 그런 그래픽을 할 수 없으므로 예제에서 파란색 숫자를 출력합니다.

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

아스키 아트로, 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

와우, ASCII 아트는 많은 코드를 사용했고, 나는 심지어 사악하고 rescue 0: P 샘플을 사용했습니다.

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

@DavidCarraher 좋아, 그럼 작동합니다. 편집
Doorknob

부분 몫을 출력합니다. 그것들은 연속 분율을 공식화하는 데 필수적이지만 요구 사항의 일부일뿐입니다.
DavidC

@DavidCarraher 나는 일종의 ASCII 예술을 시도 할 수 있다고 생각합니다 ... 루비에는 실제로 이것을 할 수있는 방법이별로 없습니다.
Doorknob

@DavidCarraher 좋아, 나는 떠나야하지만, 곧 분수의 ASCII 표현을 만들기 위해 노력할 것입니다.
Doorknob

큰. 노력의 결과를 기대합니다.
DavidC

4

세이지 노트, 80

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

nSage가 합리적인 / 부동 소수점 수로 근사 할 수있는 모든 것이 여기 있을 수 있습니다. 하지 않는 한 기본 정밀도, 53 비트 nA는 Rational. MathJax를 좋아해야합니다.

여기에 이미지 설명을 입력하십시오


4

C, 119 자

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

다음은 출력의 예입니다.

$ 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

잘린 분수 선은 여기의 일부 예와 같이 예쁘지 않지만 데스크톱 컴퓨터가 유비쿼터스가되기 전 며칠 동안 계속해서 분수를 형식화하는 일반적인 기술이라고 지적하고 싶습니다.


다음은 출력을 완전히 포맷하는 훨씬 더 긴 버전 (247 자)입니다.

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

출력 예 :

$ 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 

와우, 우리는 CG를 이길 가능성이 가장 적은 언어 중 하나에서 승자를 가질 수 있습니다! 감동적인! :-)
Doorknob

3

APL (78)

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

예:

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

매스 매 티카, 77

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

이것을 위해 Mathematica를 배웠습니다. 이를 위해 놀랍도록 긴 프로그램이 필요합니다.


2

128 개 114 문자

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

그러나 이것은 콘솔 배치를 사용하므로 실행하기 전에 콘솔을 정리해야합니다.

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 '

산출:

       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

첫 번째 게시물 : 128 자

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

대한 분할 된 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 '

렌더링합니다 :

            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

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

라텍스 사진


1

펄 : 140 , 133 개 (121) 문자

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

예 :
#perl fraction.pl
5
7

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

0

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)

프롬프트가 정말 아파요…아, 내가 고르라는 뜻이야? 좋아요, 목록입니다. 어쨌든, 행운을 빌어 요.


0

게임 메이커 언어 (스크립트), 61 71

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

초기화되지 않은 모든 변수를로 컴파일하십시오 0.


1
이것은 무엇을 출력합니까? 또한 잘못된 것 같습니다. 숫자에 문자열을 추가하고 있습니다. 해봤 어?
Doorknob

@Doorknob 당신 말이 맞아요 c.
Timtech

그것은 여전히 ​​아무것도 출력하지 않습니다 ...
Doorknob

@Doorknob 예, 아무것도 반환하지 않으며 구문 오류가 발생했습니다. 이제 올바른 값을 반환해야합니다.
Timtech

0

입력 번호를 공동 프라임으로 가정하면 분자 및 분모를 사용하여이 프로세스 함수를 호출하십시오. 계속되는 형태를 찾을 때까지 어떤 깊이로든 갈 수 있습니다.

자바로 작성 (238 자)

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

공정 (89,150);

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

공정 (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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.