Kesir ekleme


14

Girişle aynı uzunlukta boş olmayan iki liste alan ve aşağıdakileri yapan bir program veya işlev yazın:

  • pay almak için ilk listenin elemanlarını kullanır,
  • paydaları almak için ikinci listenin öğelerini kullanır,
  • sadeleştirmeden sonra ortaya çıkan kesirleri (2/4=>1/2)"+" s ile ayırarak gösterir ,
  • "=" değerini ve son kesirden sonraki ekleme sonucunu gösterir.

Misal:

Giriş

[1, 2, 3, 3, 6]
[2, 9, 3, 2, 4]

Çıktı

1/2+2/9+1+3/2+3/2=85/18

Kurallar hakkında

  • liste unsurları pozitif tamsayılar olacak,
  • elemanlar boşluklarla ayrılabilir, örneğin: 1/2 + 2/9 + 1 + 3/2 + 3/2 = 85/18tamam,
  • sondaki satırsonuna izin verilir,
  • listeler yukarıdakilerden başka formatlarda da alınabilir, örneğin: (1 2 3 3 6)veya {1;2;3;3;6}, vs.,
  • 1olarak ifade edilebilir 1/1,
  • yazdırmak yerine uygun dizeyi döndürebilirsiniz,
  • yanlış girdilerle uğraşmanıza gerek yoktur,
  • en kısa kod kazanır .

Ne tür değerleri desteklemesi gerekiyor?
Brad Gilbert b2gills

@ BradGilbertb2gills En az -30 000 ila 30 000 diyebilirim, ama sonra bazı diller için ekstra sorun olup olmayacağını bilmiyorum. Yani belki sadece seçtiğiniz dilin standart tamsayı aralığı.

PrzemysławP "seçtiğiniz dilin standart tamsayı aralığı" iyi bir fikir olmadığını söyleyerek @, bazı diller boolelerde gibi standart tamsayı var
Felipe Nardi Batista

Teşekkür ederim! @ BradGilbertb2gills Sonra en az -30 000 ila 30 000.

[1, 2] [2, 9] [3, 3] ...Bunun yerine kesirler alabilir miyiz ?
Olivier Grégoire

Yanıtlar:


1

M , 12 11 bayt

÷µFj”+;”=;S

Bu bir ikili bağlantıdır. Bir hata nedeniyle, tam bir program olarak çalışmaz. Fbir hata nedeniyle de gereklidir.

Çevrimiçi deneyin!

Nasıl çalışır

÷µFj”+;”=;S  Dyadic link. Left argument: N. Right argument: D

÷            Perform vectorized division, yielding an array of fractions (R).
 µ           Begin a new, monadic chain. Argument: R
  F          Flatten R. R is already flat, but j is buggy and has side effects.
   j”+       Join R, separating by '+'.
      ;”=    Append '='.
         ;S  Append the sum of R.

Programın dörtte birinden fazlasının '=' eklemesini seviyorum. :)
Computronium

7

Ruby 2.4, 54 53 karakter

->n,d{a=n.zip(d).map{|n,d|n.to_r/d};a*?++"=#{a.sum}"}

Sayesinde:

Yakut, 58 57 56 karakter

->n,d{t=0;n.zip(d).map{|n,d|t+=r=n.to_r/d;r}*?++"=#{t}"}

Örnek çalışma:

irb(main):001:0> puts ->n,d{t=0;n.zip(d).map{|n,d|t+=r=n.to_r/d;r}*?++"=#{t}"}[[1, 2, 3, 3, 6], [2, 9, 3, 2, 4]]
1/2+2/9+1/1+3/2+3/2=85/18

Çevrimiçi deneyin!


1
a=n.zip(d).map{|f|(f*?/).to_r};a*?++"=#{a.sum}"Ruby 2.4 size 3 bayt kazandırır.
Değer Mürekkebi

Teşekkürler @ValueInk. Bunun mümkün olabileceğinden şüpheliydim, ne yerel ne de TIO'da 2,4'üm yoktu.
Manatwork

1
Evet, özellikle 2.4'ü kurdum, böylece sumhaha ile çözümleri test edebildim . Ayrıca .map{|i,j|i.to_r/j}1 bayt daha kısa olduğunu hatırladım
Value Ink

Hamuru. Ben aracılığıyla çeşitli yaklaşımlar çalıştı .to_fve bölme, ancak bölünmesi düşünülen vermedi Rationalile Fixnum. Tekrar teşekkürler, @ValueInk.
manatwork

6

Mathematica, 33 bayt

Row@{Row[#/#2,"+"],"=",Tr[#/#2]}&

giriş

[{1, 2, 3, 3, 6}, {2, 9, 3, 2, 4}]


İle Row@@{#/#2,"+"}aynı değil Row[#/#2,"+"]mi?
feersum

Evet! Haklısın!
J42161217

1
Fantastik! RowBöyle şeyler için çok uygun olduğunu fark etmedim :)
Greg Martin

3

Python 3 , 104 bayt

Felipe Nardi Batista'ya 9 bayt teşekkürler.

from fractions import*
def f(*t):c=[Fraction(*t)for t in zip(*t)];print('+'.join(map(str,c)),'=',sum(c))

Çevrimiçi deneyin!



@Mehmettekin
Sızdıran Rahibe

değiştirmek +'='+str(sum(c))için,'=',sum(c)
Felipe Nardi Batista

@FelipeNardiBatista Teşekkürler, ayrıca burada Python 3 kullandım (kişisel tercihlere göre).
Sızdıran Rahibe


3

Perl 6 ,  77  73 bayt

{join('+',($/=[@^a Z/ @^b]).map:{.nude.join('/')})~"="~$/.sum.nude.join('/')}

Dene

{($/=[@^a Z/@^b])».nude».join('/').join('+')~'='~$/.sum.nude.join('/')}

Dene

Expanded:

{  # bare block lambda with two placeholder params 「@a」 and 「@b」

  (
    $/ = [              # store as an array in 「$/」 for later use

      @^a Z/ @^b        # zip divide the two inputs (declares them)

    ]

  )».nude\              # get list of NUmerators and DEnominators
  ».join('/')           # join the numerators and denominators with 「/」

  .join('+')            # join that list with 「+」

  ~
  '='                   # concat with 「=」
  ~

  $/.sum.nude.join('/') # get the result and represent as fraction
}

3

Clojure, 71 bayt

#(let[S(map / % %2)](apply str(concat(interpose '+ S)['=(apply + S)])))

Yerleşik kesirler için yay!


2

Mathematica, 61 bayt

t=#~ToString~InputForm&;Riffle[t/@#,"+"]<>"="<>t@Tr@#&[#/#2]&

2

JavaScript (ES6), 111 bayt

Körili sözdiziminde listeleri alır (a)(b).

let f =

a=>b=>a.map((v,i)=>F(A=v,B=b[i],N=N*B+v*D,D*=B),N=0,D=1,F=(a,b)=>b?F(b,a%b):A/a+'/'+B/a).join`+`+'='+F(A=N,B=D)

console.log(f([1, 2, 3, 3, 6])([2, 9, 3, 2, 4]))



2

Julia v0.4 +, 66 53 bayt

Dennis sayesinde -13 bayt

a^b=replace(join(a.//b,"+")"=$(sum(a.//b))","//","/")

Çevrimiçi deneyin!

Alternatif olarak, kesirler //yerine kullanılarak görüntülenebilirse /, 35 bayt için aşağıdakiler çalışır :

a^b=join(a.//b,'+')"=$(sum(a.//b))"

2

setlX , 103 bayt

f:=procedure(a,b){i:=1;l:=[];while(i<=#a){l:=l+[a[i]/b[i]];i+=1;}s:=join(l,"+");return s+"="+eval(s);};

Eklediğiniz fiki listenin bulunduğu yerde bir işlev oluşturur .

ungolfed:

f := procedure (a,b) {
    i:=1;
    l:=[];
    while(i<=#a){
        l:=l+[a[i]/b[i]];
        i+=1;
    }
    s:=join(l,"+");
    return s+"="+eval(s);
};

adlandırılmış değişkenler ve ek açıklamalarla:
setlX bir yorum özelliği sağlamaz, bu yüzden yorum yapabileceğimizi varsayalım%

f := procedure(firstList,secondList) {
    count := 1;
    list := []; 
    while(count <= #firstList) {
        % calculate every fraction and save it as a list
        list := list + [firstList[count]/secondList[count]];
        count += 1;
    }
    % Seperate every list entry with a plus ([2/3,1] -> "2/3+1")
    str := join(list, "+");
    % eval executes the string above and thus calculates our sum
    return str + "=" + eval(str);
};


#FirstList öğesinin #secondList öğesinden farklı olması durumunda ne olur?
RosLuP

differnet boyutu mu demek istediniz? Soru, ilk listenin numaralandırıcı tarafından kullanıldığını ve yanlış girdilerin içeri alınabileceğini belirtiyor
BlueWizard

ancak bunun dışında: ikinci liste daha uzunsa, kalan girişler yok sayılır. Liste kısaysa bir çalışma zamanı hatası ortaya çıkar.
BlueWizard

1

Perl 6, 72 bayt 65 bayt

Yerli ve otomatik rationals gerektiğini kolay bu yaparız ancak zorunda varsayılan stringification, ondalık olarak hala .nude( nu merator ve de bizim puanı öldürür ve :( 1 çirkin kılan nominator)

my \n = 1,2,3,3,6; my \d = 2,9,3,2,4;
(n Z/d)».nude».join("/").join("+")~"="~([+] n Z/d).nude.join("/")

Güncelleme: Gereksiz parantez kaldırıldı, daha fazla alan öldürün ve daha akıllı harita kullanın. Karakterleri Brad'in çözümü üzerinde, lambda sub olmama pahasına kurtarır.


Siteye Hoşgeldiniz! Güzel ilk cevap!
programcı5000



1

PHP> = 7,1, 190 Bayt

<?function f($x,$y){for($t=1+$x;$y%--$t||$x%$t;);return$x/$t."/".$y/$t;}[$n,$d]=$_GET;for($p=array_product($d);$x=$n[+$k];$e+=$x*$p/$y)$r[]=f($x,$y=$d[+$k++]);echo join("+",$r)."=".f($e,$p);

Çevrimiçi sürüm

+14 Bayt yerine çıkış return$x/$t."/".$y/$t;ile return$y/$t>1?$x/$t."/".$y/$t:$x/$t;değiştirmenn/1


1

F #, 244 241 239 bayt

let rec g a=function|0->abs a|b->g b (a%b)
let h a b=g a b|>fun x->a/x,b/x
let s,n,d=List.fold2(fun(s,n,d)N D->
 let(N,D),(n,d)=h N D,h(n*D+N*d)(d*D)
 s@[sprintf"%i/%i"N D],n,d)([],0,1)nom div
printf"%s=%i/%i"(System.String.Join("+",s))n d

Çevrimiçi deneyin!


1

setlX , 62 bayt

[a,b]|->join([x/y:[x,y]in a><b],"+")+"="++/[x/y:[x,y]in a><b];

ungolfed:

[a,b]|->                  define a function with parameters a and b
  join(                 
    [ x/y :               using set comprehension, make a list of fractions 
      [x,y] in a><b       from the lists zipped together
    ],
    "+"
  )                       join them with "+"
  + "="                   concat with an equals sign
  +                       concat with
  +/[x/y:[x,y]in a><b]    the sum of the list
;

tercüman oturumu


0

R, 109 bayt

f=MASS::fractions;a=attributes
g=function(n,d)paste(paste(a(f(n/d))$f,collapse='+'),a(f(sum(n/d)))$f,sep='=')

MASSkütüphaneyi gerektirir ( fractionssınıfı için). işlev g, gerekli çıktıyı dize olarak döndürür.

Çevrimiçi deneyin! (R-keman bağlantısı)


0

MATL , 32 bayt

/YQv'%i/%i+'wYD3L)61yUYQVwV47b&h

Çevrimiçi deneyin!

açıklama

Düşünün [1, 2, 3, 3, 6], [2, 9, 3, 2, 4]girdi olarak.

/         % Implicit inout. Divide element-wise
          % STACK: [0.5 0.222 1 1.5 1.5]
YQ        % Rational approximation (with default tolerance)
          % STACK: [1 2 1 3 3], [2 9 1 2 2]
v         % Conctenate all stack elements vertically
          % STACK: [1 2; 2 9; 1 2; 3 2; 3 2]
'%i/%i+'  % Push this string (sprintf format specifier)
          % STACK: [1 2; 2 9; 1 2; 3 2; 3 2], '%i/%i+'
wYD       % Swap, sprintf
          % STACK: '1/2+2/9+1/1+3/2+3/2+'
3L)       % Remove last entry
          % STACK: '1/2+2/9+1/1+3/2+3/2'
61        % Push 61 (ASCII for '=')
          % STACK: '1/2+2/9+1/1+3/2+3/2', 61
y         % Duplicate from below
          % STACK: '1/2+2/9+1/1+3/2+3/2', 61, '1/2+2/9+1/1+3/2+3/2'
U         % Evaluste string into a number
          % STACK: '1/2+2/9+1/1+3/2+3/2', 61, 4.722
YQ        % Rational approximation 
          % STACK: '1/2+2/9+1/1+3/2+3/2', 61, 85, 18
VwV       % Convert to string, swap, convert to string
          % STACK: '1/2+2/9+1/1+3/2+3/2', 61, '18', '85'
47        % Push 47 (ASCII for '/')
          % STACK: '1/2+2/9+1/1+3/2+3/2', 61, '18', '85', 47
b         % Bubble up in stack
          % STACK: '1/2+2/9+1/1+3/2+3/2', 61, '85', 47, '18'
&h        % Concatenate all stack elements horizontally. Implicitly display
          % STACK: '1/2+2/9+1/1+3/2+3/2=85/18'

0

TI-BASIC, 100 bayt

:L₁⁄L₂                                              //Creates a fraction from Lists 1 & 2, 7 bytes
:toString(Ans→Str1                                  //Create string from list, 7 bytes
:inString(Ans,",→A                                  //Look for commas, 9 bytes
:While A                                            //Begin while loop, 3 bytes
:Str1                                               //Store Str1 to Ans, 3 bytes
:sub(Ans,1,A-1)+"+"+sub(Ans,A+1,length(Ans)-A→Str1  //Replace "," with "+", 33 bytes
:inString(Ans,",→A                                  //Check for more commas, 9 bytes
:End                                                //End while loop, 2 bytes
:Str1                                               //Store Str1 to Ans, 3 bytes
:sub(Ans,2,length(Ans)-2                            //Remove opening and closing brackets, 13 bytes
:Ans+"="+toString(expr(Ans                          //Add "=" and answer, 11 bytes

Not farklı, başında /. Bu kesirler formlarını tutar. Bu does negatif fraksiyonları ile çalışmalarını.

İç çek . TI-BASIC iplerle korkunçtur . Tek yapmamız gereken kesirleri ve ardından toplamlarını yazdırmak olsaydı, kod şöyle olurdu:

TI-BASIC, 12 bayt

:L₁⁄L₂    //Create fractions from lists, 7 bytes
:Disp Ans //Display the above fractions, 3 bytes
:sum(Ans  //Display the answer, 2 bytes

Bu, kodumun 88 baytının sadece cevabı biçimlendirerek harcandığı anlamına gelir ! Hmph .


0

C, 171 bayt

Çevrimiçi Deneyin

i;t;x;y;f(int s,int*a,int*b){x=*a;y=*b;while(++i<s)x=(y-b[i])?(x*b[i])+(a[i]*y):(x+a[i]),y=(y-b[i])?(b[i]*y):y;for(i=1;i<=(x<y?x:y);++i)t=(x%i==0&&y%i==00)?i:t;x/=t;y/=t;}

0

Aksiyom, 212 bayt

C==>concat;S==>String;g(a)==C[numerator(a)::S,"/",denom(a)::S];h(a:List PI,b:List PI):S==(r:="";s:=0/1;#a~=#b or #a=0=>"-1";for i in 1..#a repeat(v:=a.i/b.i;s:=s+v;r:=C[r,g(v),if i=#a then C("=",g(s))else"+"]);r)

Ölçek

(5) -> h([1,3,4,4,5,6], [2,9,5,5,6,7])
   (5)  "1/2+1/3+4/5+4/5+5/6+6/7=433/105"
                                                             Type: String
(6) -> h([1,3,4,4], [2,9,5,5,6,7])
   (6)  "-1"
                                                             Type: String

0

Casio Basic, 161 Bayt

Dim(List 1)->A
for 1->I to A step 1
3*I-2->B
List 1[I]->C
List 2[I]->D
locate 1,B,C
locate 1,B+1,"/"
locate 1,B+2,D
C/D+E->E
next
locate 1,B+3,"="
locate 1,B+4,E

Açıklama:

  • Giriş sayısı kaydedilir A
  • A yineleme
  • B doğru görüntüleme için bir sayaç görevi görür
  • I'nin Liste 1 ve 2'ninci maddesi kaydedildi C veD
  • Değişken Gösterimi C / DeğişkenD
  • kaydet C/ D+E içindeE
  • Sonra son numara bulmak =veE

0

Haskell (Lambdabot), 94 91 86 bayt

t=tail.((\[n,_,d]->'+':n++'/':d).words.show=<<)
a#b|f<-zipWith(%)a b=t f++'=':t[sum f]

Çevrimiçi deneyin!

@Laikoni -8byte için teşekkürler !

Ungolfed

-- convert each fraction to a string (has format "n%d", replace '%' with '/' and prepend '+' ("+n/d"), keep the tail (dropping the leading '+')
t = tail.((\[n,_,d]->'+':n++'/':d).words.show=<<)
-- build a list of fractions
a # b = let f = zipWith(%) a b in
-- stringify that list, append "=" and the stringified sum of these fractions
  t f ++ "=" ++ t [sum f]

Kişisel eksik import Data.Ratioiçin %hangi Prelude değildir.
Laikoni

1
Sen değiştirerek bazı bayt kaydedebilirsiniz "?"++ile '?':.
Laikoni

1
Kısalma "/"++dve için de çalışır "="++.
Laikoni

1
Yeniden düzenleme bazı baytları kaydeder:tail(f>>=t)++'=':(tail.t.sum)f
Laikoni

1
tailVe =<<içine koymak tbiraz daha tasarruf sağlar: Çevrimiçi deneyin!
Laikoni

0

Google E-Tablolar, 83 81 bayt

=ArrayFormula(JOIN("+",TRIM(TEXT(A:A/B:B,"?/???")))&"="&TEXT(sum(A:A/B:B),"?/???"

Taylor Scott sayesinde 2 bayt kaydedildi

E-tablolar formülün sonuna otomatik olarak 2 kapanış parantez ekleyecektir.

İki dizinin tamamı sütun Ave olarak girilir B. Girişlerin altındaki boş satırlar hata verir.


terminali bırakarak 2 bayt ))
Taylor Scott
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.