Menambahkan pecahan


14

Tulis program atau fungsi yang membutuhkan dua daftar kosong yang sama panjangnya dengan input dan lakukan yang berikut:

  • menggunakan elemen daftar pertama untuk mendapatkan pembilang,
  • menggunakan elemen dari daftar kedua untuk mendapatkan penyebut,
  • menampilkan fraksi yang dihasilkan setelah penyederhanaan (2/4=>1/2), dipisahkan oleh tanda "+",
  • menampilkan "=" dan hasil penambahan setelah fraksi terakhir.

Contoh:

Memasukkan

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

Keluaran

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

Tentang aturan

  • elemen daftar akan menjadi bilangan bulat positif,
  • elemen dapat dipisahkan oleh spasi, misalnya: 1/2 + 2/9 + 1 + 3/2 + 3/2 = 85/18ok,
  • membuntuti baris baru diizinkan,
  • daftar dapat diambil dalam format lain selain di atas, misalnya .: (1 2 3 3 6)atau {1;2;3;3;6}, dll.,
  • 1dapat dinyatakan sebagai 1/1,
  • alih-alih mencetak Anda dapat mengembalikan string yang sesuai,
  • Anda tidak perlu menangani input yang salah,
  • kode menang paling pendek .

Apa rentang nilai yang harus didukungnya?
Brad Gilbert b2gills

@ BradGilbertb2gills Saya akan mengatakan setidaknya -30 000 hingga 30 000, tapi kemudian saya tidak tahu apakah itu akan menjadi masalah ekstra untuk beberapa bahasa. Jadi mungkin hanya kisaran integer standar bahasa pilihan Anda.

@ PrzemysławP mengatakan "rentang integer standar bahasa pilihan Anda" bukan ide yang baik, beberapa bahasa memiliki integer standar sebagai booleans
Felipe Nardi Batista

Terima kasih! @ BradGilbertb2gills Kemudian setidaknya -30 000 hingga 30 000.

Bisakah kita mendapatkan pecahan sebagai [1, 2] [2, 9] [3, 3] ...gantinya?
Olivier Grégoire

Jawaban:


1

M , 12 11 byte

÷µFj”+;”=;S

Ini adalah tautan diadik. Karena bug, itu tidak berfungsi sebagai program lengkap. Fjuga diperlukan karena bug.

Cobalah online!

Bagaimana itu bekerja

÷µ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.

Saya suka bagaimana lebih dari seperempat program untuk menambahkan '='. :)
Computronium

7

Ruby 2.4, 54 53 karakter

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

Terimakasih untuk:

  • Value Ink untuk versi spesifik Ruby 2.4 (-3 karakter)
  • Value Ink untuk mengoptimalkan Rationalinisialisasi (-1 karakter)

Ruby, 58 57 56 karakter

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

Contoh dijalankan:

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

Cobalah online!


1
a=n.zip(d).map{|f|(f*?/).to_r};a*?++"=#{a.sum}"di Ruby 2.4 menghemat 3 byte.
Value Ink

Terima kasih @ ValueInk. Saya menduga itu mungkin, hanya tidak memiliki 2.4 baik lokal maupun TIO.
manatwork

1
Ya, saya menginstal 2.4 secara khusus sehingga saya dapat menguji solusi dengan sumhaha. Saya juga baru ingat bahwa .map{|i,j|i.to_r/j}itu lebih pendek 1 byte
Nilai Tinta

Doh. Saya mencoba berbagai pendekatan melalui .to_fdan divisi, tetapi tidak berpikir untuk membagi Rationaldengan Fixnum. Terima kasih lagi, @ ValueInk.
manatwork

6

Mathematica, 33 byte

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

memasukkan

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


Tidak Row@@{#/#2,"+"}sama dengan Row[#/#2,"+"]?
feersum

Iya! kamu benar!
J42161217

1
Fantastis! Saya tidak menyadari Rowbegitu nyaman untuk hal-hal seperti ini :)
Greg Martin

3

Python 3 , 104 byte

9 byte berkat Felipe Nardi Batista.

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

Cobalah online!



@FelipeNardiBatista muito.
Leaky Nun

ubah +'='+str(sum(c))ke,'=',sum(c)
Felipe Nardi Batista

@FelipeNardiBatista Terima kasih, saya juga menggunakan Python 3 di sini (berdasarkan preferensi pribadi).
Leaky Nun


3

Perl 6 ,  77  73 byte

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

Cobalah

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

Cobalah

Diperluas:

{  # 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 byte

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

Yay untuk fraksi built-in!


2

Mathematica, 61 byte

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

2

JavaScript (ES6), 111 byte

Mengambil daftar dalam sintaks currying (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

Java, 225 byte

int c(int a,int b){return b>0?c(b,a%b):a;}
(N,D)->{int n=0,d=1,i=0,g;String s="";for(;i<N.length;g=g(N[i],D[i]),N[i]/=g,D[i]/=g,s+=(i>0?"+":"")+N[i]+"/"+D[i],n=n*D[i]+N[i]*d,d*=D[i++],g=g(n,d),n/=g,d/=g);return s+"="+n+"/"+d;}

Ndan Dkeduanyaint[] , dikontekstualisasikan.

Saya menggunakan kembali fungsi GCD Kevin Cruijssen .

Lihat dan uji secara online!


2

Julia v0.4 +, 66 53 byte

-13 byte berkat Dennis

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

Cobalah secara Online!

Sebagai alternatif, jika pecahan dapat ditampilkan menggunakan //daripada /, yang berikut ini berfungsi selama 35 byte :

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

2

setlX , 103 byte

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

Membuat fungsi yang disebut ftempat Anda memasukkan dua daftar.

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

dengan variabel bernama dan anotasi:
setlX tidak menyediakan fitur komentar jadi mari kita berpura-pura bahwa kita dapat berkomentar%

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


Bagaimana jika #firstList berbeda dari #secondList?
RosLuP

maksudmu ukuran differnet? Pertanyaannya menyatakan bahwa daftar pertama digunakan oleh enumerator dan masukan yang salah dapat dimasukkan
BlueWizard

tetapi selain itu: jika daftar kedua lebih panjang, entri yang tersisa akan diabaikan. Jika daftar lebih pendek kesalahan runtime akan terjadi.
BlueWizard

1

Perl 6, 72 byte 65 byte

Rasional asli dan otomatis seharusnya membuat ini mudah, tetapi pengetatan default masih desimal, jadi kita harus .nude( nu merator dan de nominator) yang membunuh skor kita dan membuat 1 jelek :(

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("/")

Pembaruan: Menghapus tanda kurung yang tidak dibutuhkan, membunuh lebih banyak ruang dan menggunakan peta yang lebih cerdas. Menghemat karakter dari solusi Brad dengan biaya tidak tidak menjadi sub lambda.


Selamat datang di situs ini! Jawaban pertama yang bagus!
programmer5000



1

PHP> = 7.1, 190 Bytes

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

Versi Online

+14 Bytes untuk penggantian return$x/$t."/".$y/$t;dengan bukan return$y/$t>1?$x/$t."/".$y/$t:$x/$t;keluarannn/1


1

F #, 244 241 239 byte

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

Cobalah online!


1

setlX , 62 byte

[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
;

sesi juru bahasa


0

R, 109 byte

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

membutuhkan MASSperpustakaan (untuk fractionskelasnya). fungsi gmengembalikan output yang diperlukan sebagai string.

Cobalah online! (Tautan R-biola)


0

MATL , 32 byte

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

Cobalah online!

Penjelasan

Pertimbangkan [1, 2, 3, 3, 6], [2, 9, 3, 2, 4]sebagai input.

/         % 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 byte

: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

Perhatikan di awal, berbeda dari /. Ini membuat pecahan memegang bentuk mereka. Ini tidak bekerja dengan pecahan negatif.

Huh . TI-BASIC mengerikan dengan string. Jika yang harus kita lakukan adalah mencetak fraksi, dan kemudian jumlahnya, kodenya adalah:

TI-BASIC, 12 byte

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

Itu berarti bahwa 88 byte kode saya dihabiskan hanya memformat jawabannya! Hmph .


0

C, 171 byte

Coba Online

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

Aksioma, 212 byte

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)

uji

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

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

Penjelasan:

  • Jumlah input disimpan di A
  • A iterasi
  • B bertindak sebagai penghitung untuk menampilkan yang benar
  • Iitem Daftar 1 dan 2 disimpan di CdanD
  • Menampilkan Variabel C/ VariabelD
  • simpan C/ D+E dalamE
  • Setelah nomor terakhir temukan =danE

0

Haskell (Lambdabot), 94 91 86 byte

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

Cobalah online!

Terima kasih @Laikoni untuk -8byte!

Tidak disatukan

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

A Anda hilang import Data.Ratiountuk %yang tidak di Prelude.
Laikoni

1
Anda dapat menyimpan beberapa byte dengan menggantinya "?"++dengan '?':.
Laikoni

1
Pemendekan juga bekerja untuk "/"++ddan "="++.
Laikoni

1
Mengatur ulang menghemat lebih banyak byte:tail(f>>=t)++'=':(tail.t.sum)f
Laikoni

1
Puting taildan =<<menjadi tmenghemat lagi: Cobalah secara online!
Laikoni

0

Google Sheets, 83 81 byte

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

Disimpan 2 byte berkat Taylor Scott

Lembar akan secara otomatis menambahkan 2 tanda kurung penutup ke akhir rumus.

Dua array adalah input sebagai keseluruhan kolom Adan B. Baris kosong di bawah input akan melempar kesalahan.


Anda harus dapat menjatuhkan 2 byte dengan menjatuhkan terminal))
Taylor Scott
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.