Kesirleri Göster


9

Zorluğunuz, bir kesiri devam eden kesir formuna dönüştürmektir.

Giriş : Kesir, herhangi bir biçimde girilebilir (bunlarla sınırlı değildir)

  • dize: "7/16"
  • liste: {7, 16}, (7, 16), [7, 16]
  • basit sipariş çifti: 7 16
  • işlev: f [7,16]

Çıktı : Payı paydadan ayıran yatay kesir çubukları ile 2D'de sürekli bir kesir. Yalnızca 1'e eşit numaralara sahip devam eden kesirler geçerlidir. Yazı tipi boyutunun derinliğe göre değişmesi gerekmez. Baştaki sıfır (uygun kesirler için) isteğe bağlıdır.

Derinlik : Kodunuz en az 8 derinlik seviyesi gösterebilmelidir.

Kazanan kriter : En kısa kod kazanır. Giriş ve çıkışı gösteren birkaç test örneği eklemelisiniz.

Test Örnekleri (Giriş ve ardından çıkış)

5/4 beşte dördü

3/5 üçte beş

5/7 beş yedinci

16/09 dokuz on altı

89/150 seksen dokuz iki yüz ellinci


Ne kadar derine inmene dair kriterler nelerdir? örneğin, neden 0 + 89 / 250sonuncusu için yapamıyoruz ?
Kapı tokmağı

Kabul edilebilir tek payın 1 olduğunu varsayıyordum. Bunu ekleyeceğim.
DavidC

ah tamam, matematik arka planınız yok :) Wikipedia yardımcı oldu. Bu biçimdeki şeyleri gösteremeyen dillere ne dersiniz? Gibi bir şey yaparsak sorun olmaz mı 0 + 1 / (1 + 1 / (1 + 1 / (2 + 1 / (3 + 1 / (1 + 1 / (1 + 1 / (2)))))))? Parantez olmadan ne olur? Ya da sadece mavi rakamları görüntülersek 0 1 1 2 5 1 1 2?
Kapı tokmağı

1
Gösterimin matematiksel olarak doğru olduğu görülüyor. Ancak zorluğun ana noktası, kesri sütun ve satır biçiminde (yukarıda 2B olarak gevşek olarak bahsettiğim) görüntülemek için bir yol bulmaktır.
DavidC

Yanıtlar:


5

Mathematica, 40 36 karakter

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

Misal:

f[89/150]

Çıktı:

Çıktı


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]

Ölçek:

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

Python 2, alt. versiyon, 95

Temelde bir breadbox cevabı limanı. Daha güvenli çıktı.

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)

Ölçek:

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

1
+1 İyi fikir! Yine de 9'dan büyük sayılar üretilirse sorunlar var. Örneğin, 40,3giriş olarak kontrol edin .
Sven Hohenstein

7

XSLT 1.0

Kesirleri HTML ile göstermenin güzel olacağını düşündüm, işte bir XSLT çözümü.

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

Test etmek için, xslt'i fraction.xslt kaydedin ve IE'de aşağıdaki dosyayı açın:

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

89/150


Bu çözümü seviyorum. İyi iş!
Cruncher

4

Yakut, 175 (ASCII sanatı ile) veya 47 (olmadan)

ASCII sanatı olmadan, 47

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

Ruby gerçekten böyle grafikler yapamayacağından, örneklerinizdeki mavi sayıları çıktıyorum.

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

ASCII Art ile 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

Vay canına, bu ASCII sanatı çok fazla kod aldı ve ben kötü ve hatta kullanıyordum rescue 0: P Sample:

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

@DavidCarraher Tamam, o zaman işe yarıyor. Düzenlendi
Kapı Tokmağı

Kısmi bölümleri çıktıyorsunuz. Sürekli bir kesirin formüle edilmesi için gerekli olmalarına rağmen, gereksinimin sadece bir parçasıdır.
DavidC

@DavidCarraher Sanırım bir çeşit ASCII sanatını deneyebilirim ... Ruby'de bunu yapmanın pek bir yolu yok.
Kapı tokmağı

@DavidCarraher Tamam, ayrılmalıyım, ama yakında fraksiyonun ASCII temsilini yapmaya çalışacağım.
Kapı tokmağı

Harika. Çabalarınızın sonuçlarını görmek için sabırsızlanıyorum.
DavidC

4

Adaçayı Defteri, 80

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

Burada n, Sage'nin rasyonel / kayan nokta sayısı ile yaklaşık olarak tahmin edebileceği herhangi bir şey olabilir. Varsayılan kesinlik n, a olmadığı sürece 53 bittir Rational. MathJax'ı sevmeliyim.

resim açıklamasını buraya girin


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

İşte bazı çıktı örnekleri:

$ 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

Kesik kesir çizgisi buradaki örneklerden bazıları kadar hoş görünmese de, bunun masaüstü bilgisayarların her yerde bulunmasından önceki günlerde devam eden kesirleri biçimlendirmek için yaygın bir teknik olduğunu belirtmek isterim.


Tamam, çıktının tam biçimlendirmesini yapan çok daha uzun bir sürüm (247 karakter):

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

Çıktının bazı örnekleri:

$ 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 

Vay canına, bir CG kazanma olasılığı en az olan dillerden birinde kazanabiliriz! Etkileyici! :-)
Kapı Tokmağı

3

APL (78)

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

Misal:

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

Bunun için Mathematica'yı yeni öğrendim. Bunu yapmak şaşırtıcı derecede uzun bir program gerektirir.


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"

Ancak bu konsol yerleşimini kullandığından, çalıştırmadan önce konsolu temizlemeniz gerekir:

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 '

çıktı:

       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

İlk mesaj: 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",$=

Cut'n macun için ayrılmıştır :

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 '

Oluşturacak:

            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 ile aynı:

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

Lateks Resim


1

Perl: 140 , 133121 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"

örnek:
#perl fraction.pl
5
7

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

0

Firefox'ta Razor Leaf, 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)

İstem gerçekten acıyor…Oh, yani ben mi seçeyim? Tamam, bu bir liste. Her neyse, bunu çalıştırmak için iyi şanslar.


0

Game Maker Dili (Script), 61 71

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

Başlatılmamış tüm değişkenlerle birlikte derleyin 0.


1
bu bir şey çıkarıyor mu? ayrıca, yanlış gibi görünüyor; bir sayıya dize ekliyorsunuz. onu denedin mi?
Kapı tokmağı

@Doorknob Haklısın, bunu vermek istedim c.
Timtech

Hala hiçbir şey çıktı ...
Kapı Tokmağı

@Doorknob Evet, hiçbir şey döndürmüyor ve bazı sözdizimi hatalarım oldu. Şimdi doğru değeri döndürmelidir.
Timtech

0

Giriş numaralarının eş-birincil olduğu varsayıldığında, pay ve payda ile bu işlem fonksiyonunu çağırın. Devamlı formu bulana kadar herhangi bir derinliğe gidebilir, sınır yoktur

JAVA ile yazılmış (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));
}

işlem (89.150);

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

işlem (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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.