不適切な分数に対する混合数


19

不適切な分数に対する混合数

この課題では、混合数値を不適切な分数に変換します。

不適切な分数はより少ない数を使用するため、コードはできるだけ短くする必要があります。


4 1/2
9/2

12 2/4
50/4

0 0/2
0/2

11 23/44
507/44

仕様

入力の分母が0になることはないと想定できます。入力は常にx y/z、x、y、zが任意の非負整数である形式になります。出力を単純化する必要はありません。


これはので、バイト単位の最短コードが優先されます。


5
タグ「解析」を追加する必要があります。ほとんどの答えは、数学を行うよりも入力の解析と出力のフォーマットに多くのバイトを費やすと確信しています。
nimi

3
出力を有理数型にすることはできますか、それとも文字列にする必要がありますか?
マーティンエンダー

2
@AlexA .: ...しかし、挑戦の大部分。その説明によると、このような場合にタグを使用する必要があります。
nimi

7
ことができxyかつz負になりますか?
デニス

2
私が想定している課題に基づきますが、入力形式「xy / z」は必須ですか、それともスペースを改行にしたり、x,y,z入力を分離したりできますか?ほとんどの回答では、入力形式が実際に必須であると想定していますがx y/z、一部は必須ではないため、この質問には明確な回答が必要です。
ケビンクルーッセン

回答:


1

Japt、10バイト

Woohoo、現在CJamを破っています!

U*W+V+'/+W

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

使い方

       // Implicit: [U,V,W] = eval(input). This automatically discards the slash.
U*W+V  // Calculate the new numerator: (whole part * denominator) + numerator.
+'/+W  // Add the slash and the denominator.
       // Implicit: output last expression

昨日、かなりの時間を費やして、答えから15人の担当者を獲得した方法を見つけようとしました。\ o /
ETHproductions


7

CJam、16 15 14バイト

l'/']er~:Xb'/X

または

l'/']er~_@b'/@

ここでテストしてください。

説明

l      e# Read input.
'/']er e# Replace the "/" with a "]".
~      e# Evaluate the string as code. If the input was "i n/d", this pushes [i n] d.
:X     e# Store the denominator in X.
b      e# Treat [i n] as base-d digits. This effectively computes i*d + n.
'/     e# Push a slash.
X      e# Push the denominator.

もう1つのバージョンでは、スタックシフトをもう少し使用することで、変数の使用を避けています。


CJamで基本変換を使用し始める必要があります。
エソランジングフルーツ

代替バージョン:'//~\S/1$b'/@、これは13バイトです。編集:ああ、入力を忘れましたl
クロム

4

Mathematica、58バイト

ToExpression@StringReplace[#," "->"+"]~ToString~InputForm&

これは、単純化された結果を返します。文字列の代わりに有理数を出力するのが適切な場合、19バイトを節約できます。

ToExpression@StringReplace[#," "->"+"]&

4

PowerShell、47 44 42バイト

取り消し線44はまだ通常の44です;(

$l,$n,$d=$args-split'\D';"$(+$l*$d+$n)/$d"

regexを使用して数バイトをゴルフしました-split。正規表現を交換して、TessellatingHecklerにさらに感謝しました。

$args-split'\D'私たちの入力引数を取り、数字以外の文字に分割されます。ここでは、2つの分割を実行します。1つは空白で、もう1つは/キャラクターでです。結果は、同時割り当てを使用して3つの変数に保存されます。次に、文字列出力を($left数$dx分母+ $n分子)として、コードブロック、/スラッシュ、そして$d再び分母として実行します。


こんにちは、-split ' |/'「this | or thatのいずれかに一致する」正規表現で1文字を保存するか-split '\D'、数字以外で分割して2文字をs(h)ave するために使用できると思います。@Downgoatが出力形式でわずかに柔軟である場合、'{0}*{2}+{1};{2}'-f($args-split'\D')|iex40バイトであり、数値が上下に均等であるため、出力が大幅に低下します。
TessellatingHeckler

1
@TessellatingHeckler正規表現アシストをありがとう。Downgoatに入力を依頼しました。しかし$l,$n,$d=$args-split'\D';+$l*$d+$n;$d、37でさらに短く、論理的にはここと同じパターンに従います。
AdmBorkBork

そうそう、数学だけ!(それもPerlの答えを打つのに十分でしょう)
TessellatingHeckler

3

Java、10フィートレーザーポール 1.03、79 + 25(インポート)= 104バイト

が必要です import sj224.tflp.math.*;

String m(String[]a){return ""+new BigRational(a[0]).add(new BigRational(a[1]));}

これはほぼ確実に1.04でも動作しますが、ビルドパスでJavaプロジェクトが1.03でセットアップされているため、1.03でしかテストしていません。


3

JavaScript(ES6)、44 41バイト

m=>([x,y,z]=m.match(/\d+/g),+y+x*z+"/"+z)

@ETHproductionsのおかげで3バイト節約できました

説明

とても簡単です。

m=>
  ([x,y,z]=m.match(/\d+/g), // x, y and z = numbers from input
    +y+x*z                  // numerator
    +"/"+z                  // denominator
  )

テスト

テストは、ほとんどのブラウザで機能するように割り当てを破壊することなく行われます。


いいね!あなたは使用することができます[p,q,r]=の代わりにp=、次に置き換える、p[0]p[1]、とp[2]してpqおよびrそれぞれ。この変更の後、私は41を得る:m=>([p,q,r]=m.match(/\d+/g),+q+p*r+"/"+r)
ETHproductions

@ETHproductionsヒントをありがとう!実際に、破壊的な割り当てを使用することを検討しましたが、Chromeでは機能せず、テストするためのFirefoxが手元にありませんでした。:P
user81655

私の最初の取り消し線44!:D
user81655

あなたは使用することができm.split(/\W/g)、バイト保存する代わりに
KritixiのLithos

2

ジュリア、58 50バイト

s->eval(parse((r=replace)(r(s," ","+"),"/","//")))

これは、文字列を受け取り、Rationalタイプオブジェクトを返す匿名関数です。呼び出すには、名前を付けf=s->...ます。

入力をわずかに操作して、合理的と評価される式にすることができるという事実を利用できます。特に、整数と有理数は有理数であり、有理数は二重スラッシュで示されます。だから私たちが4 1/2になったら4+1//2、評価した結果になります9//2

ゴルフをしていない:

function f(s::AbstractString)
    # Replace the space in the input with a plus
    r1 = replace(s, " ", "+")

    # Replace the / with //
    r2 = replace(r1, "/", "//")

    # Parse the resulting expression as a rational
    return eval(parse(r2))
end

2

Smalltalk – 76文字

入力は、Smalltalkの配列区切り文字と固有の小数表現に正確に一致します。それがそれほど冗長ではなかったら、それは真剣な候補だったかもしれません!

Compiler evaluate:'|p|p:=0.#(',FileStream stdin nextLine,')do:[:q|p:=p+q].p'

単純化は必須ではなく、Smalltalkが自動的に行います。


2

Bash + coreutils、28

dc<<<${@/\// }sarla*+n47Plap

$@すべてのコマンドラインパラメータに${@/\// }展開するため、すべてのコマンドラインパラメータに展開され、に/置き換えられます。これはdcのスタックに置かれます。残りは単純なスタック操作と算術です。


2

Haskell74 67 63バイト

r=read
f x|(a,(c,s:d):_)<-lex<$>lex x!!0=show(r a*r d+r c)++s:d

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

説明

以下のようH.PWizを考え出し我々はそれの部分に文字列を分割するためにここにHaskellのレクサーを使用することができます。(以前私が使っていたspan(>'/'))とLaikoniは指摘している<$>だけのような作品mapSndからData.Tuple

パターンガードはコードを使いたい3つの数字に分解しますlexlexhaskellのレクサーを呼び出して、最初のトークンを打ち切ります。文字列を解析する可能な方法を表す各要素のリストを返します。これらの要素はタプルで、最初の要素は最初のトークンで、残りの文字列は2番目の要素です。入力形式は非常に規則的であるため、解析は1つだけになるため、常に最初の解析を使用できます。最初に行うことはlex、入力で呼び出すことです

lex x

次に、リストから展開して2タプルを作成します

lex x!!0

最初のトークンは、混合分数の全体であり、分数の前にスペースを追加して解析します。次にタプルが存在Functorsするため(<$>)、エイリアスを使用してタプルの2番目の要素fmapに適用できますlex

lex<$>lex x!!0

これはスペースを食いつぶし、次のトークンである分数の分子を区切ります。次に、を使用してこれをパターンマッチにバインドし<-ます。私たちのパターンは

(a,(c,s:d):_)

a最初のトークンである分数の全体を取得します。:_は、2番目のから生じたリストのラップを解除しますlexc字句解析した2番目のトークン、つまり分数の分子を取得します。残っているものはすべてバインドさs:dれ、最初の文字に分割されます。/で、残りは分母になります。

入力を解析したので、実際の計算を行います。

show(r a*r d+r c)++s:d

r先ほどバインドした読み取り関数はどこにありますか。

lex失敗した場合は空のリストを返し、成功した場合は空ではないことに注意することが重要です。なぜこれがMaybe私にはわからないのですか?



@ H.PWizこれは、lexの優れた使用法です。
小麦ウィザード


2
/
H.PWiz


1

Javascript ES6、62バイト

p=prompt;b=p(a=+p()).split`/`;alert((+b[1]*a+ +b[0])+"/"+b[1])

1
かなりいい!いくつかのヒント:あなたが使用できる[b,c]=の代わりにb=使用し、その後、bの代わりにb[0]cの代わりにb[1]。:あなたがすべてで括弧を必要としないので、また、あなたは、式を並べ替えることができますp=prompt;[b,c]=p(a=+p()).split/;alert(+b+c*a+"/"+c)
ETHproductions

1

Perl、82 61 38バイト

#!perl -paF/\D/
$_=$F[0]*$F[2]+$F[1]."/$F[2]"

これはおそらくもっとゴルフできるでしょう。

変更点

  • で正規表現を使用して16バイトを節約しsplit、の<>代わりにを使用して5 バイトを節約しました<STDIN>
  • デニスのおかげでさらに16バイト節約できました。

shebang #!perl -paF/\D/(9バイト)を使用すると、を使用できます$_=$F[0]*$F[2]+$F[1]."/$F[2]"
デニス

@Dennisそれを追加しました。ありがとう!
ASCIIThenANSI

#!perlシバンの一部と改行はカウントされません。これはわずか38バイトです。
デニス

@デニスああ、OK。今すぐ修正します。(明るい面では、これは2番目に短い非難解な答えだと思う)
ASCIIThenANSI

1

Mathematica、51バイト

Interpreter["ComputedNumber"]@#~ToString~InputForm&

興味深いことに、Mathematicaはこれをビルトインでサポートしています。数値の出力が許可されている場合、必要なのは28バイトだけです。

Interpreter@"ComputedNumber"

1

Java(登録商標)、159の 148 142 120 110バイト

String m(String[]a){Long b=new Long(a[0]),d=new Long((a=a[1].split("/"))[1]);return b*d+new Long(a[0])+"/"+d;}

FlagAsSpamのおかげで大量のバイトを節約できました。


@FlagAsSpam完了。
SuperJedi224

@FlagAsSpamしかし、変数は宣言されないままになります!
SuperJedi224

私が言ったことをすべて無視してくださいLong b=new Long(a[0]),c=new Long((a=a[1].split("/"))[0]),d=new Long(a[1]);
-Addison Crump


1

05AB1E17 15 バイト

#`'/¡R`Š©*+®'/ý

@MagicOctopusUrnのおかげで-2バイト。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

#`         # Split input by spaces and push all items to the stack
           #  i.e. "4 1/2" → "4" and "1/2"
  '/¡      # Push the second item by "/"
           #  i.e. "1/2" → [1,2]
     R`    # Revert the list, and also push all items to the stack
           #  i.e. [1,2] → [2,1] → 2 and 1
Š          # Triple-swap the stack
           #  [4,2,1] → [1,4,2]
 ©         # Store the 2 in the register
  *        # Multiple the top two items
           #  4 and 2 → 8
   +       # Add the top two items
           #  1 and 8 → 9
®          # Push the 2 from the register to the stack again
 '/ý       # Join the two items by "/"
           #  9 and 2 → "9/2"

柔軟な入力および出力フォーマットでは、整数を順序どおりに取り、x,z,y分母と分母を別々の行に出力すると、4バイトになります(これが、チャレンジにタグを追加した理由です。):

*+²»

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

*        # Multiply the first two inputs (x and z)
         #  i.e. 4 and 2 → 8
 +       # Add the third input (y)
         #  i.e. 8 and 1 → 9
  ²      # Take the second input again (z)
   »     # Join the stack by newlines and implicitly print it

@MagicOctopusUrnありがとう。ただし、入力形式はチャレンジの説明とは異なります。どうやら、4 1/2この特定の課題には形式(単一の文字列)が必須です。そうでなければ私は4バイトのバージョンを使用しているだろう(または出力が必須でしたが、入力柔軟な、私はこの6 byter使用している場合:*+'/²J
ケビンCruijssen


@MagicOctopusUrnああ、「すべてのアイテムをaスタックにプッシュする」ことすら知りませんでした。..o。thisこのチャレンジにまさに必要なものです!そして、「/」による結合によりスマートになります。ありがとう!:)
ケビンクルーッセン

「a」のすべてのアイテムをスタックにプッシュするコマンドは「 `」であり、インラインコードタグで調整できないため、使用するのは嫌です。
魔法のタコ

ええ@MagicOctopusUrn、それは私が「引用された理由です(コメント欄にも少し迷惑なんだのすべての項目を押してaスタックに代わりに使用するのでは」'`'...
ケビンCruijssen


1

スタックス、1バイト

+

実行してデバッグします(ただし、デバッグすることはあまりありません)

チャレンジ仕様には、「出力を単純化する必要はありません」とあります。単純化できると仮定すると、これを行うためのstaxに組み込みの命令があります。入力は、整数と有理数として暗黙的に解釈されます。+命令は、有理数に両方広がっ追加し、簡素化します。結果は暗黙的に出力されます。


1

-la -Mfeature = sayを使用したPerl 5、32 バイト 25バイト

m|/|;say$_*$'+$F[1],"/$'"

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

(Dom Hastingsのおかげで7バイト)

$_は、数値コンテキスト(ここのような)x y/zの値を評価するinput全体です。ここでは後に来るものは何でも含まれている正規表現試合後の文字列は、ある-そう、。値を取得するには、入力をスペースで分割して配列に配置するフラグを使用します。したがって、ここで、これは、数値コンテキストで評価することを意味します(これは、の最初の連続した数字のシーケンスであるため)。x*$'/zy-a@F@F = ("x", "y/z")$F[1]="y/z"yy$F[1]


-pバイトカウントでフラグをカウントする必要はありません。代わりに、言語をとしてカウントしますPerl 5 with -p flag, 32 bytes。現在のコンセンサスについては、このメタ投稿をご覧ください。
ジュゼッペ

素敵なアプローチ!私はこれを少し試してみて、25バイトバージョンを作成することができましたオンラインで試してみてください!。使用すること$'が唯一の本当の違いでした!
ドムヘイスティングス

文字列の一部を取得するために正規表現$'-a-の両方を使用する組み合わせ$F[n]は、かなり良いアイデアです、私はそれを覚えておく必要があります!ありがとう、投稿を更新しました。
スンダ

0

Lua、123バイト

m=io.read()z=string x=z.find c=z.sub b=tonumber s=x(m," ")f=x(m,"/")d=c(m,f+1)print(b(c(m,1,s))*b(d)+b(c(m,s,f-1)).."/"..d)

0

天の川1.6.0、31バイト

'" "\="/"\=>;<A;A;:>*;A+"/"+<+!

思ったよりずっと長くなってしまいました。


説明

'" "\="/"\=>;<A;A;:>*;A+"/"+<+!

'                                # read input from the command line
 " "  "/"               "/"      # push a string to the stack
    \    \                       # split the STOS at the TOS
     =    =                      # dump the TOS to the stack
           >       >             # rotate the stack rightward
            ;  ; ;   ;           # swap the TOS and STOS
             <              <    # rotate the stack leftward
              A A     A          # push the integer representation of the TOS
                  :              # duplicate the TOS
                    *            # multiply the STOS by the TOS
                       +   + +   # add the TOS and STOS
                              !  # output the TOS

使用法

./mw <path-to-code> -i <input>


0

C、64

main(i,d,n){scanf("%d %d/%d",&i,&n,&d);printf("%d/%d",i*d+n,d);}

STDINから入力を読み取ります。かなり自明だと思います。


0

チェック、120バイト

>]+>:>32r#v
#d@0+\)  ##:>4;:>5'=:>48-\R-?
dd)R>32-#v
#>15-#v  #?
47r@>@   #v
#dd#v #?
r@>@     #v
    #\d@\: @*@+pd"/"op

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

解析ループ(2行目)を再利用しないことで、いくつかのバイトを節約できる場合があります。そうすれば、ループをより具体的にすることができ、条件の膨大な混乱を回避でき、レジスタを他のことに使用できます。



0

C#、112バイト

s=>{string[]a=s.Split(),b=a[1].Split('/');int o=int.Parse(b[1]);return int.Parse(a[0])*o+int.Parse(b[0])+"/"+o;}

フル/フォーマット済みバージョン:

namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func<string, string> f = s =>
            {
                string[] a = s.Split(), b = a[1].Split('/');
                int o = int.Parse(b[1]);
                return int.Parse(a[0]) * o + int.Parse(b[0]) + "/" + o;
            };

            Console.WriteLine(f("4 1/2"));
            Console.WriteLine(f("12 2/4"));
            Console.WriteLine(f("0 0/2"));
            Console.WriteLine(f("11 23/44"));

            Console.ReadLine();
        }
    }
}


0

PHP、65バイト

オンラインで試す

コード

<?=(($a=preg_split("/[\s,\/]/",$argv))[0]*$a[2]+$a[1])."/".$a[2];

説明

$a=preg_split("/[\s,\/]/",$argv); # Split the string on "/" and " "
(($a)[0]*$a[2]+$a[1]) # as always denominator*whole number + numerator 
."/"                  # echo an slash
.$a[2];               # echo de denominator

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