可以使用异常取消来简化分数吗?


11

异常取消(来自Wolfram Alpha):

异常抵消是分数a / b的分子和分母中a和b的数字“取消”,导致分数等于原始数。请注意,如果分子和分母中一个或多个数字存在多个但不同的计数,则对于要取消的数字有歧义,因此最简单的方法是将此类情况排除在考虑范围之外。 链接

用简单的话说,你有一个分数a / b。如果您可以抵消分数中的数字以创建另一个c / d等于原始分数(a / b = c / d)的分数,则可以使用异常抵消来简化分数。

您的挑战是制作一个程序或函数,该程序或函数以形式输入分数字符串a/b并输出或返回真实值(如果可以使用反常消除来简化分数),否则返回伪造的值。a并且b将始终为非零的正整数。a并且b将始终具有两个或多个数字。此外,所有的无论从数字a还是b不会被取消了(你不会得到输入12/21),至少一个数字从ab每次(你不会获得输入将被取消43/21),而最终的结果将永远不会0对任何ab。您的程序必须取消a和之间的所有公用数字b(即1231/1234,您必须取消了1,一2,和3)。如果有多种取消的可能性,请首先选择最左边的数字(515/25变为15/2而不是51/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
相关:codegolf.stackexchange.com/questions/37794/…巧合的是,我刚浏览了您所引用的mathworld条目=)
更加模糊的

我在515/25印象中取消到103/5?
普尔加2015年

1
@Pulga分子中的前5个将与分母中的5抵消,剩下15/2。
Alex A.

@Pulga 11和55不共享任何数字,因此无法使用此方法进一步简化。但是,使用普通的分数简化会是这种情况,但是在此挑战中,我们仅取消了数字。
GamrCorps,2015年

43/21的答案是什么?
xnor

Answers:


3

Pyth,22 19字节

感谢@isaacg提供了三个字节!

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 '16

@isaacg有趣;我想知道为什么.-FM不起作用。那么M自动启动非单函数吗?
lirtosiast '16

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

我已经去了𝔼𝕊𝕄𝕚𝕟两个月了,对我来说,这仍然像魔术一样。+1
ETHproductions 2016年

2

Ruby,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
}

非常感谢Doorknob打高尔夫球19字节。



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

1

Javascript ES6,73个字节

a=>[...a.split`/`[0]].some(x=>(e=eval)(a.replace(e(`/${x}/g`),``))==e(a))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.