混合分数の平等


15

小学校では、子どもたちは分子が分母より小さく、したがって分数の値が1より小さい適切な分数について学びます。後で、分数の値が1より大きい分数と、これらの分数を表す2つの異なる方法:混合分数と不適切な分数について教えます。

混合分数が与えられた場合、整数値と分子が連結された不適切な分数に等しいかどうかを判断します。たとえば、入力の1 3/4場合、不適切な分数は13/4です。

テストケース

1 3/4        -> falsey
1 3/10       -> truthy
6 6/7        -> falsey
55 55/100    -> truthy
4 9/100      -> falsey
40 9/100     -> falsey
7 49/1000    -> falsey
9 1/2        -> falsey
999 999/1000 -> truthy
1 21/200     -> falsey
1 21/101     -> falsey

入力については、整数部分と小数部分を別々の入力として使用できますが、小数を2つの部分として入力として使用することはできず、小数として使用することもできません。使用する必要がない場合は、整数部分を削除することができます(入力として使用しないでください)。


分数を単純化する必要がありますか?4番目のテストケースのように54/100単純化するために偽になります27/50
ジョーキング

1
出力は、2つの別個の一貫した値か、場合によっては一貫性のない真実/偽の値である必要がありますか?
ルイスメンドー

1
ちなみに、4番目のテストケースを55に修正して55/100も問題は変わりません- に簡略化することもできる11/20ので、@ JoKingが提起した同じ質問がそこに生じます。
スンダ

3
「分数を2つの部分に分けて入力することはできません」-なぜですか?それはまさに/:/
ジョナサンアラン

11
これは、「重要ではない入力と、スラッシュで区切られた文字列としての2つの数値を与え、2番目の数値が10の最初の数値の長さの累乗に等しいかどうかを判断する」と同等のようです。
xnor

回答:



8

Perl 6の16の 12バイト

{1+$_==1~$_}

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

分数を表す文字列として入力を受け取ります。Perl 6の動的型付けが合理的な分数の文字列を処理できることが判明しました。そのため、文字列"1/10"は数値に強制されたときに戻ります0.1

匿名コードブロックは、分数と1が分数に連結されたものに等しいかどうかを単純にチェックします。整数部分が重要でないことを示してくれたxnorのPythonの回答に感謝します。

古いソリューション、27 26バイト

{.nude[0]==.Int~[%] .nude}

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

入力を合理的な混合分数として受け取り、trueまたはfalseを返します。4番目のテストケースは単純化できるため、falseを返します。

説明:

.nudeのリストを返します[numerator, denominator]

{                        } # Anonymous code block
 .nude[0]    # Check if the numerator of the mixed fraction
         ==  # Is equal to
           .Int  # The integer part of the fraction
               ~ # Concatenated to
                [%] .nude  # The numerator modulo the denominator
                           # And return implicitly

7
私はそれ.nudenu merator + de nominatorにちなんで名付けられたと推測していますが、誰かがそれをそれを呼ぶことができることでおそらく大きな喜びを感じたでしょう。
18

1
私はそれを単一の文字列として'1 3/10' {S/\s//==.words.sum}
扱ったものを使用するつもりでした

6

網膜0.8.217の、16バイト

(.)+/1(?<-1>0)*$

オンラインでお試しください!分数部分のみが必要なため、リンクされたテストスイートはテストケースから整数を削除します。説明:分母が10の累乗で、分子が分母のゼロごとに1桁の場合にのみ、不適切な連結は混合数と等しくなります。.NETのバランスグループは、十分な桁数があることを確認するために使用されます。編集:@sundarのおかげで1バイト保存されました。


では機能しません1 11/10。メソッドではなく実装に問題があるようです
H.PWiz

1
「使用する必要がない場合は、整数部分をドロップすることができます(入力として使用しないでください)。」-したがって、入力を分数のみに変更する場合、先頭のスペースは不要です。
スンダ

1
@ H.PWiz分子が分母よりも大きい入力を処理する必要はないと思います(これらは分数として表される非整数の小数部分のみを持つ混合分数であるため)。しかし、私はOPにそれを確認するように頼みます。
スンダ-モニカを復元18年

@sundar ^代わりに変更する必要があるので、役に立たない。
ニール

これ/により、一致するものが明確になるため、そこにアンカーが必要になるとは思いません(通常の正規表現の一致規則に従って、Retinaの専門知識はありません)。とにかく動作するようです:オンラインで試してみてください!
スンダ

6

、8バイト

§·=r¤+r+

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

説明

§(·=r)(¤+r)(+)  -- example arguments: "1" "3/10"
§               -- fork both arguments
      (¤ r)     -- | read both: 1 3/10
      ( + )     -- | and add them: 13/10
           (+)  -- | concatenate: "13/10"
                -- and do
 (· r)          -- | read the second argument: 13/10
 ( = )          -- | and compare: 13/10 == 13/10
                -- : 1


5

R78 65バイト

function(n,e=function(a)eval(parse(t=sub(" ",a,n))))e("")==e("+")

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

ジュゼッペとJayCeの両方のおかげで-13バイト!


1
ただ、sub細かいここにあります。また、t=代わりに使用することができますtext=
ジュゼッペ

1
何と言えばいい?鮮やかさ!65バイトに
-JayCe

@JayCeうれしいです!ありがとう!
ロバートS.

xnorのPython 3の答えをおそらく20バイトで移植してみてください...-JayCe
15:09




4

Brachylog、15バイト

ḍ{lᵛ&ht¬ị&t↔ị1}

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

小数部分のみを文字列入力として受け取ります。

ジュリアの答えと同じ考え方を間接的に使用します-「分母は10 ^ {分子の長さ}」は「分母は10の累乗であり、分母の長さは分子の長さ+ 「/」の長さ(つまり1)。

ḍ                   % split the input in half
 {            }     % and verify that
  lᵛ                % each half has the same length (i.e. the string had even length)
    &ht¬ị           % and the last character of the first half is 
                    %  not a number (it should be "/")
         &t↔ị1      % and the second half when reversed is the number 1
                    %  i.e. the denominator should be a power of 10

古い回答:

15 20バイト

a₀ᶠịˢtl;10↺^.&a₁ᶠịˢh

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

(@Fatalizeのおかげで1バイトですが、古いメソッドのバグを発見してから残念ながら+6バイトです。)

私のジュリアの答えと同じ考え。


1
変数Aを出力変数で置き換えることで1バイト短くすることができます.(したがってA、出力変数が暗黙的に最後にあるので最後を削除します)
致命的な

@Fatalizeありがとう、私はこれらの決定問題で出力が自由変数としてほとんど利用可能であることを忘れています。残念ながら、私は持っていたコードにバグを見つけました:数値の接頭辞と数値の接尾辞のみを要求したため、61/10(分子/接頭辞として6を2/110使用して)(分母/接尾辞として10を使用して)のようなものを渡していました。私はそれを修正しようとしましたが、これが最善の方法であるかどうかはわかりません。
スンダ

3回読んだ後でも、この課題の仕様をまったく理解していないため、あなたを助けることができるかどうかはわかりません。私の母国で「混合分数と不適切な分数」が何と呼ばれているのか、またはここで小学校で教えられているのかさえわかりません。
-14:41で

1
@Fatalizeまあまあ。チャットルームの復活に興味がありますか?興味があり、時間がある場合、私はあなたを悩ませるたくさんの質問があります。
スンダ

もちろん、modに部屋を復活させて、質問したらタグを付けてください
-Fatalize


3

クリーン、57バイト

import StdEnv,Text
$b#[u,v:_]=split"/"b
=v==""<+10^size u

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

これは少し短くなりますが、大きな分子/分母では壊れます。

クリーン77 61 60 58バイト

-1 私の他の答えに関するOMᗺのヒントのおかげ

import StdEnv,Text
$b#[u,v:_]=split"/"b
=1<+[48\\_<-:u]==v

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

これはNeilの方法を使用しており、直接行うよりも少し短くなっています。
変換のオーバーロード、といくつかの策略あります1<+[48\\_<-:u]変換[Int]する[Char]と、その後には、{#Char} (:== String)しかし、Int直接的にString

クリーン91 89バイト

import StdEnv,Text
t=toInt
$a b#[b,c:_]=map t(split"/"b)
#d=t(a<+b)
=d/c==t a&&d-d/c*c==b

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

$ :: String String -> Bool分子と分母を抽出し、整数部と分子を文字列連結し、等価性をチェックする関数を定義します。


3

05AB1E、7 バイト

'/¡ćg°Q

入力として分数のみを受け取ります。

オンラインそれを試してみたり、すべてのテストケースを検証します

説明:

'/¡        # Split the input by '/'
           #  i.e. '3/10' → ['3', '10']
   ć       # Head extracted:
           #  i.e. ['3', '10'] → 10 and 3
    g      # Take the length of the numerator
           #  i.e. '3' → 1
     °     # Take 10 to the power of this length
           #  1 → 10**1 → 10
      Q    # Check if that value equals the denominator
           #  10 and 10 → 1 (truthy)

またはより一般的な説明:

次の2つのことを検証する必要があります。

  • 分母は係数10(1, 10, 100, 1000など)ですか?
  • 分子の長さ+ 1は分母の長さと同じですか?
    • この2番目の部分は、分母がそのまま分子の長さの10乗に等しいかどうかをチェックすることで行われ、2バイトを節約します。

PS:分子と分母を別々の入力としてとることができれば、たった3バイトで十分でしょうg°Q


3

JavaScript、26バイト

カリー化構文(f(x)(y))で入力を受け取ります。ここxで、は整数でありy、文字列としての分数です。

x=>y=>x==eval(x+y)-eval(y)

オンラインで試す


3

Java 10、107 70 67 57バイト

f->new Long(f.split("/")[1])==Math.pow(10,f.indexOf("/"))

のない世界へようこそeval。..

@ChasBrownのPython 2回答のポートを作成して-40バイト。@Shaggyの
おかげで-10バイト(@ChasBrownの答えを読み、()..を使用する必要がありました。)findindexOf

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

説明:

f->                         // Method with String parameter and boolean return-type
  new Long(f.split("/")[1]) //  Take the denominator as integer
  ==Math.pow(10,            //  And check whether it is equal to 10 to the power of:
                f.indexOf("/"))
                            //   the length of the numerator-String


@Shaggy Ah、Chas Brownは私がリンクしたPython 2の回答でも同じことをしています。
ケビンCruijssen


2

Perl 5 -p、23バイト

$_=eval=~s/..//r eq$_+0

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

(OPで許可されているように)入力として小数部分のみを取り、trueの場合は1を出力し、falseの場合は何も出力しません。

$_=       # assign to be printed by -p
eval      # evaluate fraction to get 0.something, for eg. 0.54
=~s/..//r # remove the 0. part, giving 54
 eq       # string equality check
$_+0      # after first coercing input to number to remove / and denominator

分母が分子のすぐ次の10のべき乗である場合にのみ、それ自体がとる小数部分は分子と正確に等しくなります。これは確認する必要がある条件です。


2

ネーター、17バイト

I#I"/"^WL1-%WL_=P

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

説明

では、これはどのように機能しますか?テストケースを見ると、真のケースは分母が10の累乗である場合のみです。10a、 どこ a 分子の長さに1を足したもの(a=ログ10n+1、 どこ n 分子であり、 バツ フローリング機能を表します)。

I#                - Push the first input then pop it off the stack
  I"/"^           - Push the second input and split the string at "/"
       W          - Convert the top (the denominator) of the stack from a string to a number
        L1-       - Take the log 10 of the top of the stack and subtract 1 (a)
           %      - Rotate the stack
            WL_   - Convert the top of the stack (the numerator) to a number, take the log10 and floor the result (b)
               =  - Check if a and b are equal
                P - Print the top of the stack


2

R、53バ​​イト

function(n,x=el(strsplit(n,"/")))x[2]==10^nchar(x[1])

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

入力として小数部分のみを取ります。xnorがコメントで述べたように:

これは、「重要ではない入力と、スラッシュで区切られた文字列としての2つの数字を与え、2番目の数字が10の最初の数字の長さの累乗に等しいかどうかを判断する」と同等のようです。

ロバートS.の答えはゴルフっぽさは少ないが、私のものよりもはるかに興味深い。



1

Excel、52バイト

=10^FIND("/",B1)/10-MID(B1,FIND("/",B1)+1,LEN(B1))=0

整数入力を無視します。基本的に:IS Denominator = 10^LEN(Numerator)


分母の制限<10^9:48バイト:

=10^FIND("/",B1)/10-MID(B1,FIND("/",B1)+1,1E9)=0

ロジックの大部分はに分割されてい/ます。入力を個別に取得できる場合、16バイト:

=10^LEN(B1)-C1=0



1

C(gcc / clang)、59 49 47バイト

f(a,b){a=atoi(b=strchr(a,47)+1)==pow(10,b+~a);}

ポートオブチャスブラウンのPython 2 回答こちらからオンラインでお試しください

入力の整数部分を無視します。ジョナサン・フレッシュに感謝2バイトのゴルフをしてます。

ゴルフをしていない:

f(a, b) { // function returning an int and taking a string as input; also declaring another string variable
          // this abuses the parameters as much as possible, omitting the type int and implicitly converting it to char *
    a =                             // return a truthy or falsey value based on
        atoi(b = strchr(a, 47) + 1) // the denominator (as integer; 47 is the ASCII code for '/')
        == pow(10, b + ~a);         // is equal to 10 to the power of the length of the numerator-string
}

'/'ほとんどの可能性があります47
ジョナサンフレッチ


いいね、ありがとう!
OOBalance

どういたしまして。新しいバイトカウントを反映するようにヘッダーを更新するのを忘れたと思います。
ジョナサンフレッチ

1

ForceLang、86 78バイト

set a io.readnum()
set b io.readnum()
set d number.parse a+b+""
io.write d=a+b
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.