異常なキャンセルを使用して分数を単純化できますか?


11

異常なキャンセル(Wolfram Alphaから):

異常なキャンセルとは、分数a / bの分子と分母におけるaとbの数字の「キャンセル」であり、結果として元の分数と等しくなります。分子と分母に1つ以上の桁の複数の異なるカウントがある場合、キャンセルする桁があいまいになるため、このような場合を考慮から除外するのが最も簡単であることに注意してください。 リンク

簡単に言えば、分数があるとしましょうa / b。分数の桁をキャンセルしてc / d元の(a / b = c / d)と等しい別の分数を作成できる場合、異常なキャンセルを使用して分数を単純化できます。

あなたの課題は、フォームに分数文字列を入力し、a/b異常なキャンセルを使用して分数を単純化できる場合は真理値を出力し、そうでない場合は偽値を返すプログラムまたは関数を作成することです。aそしてb、常にゼロ以外の正の整数になります。aそしてb常に2桁以上を持つことになります。また数字の、すべてのいずれかから、aまたはb(あなたが入力を取得文句を言わない相殺されることはありません12/21少なくとも1桁)からab(あなたが入力を取得文句を言わないたびにキャンセルされます43/21)、および最終結果はなることはありません0どちらかのためにaまたはb。あなたのプログラムは、aとの間のすべての一般的な数字をキャンセルする必要がありbます1231/1234、a 1、a 2、aをキャンセルする必要があります3。キャンセルの可能性が複数ある場合は、左端の桁を最初に選択します(515/25は51/2ではなく15/2になります)。

例:

Input      Output    Why

1019/5095  true      Remove the 0 and the 9 from both sides of the fraction to get 11/55, which is equivalent.
16/64      true      Remove the 6 from both sides, and get 1/4.
14/456     false     Remove the 4s. 14/456 is not equal to 1/56.
1234/4329  false     Remove the 2s, 3s, and 4s. 1234/4329 is not equal to 1/9.
515/25     false     Remove the first 5 from each side. 15/2 is not equal to 515/25.

これはなので、バイト単位の最短コードが勝ちです!


1
Relaticate:codegolf.stackexchange.com/questions/37794/…偶然にも、ちょうどあなたが引用している正確なmathworldエントリを紹介しました=)
flawr

インプレッションが515/25から103/5までキャンセルされましたか?
プルガ

1
@Pulga分子の最初の5は、分母の5でキャンセルされ、15/2が残ります。
アレックスA.

@Pulga 11と55は数字を共有しないため、この方法を使用してさらに単純化することはできません。ただし、通常の分数の単純化を使用するとこれが当てはまりますが、この課題では数字をキャンセルするだけです。
GamrCorps

43/21の答えは何ですか?
xnor

回答:


3

Pyth、22 19バイト

@isaacgに3バイトをありがとう!

qFcMsMM,Jcz\/.-M_BJ

説明:

qFcMsMM,Jcz\/.-M_BJ      Implicit: z=input().
       ,                 two-element list
        Jcz\/              J = split z on ','
                _BJ      Bifurcate reverse: [J,reversed(J)]
             .-M         map multiset difference of elements in both lists
                             this gives the multiset difference both ways
       ,Jcz\/.-M_BJ      On input 1019/5095: [['1019','5095'], ['11','55']]
    sMM                  convert all strings to numbers
  cM                     map by float division
qF                       fold equality

ここで試してみてください


1
m.-Fdにゴルフすることができます.-M。同様に、mcFsMdにゴルフすることができますcMsMM
isaacg

@isaacg興味深い; なぜ機能.-FMしなかったのかと思っていました。ではM、非モナド関数を自動的にスプラットしますか?
リルトシアスト

2

𝔼𝕊𝕄𝕚𝕟、17文字/ 34バイト

ïČ⍘/⎖0ⓢⓈë(ïę$)≔ëï

Try it here (Firefox only).

説明

ïČ⍘/⎖0ⓢⓈë(ïę$)≔ëï // implicit: ï = input fraction
ïČ⍘/⎖0              // get the numerator...
      ⓢ            // split it...
        Ⓢ          // and check if any of its items satisfy the condition:
          ë(ïę$)    // When the item is removed from ï,
                ≔ëï // does its fractional value still equal the original fractional value?
                    // implicit output

私はもう2か月間aroundにいましたが、それでも私には魔法のようです。+1
ETHproductions

2

ルビー、95 76バイト

->a{x,y=a.split(?/).map &:chars;eval a+".0=="+(x-y).join+?/+(y-x).join+".0"}

説明

->a{                                                    # start of lambda
      a.split(?/)                                       # splits input fraction into numerator and denominator
                 .map &:chars;                          # converts them both into arrays of digits
  x,y=                                                  # assigns the numerator to x and the denominator to y

  eval                                                  # Evaluate...
       a+".0                                            # Original fraction with a .0 attached -- this forces floating-point division
            =="                                         # Equals...
               +(x-y).join                              # Numerator: Takes the relative complement of y in x (all elements in x that are not in y) and joins the resulting array into a string
                          +?/+(y-x).join                # Denominator: Takes the relative complement of x in y and joins the resulting array
                                        +".0"           # Add a .0 to force floating-point division
}

19バイトのゴルフをしてくれたDoorknobに多大な感謝を。



1

MATL、35バイト

jtXUw'\d+'XXZ)2$XKtbm~)Kwtbm~)UwU/=

>> matl
 > jtXUw'\d+'XXZ)2$XKtbm~)Kwtbm~)UwU/=
 > 
> 1019/5095
1

>> matl
 > jtXUw'\d+'XXZ)2$XKtbm~)Kwtbm~)UwU/=
 >
> 14/456
0

説明

j              % input string
tXUw           % duplicate, convert to number, swap
'\d+'XX        % apply regexp to split at '/'
Z)             % separate cell array of strings into two strings
2$XK           % copy those two strings to clipboard K
tbm~)          % remove from denominator all chars present in the numerator
Kw             % paste both strings and swap      
tbm~)          % remove from numerator all chars present in the denoninator
UwU/=          % obtain value of "simplified" fraction and compare with original

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