混合分数等式


15

在小学,孩子们学习适当的分数,其中分子小于分母,因此分数的值小于一。后来,他们被教导有关分数值大于1的分数,以及两种不同的表达这些分数的方式:混合分数和不合适分数。

给定一个混合分数,请确定它是否等于将整数值和分子串联在一起的不正确分数。例如,对于输入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

对于输入,您可以将整数部分和分数部分作为单独的输入,但不能将分数作为两部分作为输入,也可以不将其作为十进制值。如果不需要使用整数部分,可以删除它(不要将其作为输入)。


是否应该简化分数?就像第四个测试用例一样,它被54/100简化为“ 假”27/50
Jo King

1
输出应该是两个不同的,一致的值还是任何可能不一致的真假值?
路易斯·门多

1
顺便说一下,将第4个测试用例固定为55个不会改变问题- 55/100也可以简化为11/20,因此在这里出现了@JoKing相同的问题。
sundar-恢复莫妮卡

3
“您可能无法将分数作为两部分输入”-错为什么?那正是它的/作用:/
乔纳森·艾伦

11
这似乎等效于“给定一个无关紧要的输入,并用斜杠分隔两个数字作为字符串,确定第二个数字是否等于第一个数字长度的幂10”。
xnor18年

Answers:


8

MATL,7个字节

UsGXzU=

输入是一个字符串。输出是1真实的,0是虚假的。

在线尝试!验证所有测试用例

说明

U     % Implicit input. Convert to number(s): gives a vector of two numbers
s     % Sum of that vector
G     % Push input again
Xz    % Remove spaces
U     % Convert to number
=     % Equal? Implicit display

8

Perl 6的16 12个字节

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

在线尝试!

将输入作为代表分数的字符串。事实证明,Perl 6的动态类型可以将字符串处理为有理分数,谁知道呢?因此,"1/10"当将字符串强制转换为数字时,将返回0.1

匿名代码块仅检查分数加一是否等于与分数连接的一。感谢xnor的Python回答,向我展示了整数部分无关紧要。

旧解决方案,27 26字节

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

在线尝试!

将输入作为有理混合分数,并返回true或false。对于第四个测试用例,返回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
我猜它.nude是以nu merator + de nominator 命名的,但是有人可能很高兴能够这样称呼它。
Οurous

1
我本来打算把它当作一个字符串来处理'1 3/10' {S/\s//==.words.sum}
Brad Gilbert b2gills

6

视网膜0.8.217 16个字节

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

在线尝试!只需要分数部分,因此链接的测试套件从测试用例中删除了整数。说明:仅当分母为10的幂且分子的分母中的每个零都有一个数字时,不正确的串联才等于混合数。.NET的平衡组用于验证是否存在足够的数字。编辑:由于@sundar,节省了1个字节。


不适用于1 11/10。这似乎是您的实现而不是方法的问题
H.PWiz

1
请注意,“如果不需要使用整数部分,可以删除它(不要将其作为输入)。” -因此,如果将输入更改为仅包含小数,则前导空格可能是不必要的。
sundar-恢复莫妮卡

1
@ H.PWiz我认为我们不必处理分子大于分母的输入(因为这些被认为是混合分数,只有非整数小数部分表示为分数)。但我会请OP确认。
sundar-恢复莫妮卡

@sundar我必须将其更改为^,所以它没有帮助。
尼尔

这样/就可以清楚地确定您要匹配的内容,所以我认为您不需要在那里的锚点(按照常规的正则表达式匹配规则进行操作,此处没有Retina专业知识)。似乎仍然可以工作:在线试用!
sundar-恢复莫妮卡

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("+")

在线尝试!

-13字节的感谢Giuseppe和JayCe!


1
只要sub是在这里很好。此外,您还可以使用t=,而不是text=
朱塞佩

1
我能说什么 辉煌!它很好地简化为65个字节
JayCe

@JayCe很高兴看到我在正确的页面上!谢谢!
罗伯特S.18年

您可以尝试移植xnor的Python 3答案大约20个字节...
JayCe


4

Stax,5 个字节

╡ÄLσ`

运行并调试

说明:

+yj$e= Full program, implicit input
+      Add integer and fraction part
 y     Push unparsed input
  j$   Split on spaces and flatten, i.e. Remove spaces
    e  Evaluate
     = Check for equality

4

Python 3,26个字节

lambda k:eval(k+'+1==1'+k)

在线尝试!

例如,输入3/4给出3/4+1==13/4。我们没有设置分数的全部,而是将其设置1为测试混合分数的相等性。Chas Brown的测试用例。


4

Brachylog,15个字节

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

在线尝试!

仅将小数部分作为字符串输入。

间接使用与我的Julia答案相同的想法-“分母为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

@Fatalize谢谢,我忘记了在这些决策问题中,输出几乎可以作为自由变量使用。不幸的是,我在代码中发现了一个错误:由于它只要求提供任何数字前缀和任何数字后缀,因此它传递的内容是61/10(仅使用6作为分子/前缀)2/110(仅使用10作为分母/后缀)。我已经尝试修复它,但是不确定这是否是最好的方法。
sundar-恢复莫妮卡

我不确定我能为您提供帮助,因为即使阅读3次之后,我也完全不了解该挑战的规格。我不知道在我的国家叫什么“混合分数和不正确分数”,或者甚至在这里的小学都教过。
致命的

1
@Fatalize公平。您对恢复聊天室感兴趣吗?如果您有兴趣并且有时间,我有很多问题要困扰您。
sundar-恢复莫妮卡

当然,只要问一个mod就能振兴房间并在问问题时给我


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)

或更笼统的解释:

我们必须验证两件事:

  • 分母是否为因子10(1, 10, 100, 1000等)吗?
  • 分子的长度+ 1是否等于分母的长度?
    • 第二部分是通过检查分母是否等于分子长度的幂的10来完成的,这节省了2个字节

PS:如果我们可以将分子和分母作为单独的输入,则只需3个字节就足够了:g°Q


3

JavaScript,26个字节

以currying语法(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 answer端口来增加 -40个字节。
-10个字节感谢@Shaggy(我应该更好地阅读@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答案中也有相同的答案。.不确定为什么我还没有使用它..谢谢!
凯文·克鲁伊森


2

Perl 5 -p,23个字节

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

在线尝试!

仅将小数部分作为输入(由OP允许),输出1为true,否则为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

仅当分母为比分子大十的立即数时,小数部分本身才等于分子,这是我们需要检查的条件。


2

Noether,17个字节

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

在线尝试!

说明

那么这是如何工作的呢?好吧,如果您查看测试用例,唯一正确的情况是分母为10的幂,10一种,在哪里 一种 是分子的长度加一(一种=日志10ñ+1个,在哪里 ñ 是分子, X 代表地板功能)。

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在评论中提到的:

这似乎等效于“给定一个无关紧要的输入,并用斜杠分隔两个数字作为字符串,确定第二个数字是否等于第一个数字长度的幂10”。

罗伯特·S(Robert 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

Elixir,81位元组

fn b->[n,d]=String.split b,"/";String.to_integer(d)==:math.pow 10,byte_size n end

在线尝试!

可能可以通过到达某个地方{n,"/"<>d}=Integer.parse b,但不确定如何使用。


1

2Duck,86个字节

..!x..!...,,,,[>,,,,,,,,],,,,,,,,,[v!],[v!],[v!],![v!],,,[,,[v!],[v!],[v!],[v!]<,,,]r.

在线尝试!

接受不带整数部分的输入。


1

C(gcc / clang),59 49 47字节

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

Chas Brown的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
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.