Відображення тривалих дробів


9

Ваше завдання полягає в перетворенні дробу в її форму дробу.

Введення : Фракція може бути введена в будь-якому форматі, включаючи (але не обмежуючись цим)

  • рядок: "7/16"
  • список: {7, 16}, (7, 16), [7, 16]
  • проста замовлена ​​пара: 7 16
  • функція: f [7,16]

Вихід : Продовжений дріб, у 2D, з горизонтальними дробами дробу, що відокремлює чисельник від знаменника. Дійсні лише тривалі дроби з чисельниками, що дорівнює 1. Не потрібно змінювати розмір шрифту залежно від глибини. Провідний нуль (для правильних дробів) необов’язковий.

Глибина : Ваш код повинен мати можливість відображати принаймні 8 рівнів глибини.

Критерій виграшу : Найкоротший код виграє. Ви повинні включити кілька тестових випадків із відображенням вводу та виводу.

Приклади тестування (введення, а потім вихід)

5/4 п’ять четвертих

5/3 п’ять третин

5/7 п’ять сьомих

9/16 дев'ять шістнадцятих

89/150 вісімдесят дев'ять двісті п'ятдесят


які критерії, наскільки глибоко ви повинні пройти? наприклад, чому ми не можемо просто зробити 0 + 89 / 250останній?
Дверна ручка

Я припускав, що єдиним прийнятним числівником є ​​1. Я додам це.
DavidC

ну гаразд, не маю великого математичного досвіду :) Вікіпедія допомогла. Як щодо мов, які не можуть відображати речі в такому форматі? Чи добре, якщо ми робимо щось подібне 0 + 1 / (1 + 1 / (1 + 1 / (2 + 1 / (3 + 1 / (1 + 1 / (1 + 1 / (2)))))))? Що без дужок? Або якщо ми просто відобразимо сині цифри, як 0 1 1 2 5 1 1 2?
Дверна ручка

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

Python 2, alt. версія, 95

В основному відповідь хлібопекарської відповіді. Більш безпечний вихід.

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як вхід.
Свен Хогенштайн

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

Ruby, 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

С ASCII Art, 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 Sample:

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 ... насправді не так багато способів зробити це в Ruby.
Дверна ручка

@DavidCarraher Добре, мені доведеться піти, але я незабаром попрацюю над тим, щоб представити ASCII фракцію.
Дверна ручка

Чудово. Я з нетерпінням чекаю результатів ваших зусиль.
DavidC

4

Шавлійський зошит, 80

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

Тут nможе бути все, що Sage може наблизити за раціональним / числом з плаваючою точкою. Точність за замовчуванням - 53 біта, якщо nце не a 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! Вражає! :-)
Дверна ручка

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

Perl 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

Perl: 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 дроб.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 Ти маєш рацію, я мав намір це дати c.
Timtech

Він все ще нічого не видає ...
Doorknob

@Doorknob Так, це нічого не повертає, і у мене були синтаксичні помилки. Він повинен повернути правильне значення зараз.
Timtech

0

Припускаючи, що вхідні числа є спільними простими, викличте цю функцію процесу за допомогою чисельника та знаменника. Він може піти на будь-яку глибину, поки не знайде триваючої форми, без обмежень

Написано в JAVA (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

К, 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.