การเพิ่มเศษส่วน


14

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้รายการที่ไม่ว่างสองรายการที่มีความยาวเท่ากันกับอินพุตและทำสิ่งต่อไปนี้:

  • ใช้องค์ประกอบของรายการแรกเพื่อรับตัวเศษ
  • ใช้องค์ประกอบของรายการที่สองเพื่อรับส่วน
  • แสดงเศษส่วนผลลัพธ์หลังจากการทำให้เข้าใจง่าย(2/4=>1/2)คั่นด้วย "+" s
  • แสดง "=" และผลลัพธ์ของการบวกหลังเศษส่วนสุดท้าย

ตัวอย่าง:

อินพุต

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

เอาท์พุต

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

เกี่ยวกับกฎ

  • องค์ประกอบของรายการจะเป็นจำนวนเต็มบวก
  • องค์ประกอบสามารถคั่นด้วยช่องว่างเช่น: 1/2 + 2/9 + 1 + 3/2 + 3/2 = 85/18ก็โอเค
  • ขึ้นบรรทัดใหม่ที่ได้รับอนุญาต
  • รายการสามารถนำไปใช้ในรูปแบบอื่นนอกเหนือจากด้านบนเช่น: (1 2 3 3 6)หรือ{1;2;3;3;6}อื่น ๆ
  • 1สามารถแสดงเป็น1/1,
  • แทนที่จะพิมพ์คุณสามารถส่งคืนสตริงที่เหมาะสมได้
  • คุณไม่จำเป็นต้องจัดการกับการป้อนข้อมูลผิด
  • สั้นที่สุดชนะรหัส

มันมีช่วงของค่าที่จะสนับสนุน?
Brad Gilbert b2gills

@ BradGilbertb2gills ฉันจะพูดอย่างน้อย -30,000 ถึง 30,000 แต่แล้วฉันก็ไม่รู้ว่ามันจะเป็นปัญหาพิเศษสำหรับบางภาษาหรือไม่ ดังนั้นอาจเป็นเพียงช่วงจำนวนเต็มมาตรฐานของภาษาที่คุณเลือก

@ PrzemysławPพูดว่า "ช่วงจำนวนเต็มมาตรฐานของภาษาที่คุณเลือก" ไม่ใช่ความคิดที่ดีบางภาษามีจำนวนเต็มมาตรฐานเป็นบูลีน
Felipe Nardi Batista

ขอขอบคุณ! @ BradGilbertb2gills จากนั้นอย่างน้อย -30,000 ถึง 30 000

เราจะได้เศษส่วน[1, 2] [2, 9] [3, 3] ...แทนได้ไหม?
Olivier Grégoire

คำตอบ:


1

M , 12 11 ไบต์

÷µFj”+;”=;S

นี่คือลิงค์ dyadic เนื่องจากข้อผิดพลาดมันไม่ทำงานเป็นโปรแกรมเต็มรูปแบบ Fก็จำเป็นเนื่องจากข้อผิดพลาด

ลองออนไลน์!

มันทำงานอย่างไร

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

ฉันชอบมากกว่าหนึ่งในสี่ของโปรแกรมที่จะผนวก '=' :)
Computronium

7

Ruby 2.4, 54 53 ตัวอักษร

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

ขอบคุณที่:

  • Value Inkสำหรับรุ่นเฉพาะทับทิม 2.4 (-3 ตัวอักษร)
  • Value InkสำหรับการปรับRationalค่าเริ่มต้นให้เหมาะสม (อักขระ 1 ตัว)

Ruby, 58 57 56 ตัวอักษร

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

วิ่งตัวอย่าง:

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

ลองออนไลน์!


1
a=n.zip(d).map{|f|(f*?/).to_r};a*?++"=#{a.sum}"ใน Ruby 2.4 ช่วยให้คุณ 3 ไบต์
Ink Value

ขอบคุณ @ValueInk ฉันสงสัยว่าอาจเป็นไปได้เพียงไม่มี 2.4 ทั้งในประเทศและใน TIO
จัดการ

1
ใช่ฉันติดตั้ง 2.4 โดยเฉพาะดังนั้นฉันสามารถทดสอบวิธีแก้ปัญหาด้วยsumฮ่าฮ่า นอกจากนี้ฉันเพิ่งจำได้ว่า.map{|i,j|i.to_r/j}สั้นกว่า 1 ไบต์
หมึกมูลค่า

Doh ฉันพยายามวิธีการต่างๆผ่าน.to_fและส่วน แต่ไม่ได้คิดว่าจะหารด้วยRational Fixnumขอขอบคุณอีกครั้ง @ValueInk
ผลิต

6

Mathematica, 33 ไบต์

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

อินพุต

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


ไม่Row@@{#/#2,"+"}เหมือนกันRow[#/#2,"+"]ใช่ไหม
feersum

ใช่! คุณพูดถูก!
J42161217

1
Fantastic! ผมไม่ทราบRowจึงสะดวกสำหรับสิ่งที่ต้องการนี้ :)
เกร็กมาร์ติน

3

Python 3 , 104 ไบต์

ขอบคุณ 9 ไบต์กับ Felipe Nardi Batista

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

ลองออนไลน์!



@FelipeNardiBatista muito
Leun Nun

เปลี่ยน+'='+str(sum(c))เป็น,'=',sum(c)
Felipe Nardi Batista

@FelipeNardiBatista ขอบคุณฉันเคยใช้ Python 3 ที่นี่ (ขึ้นอยู่กับความชอบส่วนตัว)
Leun Nun


3

Perl 6 ,  77  73 ไบต์

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

ลองมัน

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

ลองมัน

ขยาย:

{  # 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 ไบต์

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

Yay สำหรับเศษส่วนในตัว!




2

Java, 225 ไบต์

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

NและDมีทั้งint[]บริบท

ฉันใช้ฟังก์ชัน GCD ของ Kevin Cruijssenอีกครั้ง

ดูและทดสอบออนไลน์!



2

setlX , 103 ไบต์

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

สร้างฟังก์ชั่นที่เรียกว่า fแทรกสองรายการของคุณ

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

ด้วยตัวแปรที่มีชื่อและคำอธิบายประกอบ:
setlX ไม่ได้มีคุณสมบัติการแสดงความคิดเห็นดังนั้นมาทำเป็นว่าเราสามารถแสดงความคิดเห็นด้วย%

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 แตกต่างจาก #secondList ล่ะ
RosLuP

คุณหมายถึงขนาด differnet หรือไม่ คำถามระบุว่ารายการแรกที่ใช้โดยตัวแจงนับและสามารถป้อนข้อมูลที่ไม่ถูกต้องได้
BlueWizard

แต่นอกเหนือจากนั้น: หากรายการที่สองยาวกว่ารายการที่เหลือจะถูกละเว้น หากรายการสั้นลงข้อผิดพลาดรันไทม์จะเกิดขึ้น
BlueWizard

1

Perl 6, 72 ไบต์ 65 ไบต์

การปันส่วนแบบเนทีฟและแบบอัตโนมัติควรทำให้ง่าย แต่การกำหนดค่าเริ่มต้นยังคงเป็นทศนิยมดังนั้นเราต้องทำ.nude ( nu merator และde nominator) ซึ่งฆ่าคะแนนของเราและทำให้ 1 น่าเกลียด :(

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

อัปเดต: ลบวงเล็บเหลี่ยมที่ไม่ต้องการออก, ฆ่าพื้นที่มากขึ้นและใช้แผนที่อย่างชาญฉลาด บันทึกอักขระบนโซลูชันของแบรดโดยไม่เสียค่าใช้จ่าย


ยินดีต้อนรับสู่เว็บไซต์! คำตอบแรกที่ดี!
programmer5000



1

PHP> = 7.1, 190 ไบต์

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

เวอร์ชั่นออนไลน์

+14 Bytes สำหรับแทนที่return$x/$t."/".$y/$t;ด้วยreturn$y/$t>1?$x/$t."/".$y/$t:$x/$t;เป็น output nแทนที่จะเป็นn/1



1

setlX , 62 ไบต์

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

interpreter session


0

R, 109 ไบต์

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

ต้องการMASSไลบรารี (สำหรับfractionsคลาส) ฟังก์ชันgส่งคืนเอาต์พุตที่ต้องการเป็นสตริง

ลองออนไลน์! (ลิงค์ซอดเดิล)


0

MATL , 32 ไบต์

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

ลองออนไลน์!

คำอธิบาย

พิจารณา[1, 2, 3, 3, 6], [2, 9, 3, 2, 4]เป็น 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 ไบต์

: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

หมายเหตุที่จุดเริ่มต้นที่แตกต่างจาก /ทำให้เศษส่วนมีรูปแบบ มันไม่ทำงานร่วมกับเศษส่วนในเชิงลบ

ถอนหายใจ TI-BASIC แย่มากกับสาย หากสิ่งที่เราต้องทำคือพิมพ์เศษส่วนจากนั้นผลรวมของรหัสจะเป็น:

TI-BASIC ขนาด 12 ไบต์

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

นั่นหมายความว่าใช้รหัส88 ไบต์ของฉันเพียงแค่จัดรูปแบบคำตอบ! ฮึ่ม



0

ความจริง 212 ไบต์

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)

ทดสอบ

(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 ไบต์

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
  • A ซ้ำ
  • B ทำหน้าที่เป็นตัวนับสำหรับการแสดงที่ถูกต้อง
  • Iบันทึกรายการที่ 1 และ 2 ในCและD
  • การแสดงผลของตัวแปรC/ ตัวแปรD
  • บันทึกC/ D+E in E
  • หลังจากค้นหาหมายเลขล่าสุด=และE

0

Haskell (แลมบ์บ็อต), 94 91 86 ไบต์

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

ลองออนไลน์!

ขอบคุณ @Laikoni สำหรับ-8ไบต์!

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]

Your missing a import Data.Ratio for % which is not in Prelude.
Laikoni

1
You can save some bytes by replacing "?"++ with '?':.
Laikoni

1
The shortening also works for "/"++d and "="++.
Laikoni

1
Rearranging saves some more bytes: tail(f>>=t)++'=':(tail.t.sum)f
Laikoni

1
Putting tail and =<< into t saves some more: Try it online!
Laikoni

0

Google Sheets, 83 81 bytes

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

Saved 2 bytes thanks to Taylor Scott

Sheets will automatically add 2 closing parentheses to the end of the formula.

The two arrays are input as the entirety of columns A and B. Empty rows below the inputs will throws errors.


you should be able to drop 2 bytes by dropping the terminal ))
Taylor Scott
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.