分数を追加する


14

入力と同じ長さの2つの空でないリストを取り、次のことを行うプログラムまたは関数を作成します。

  • 最初のリストの要素を使用して分子を取得し、
  • 2番目のリストの要素を使用して分母を取得し、
  • (2/4=>1/2)「+」で区切られた、簡略化後の結果の小数部を表示します。
  • 最後の小数部の後に「=」と加算結果を表示します。

例:

入力

[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/18is ok、
  • 末尾の改行は許可されますが、
  • リストは、上記以外の形式で取得することもできます(例:(1 2 3 3 6)または{1;2;3;3;6}など)。
  • 1表すことができ1/1
  • 印刷する代わりに、適切な文字列を返すことができます。
  • 間違った入力を処理する必要はありません。
  • 最短コードが勝ちます。

どの値の範囲をサポートする必要がありますか?
ブラッドギルバートb2gills

@ BradGilbertb2gills少なくとも-30 000から30000と言いますが、それがいくつかの言語にとって余分な問題になるかどうかはわかりません。したがって、選択した言語の標準の整数範囲のみである可能性があります。

PrzemysławPは、「選択した言語の標準整数の範囲は、」良いアイデアではないと言って、@、いくつかの言語は、ブール値などの標準的な整数を持っている
フェリペ・ナルディバティスタ

ありがとうございました!@ BradGilbertb2gillsその後、少なくとも-30

[1, 2] [2, 9] [3, 3] ...代わりに分数を取得できますか?
オリビエグレゴワール

回答:


1

M12 11バイト

÷µFj”+;”=;S

これは二項リンクです。バグが原因で、完全なプログラムとして機能しません。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.

プログラムの4分の1以上が「=」を追加するのが好きです。:)
Computronium

7

ルビー2.4、54の 53文字

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

おかげで:

ルビー、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バイト節約できます。
バリューインク

@ValueInkに感謝します。私はそれが可能かもしれないと疑っていました、ローカルでもTIOでも2.4を持っていませんでした。
マナトワーク

1
ええ、具体的には2.4をインストールしたので、sumハハでソリューションをテストできます。また.map{|i,j|i.to_r/j}、1バイト短いことを思い出しました
値インク

ど 私は通じ様々なアプローチを試みた.to_fと分裂を、しかし、分割すると考えられていなかったRationalFixnum。再びありがとう、@ 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
素晴らしい!私はRowこのようなことにはそれほど便利だとは知りませんでした:)
グレッグマーティン

3

Python 3、104バイト

フェリペ・ナルディ・バティスタのおかげで9バイト。

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

オンラインでお試しください!



@FelipeNardiBatistaむいと。
リーキー修道女

変更+'='+str(sum(c)),'=',sum(c)
フェリペ・ナルディバティスタ

@FelipeNardiBatistaありがとう、また、ここではPython 3を使用しました(個人的な好みに基づいて)。
リーキー修道女


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

組み込みの分数はいや!



2

JavaScript(ES6)、111バイト

カリー構文のリストを取ります(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

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

という関数を作成します f2つのリストを挿入する場所ます。

権利なし:

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

異なるサイズを意味しますか?最初のリストは、列挙子と間違った入力で使用されていることを質問状態がingoredすることができます
BlueWizard

ただし、2番目のリストが長い場合、残りのエントリは無視されます。リストが短い場合、実行時エラーが発生します。
BlueWizard

1

Perl 6、72 バイト 65バイト

ネイティブおよび自動の合理化これを簡単にする必要がありますが、デフォルトの文字列化はまだ10進数であるため、.nudenu merator and de 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("/")

更新:不要なブラケットを削除し、より多くのスペースを削除し、よりスマートなマップを使用します。ラムダサブではないという犠牲を払って、Bradのソリューションよりもキャラクターを節約します。


サイトへようこそ!素敵な最初の答え!
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のバイトreturn$x/$t."/".$y/$t;return$y/$t>1?$x/$t."/".$y/$t:$x/$t;の出力nの代わりに、n/1


1

F#、244 241 239バイト

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

オンラインでお試しください!


1

setlX、62バイト

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

権利なし:

[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='=')

MASSfractionsクラス用の)ライブラリが必要です。関数gは、必要な出力を文字列として返します。

オンラインでお試しください!(Rフィドルリンク)


0

MATL、32バイト

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

オンラインでお試しください!

説明

考えてみて[1, 2, 3, 3, 6][2, 9, 3, 2, 4]入力として。

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

C、171バイト

オンラインで試す

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

公理、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+ EE
  • 最後の番号を見つけ=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バイトを!

非ゴルフ

-- 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 import Data.Ratioのための%前奏曲にはされていません。
ライコニ

1
あなたは交換することにより、いくつかのバイトを保存することができ"?"++'?':
ライコニ

1
短縮は"/"++dおよびにも有効です"="++
ライコニ

1
再配置により、さらにいくつかのバイトを節約できますtail(f>>=t)++'=':(tail.t.sum)f
。–ライコニ

1
置くtail=<<には、tいくつかのより多くの節約:オンラインそれをお試しください!
ライコニ

0

Googleスプレッドシート、83 81バイト

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

Taylor Scottのおかげで2バイト節約

シートは、式の最後に2つの閉じ括弧を自動的に追加します。

2つの配列は、列との全体として入力されます。入力の下の空の行はエラーをスローします。AB


端末をドロップすることで2バイトをドロップできるはずです))
Taylor Scott
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.