如果AB在AB A中,那么是B?


44

给定两个整数A和B,如果AB(A减去B)在AB(A到B)中,则输出A,否则输出B。

“ A减B”是标准减法。

“ A到B”是从A到B的整数范围,包括A和B。例如:

1 to 4: 1, 2, 3, 4
-2 to 5: -2, -1, 0, 1, 2, 3, 4, 5
3 to -1: 3, 2, 1, 0, -1
7 to 7: 7

以字节为单位的最短代码获胜。

测试用例

A B Output
1 4 4
-2 5 5
3 -1 -1
7 7 7
90 30 90
90 -30 -30
-90 30 30
-90 -30 -90
-2 -2 -2
-2 -1 -2
-2 0 -2
-2 1 1
-2 2 2
-1 -2 -2
-1 -1 -1
-1 0 -1
-1 1 1
-1 2 2
0 -2 -2
0 -1 -1
0 0 0
0 1 1
0 2 2
1 -2 -2
1 -1 -1
1 0 1
1 1 1
1 2 2
2 -2 -2
2 -1 -1
2 0 2
2 1 2
2 2 2

原始聊天迷你挑战

Answers:


44

Python,27个字节

lambda a,b:[a,b][2*b*b>a*b]

在线尝试!

一个算术公式。为什么求反2*b*b>a*b等于问题条件a-b in symrange(a,b)

请注意,这x in symrange(a,b)等效于0 in symrange(a-x,b-x)。将此应用于x=a-b给出0 in symrange(b,2*b-a)。该值0包括在间隔中,除非它在两个正值或两个负值之间延伸。可以将其算术地表述为“其乘积b*(2*b-a)不是正数。

最后,取b*(2*b-a)<=0并重写为2*b*b<=a*b。通过翻转和切换大小写<=来保存一个字节>


10

果冻,5个字节

_erị,

在线尝试!

这个怎么运作

_erị,  Main link. Arguments: a, b

_      Subtraction; Yield a-b.
  r    Range; yield [a, ..., b].
 e     Exists; yield 1 if a-b belongs to [a, ..., b], 0 if not.
    ,  Pair; yield [a, b].
   ị   At-index; yield the element of [a, b] at index 1 (a) or index 0 (b).

8

05AB1E,7个字节

码:

DŸ¹Æå_è

使用CP-1252编码。在线尝试!

说明:

D         # Duplicate the input.
 Ÿ        # Inclusive range.
  ¹Æ      # Push the input [a, b] and compute a - b.
    å     # Check if the number exists in the range.
     _    # Boolean negate
      è   # Index at the first input

1
@Okx CMC请求布尔值。
丹尼斯


6

JavaScript(ES6),24个字节

a=>b=>[a,b][2*b*b>a*b|0]

测试用例

let f = a=>b=>[a,b][2*b*b>a*b|0]
let tests = [[1,4,4],[-2,5,5],[3,-1,-1],[7,7,7],[90,30,90],[90,-30,-30],[-90,30,30],[-90,-30,-90],[-2,-2,-2],[-2,-1,-2],[-2,0,-2],[-2,1,1],[-2,2,2],[-1,-2,-2],[-1,-1,-1],[-1,0,-1],[-1,1,1],[-1,2,2],[0,-2,-2],[0,-1,-1],[0,0,0],[0,1,1],[0,2,2],[1,-2,-2],[1,-1,-1],[1,0,1],[1,1,1],[1,2,2],[2,-2,-2],[2,-1,-1],[2,0,2],[2,1,2],[2,2,2]]
tests.map(test => `f(${test[0]})(${test[1]}) == ${test[2]}`).forEach(test => console.log(test, eval(test)))


4

Python 2,37个字节

lambda*s:s[min(s)<=s[1]-s[0]<=max(s)]

调用为f(B, A)


4

Python2,55个 52 51字节

lambda A,B:[B,A][A-B in range(min(A,B),max(A,B)+1)]

在线尝试!

按照TIO的建议,处理OP提到的每个测试用例(在发布时)。


4

的JavaScript ES6,40 37个字节

a=>b=>a-b<(a<b?a:b)|a-b>(a<b?b:a)?b:a

解释:

a=>b=>                                   take a and b as inputs
      a-b<(a<b?a:b)                      if a-b is less than the lowest of a and b
                   |a-b>(a<b?b:a)        or a-b is greater than the largest of a and b
                                 ?b      return b
                                   :a    else return a

感谢Arnauld,节省了3个字节。

f=a=>b=>a-b<(a<b?a:b)|a-b>(a<b?b:a)?b:a

function t(){
    var tests = [[1,4,4],[-2,5,5],[3,-1,-1],[7,7,7],[90,30,90],[90,-30,-30],[-90,30,30],[-90,-30,-90],[-2,-2,-2],[-2,-1,-2],[-2,0,-2],[-2,1,1],[-2,2,2],[-1,-2,-2],[-1,-1,-1],[-1,0,-1],[-1,1,1],[-1,2,2],[0,-2,-2],[0,-1,-1],[0,0,0],[0,1,1],[0,2,2],[1,-2,-2],[1,-1,-1],[1,0,1],[1,1,1],[1,2,2],[2,-2,-2],[2,-1,-1],[2,0,2],[2,1,2],[2,2,2]];
    for (var test of tests) {
        console.log(`f(${test[0]},${test[1]}) == ${test[2]}`, f(test[0])(test[1])==test[2]);
    }
}

t();



2

R,49 30 28字节

pryr::f("if"(2*b*b>a*b,b,a))

使用@xnor的逻辑来确定ab是否在a:b中。


通常允许使用未命名的功能
MickyT

您可能会使用pryr::f(match(a-b,a:b,b))
mnel

@mnel感谢您的分享,我之前不知道%in%的工作方式;但是只要ab中的ab都失败了。f(-90,-30)= 31
BLT

确实。`pryr :: f(match(ab,a:b,0)+ b)修复了该问题(并仍保存了一个字节。)
mnel

2

Clojure,71 41字节

使用<=min/ max而不是ranges -30个字节。

#(if(<=(min % %2)(- % %2)(max % %2))% %2)

检查是否(a - b)在从a到范围内,并相应地b调度返回。

(defn eh [a b]
  ; <= accepts any number of argments, and ensures all fall within the range
    (if (<= (min a b) (- a b) (max a b))
      a
      b))

2

PHP(7.1),55个字节

使用新的数组解构语法:

[,$a,$b]=$argv;echo in_array($a-$b,range($a,$b))?$a:$b;

与一起运行-r,提供数字作为命令行参数。


2

PowerShell37 35 32字节

($a,$b=$args)[$a-$b-notin$a..$b]

在线尝试!

使用-notin运算符将问题从字面上转换为PowerShell 。通过使用多次分配和封装节省了三个字节。之所以有效,是因为它-具有比更高的运算符优先级-notin,并且( )代码的该部分首先被执行并作为数组返回@($a,$b)。但是,由于$a,$b不是$b,$a,我们需要使用-notin来翻转/翻转输出结果。


1

批处理,107字节

@set/aa=%1,r=b=%2,x=a-b
@if %a% gtr %b% set/aa=b,b=%1
@if %a% leq %x% if %x% leq %b% set/ar=%1
@echo %r%



1

> <>,21个字节

利用@xnor的把戏。我们-v B A用来预填充堆栈。(-v A B是+1个字节)。

:01pr:11p::2**r*)1gn;

在线尝试!

说明

                        Input: [B, A] on stack.
:01pr:11p::2**r*)1gn;
:                       Duplicate.           [B, A, A]
 01p                    Push A to [0,1].     [B, A]
    r                   Reverse              [A, B]
     :                  Duplicate.           [A, B, B]
      11p               Push B to [1,1].     [A, B]
         ::             Duplicate x 2.       [A, B, B, B]
           2            Push 2.              [A, B, B, B, 2]
           2**          Compute 2*B*B.       [A, B, 2*B*B]
              r         Reverse.             [2*B*B, B, A]
               *        Compute A*B.         [2*B*B, A*B]
                )       >                    [2*B*B > A*B]
                 1      Push 1.              [2*B*B > A*B, 1]
                  g     If 2*B*B > A*B
                         get B, else get A.  [2*B*B > A*B ? B : A]
                   n    Output as number.
                    ;   Terminate.

1

红宝石27 22字节

->a,b{(b*a<2*b*b)?b:a}

在线尝试!

这里没有创新。它背后的简单数学:

(A<=A-B<=B or B<=A-B<=A)

可以写成

(B>=0 and A>=2B) or (B<=0 and A<=2B)

即:如果A-2B与B具有相同的符号,则我们在范围内。


1

SpecBAS-38个测试

1 INPUT a,b: ?IIF(a-b IN [a TO b],a,b)

IIF 是内联IF-THEN-ELSE,以打印正确的值。


1

Haskell,21个字节

a!b|b*a<2*b*b=b|0<1=a

在线尝试!

可读的

func :: Int -> Int -> Int
func a b
    | b*a < 2*b*b = b
    | otherwise = a

说明

使用@xnor的公式检查ab是否在范围内。除此之外没有什么特别的。


1

Haskell,58个字节

就在最近,我再次爱上了箭。不幸的是,它们要求我们使用元组而不是二进制函数。当然,Haskell不具有对称range函数。

import Control.Arrow
u=uncurry
app<<<elem.u(-)&&&(u enumFromTo<<<u min&&&u max)



1

Nim,60个字节

proc f(a,b:int):int=
  if a-b in min(a,b)..max(a,b):a else:b

在线尝试!

就答案而言,这是相当标准的,这没有什么大把戏。


1

斯威夫特 -38 30 22字节

@Matt节省了8个字节

print(a...b~=a-b ?a:b)

在IBM Swift Sandbox在线上尝试一下!


或21个字节:

(由于@xnor的公式),并感谢@Matt节省了8个字节

print(2*b*b>a*b ?a:b)

Swift不是打高尔夫球的最佳语言(非常严格),因此,如果您看到其他打高尔夫球的机会,我将完全编辑答案。


为什么不将三元数放在print内,例如print(a ... b〜= ab?a:b)
马特

哦,是的,好的ideA。感谢@Matt
先生17年

1

Java 7,84 60 58字节

int c(int a,int b){return(a<b?a:b)>a-b|(a<b?b:a)<a-b?b:a;}

Java 8,37字节

a->b->(a<b?a:b)>a-b|(a<b?b:a)<a-b?b:a

说明:

int c(int a, int b){          // method with two integer parameters and integer return-type
  return (a<b ? a : b) > a-b  //  if smallest of the input is larger than a-b
       | (a<b ? b : a) < a-b  //    or if the largest of the input is smaller than a-b
    ? b                       //   return b
    :                         //  else
      a                       //   return a
}                             // end of method

测试代码: 在这里尝试。


1

Ti-Basic(TI-84 Plus CE),26 24 23字节

Prompt A,B
A-B≥A and A-B≤B
AAns+Bnot(Ans

TI-Basic是一种标记化语言;使用的所有令牌均为一字节令牌

Prompt 提示您输入两个数字。

A-B≥A and A-B≤B检查AB是否在A和B之间(包括A和B);如果为true,则返回1,如果为false,则返回0,并将其存储到中Ans

由于如果AB在A和B之间,我们将返回A,所以我们将A乘以Ans,如果我们应该返回A,则它将为A,否则将为0。

接下来,我们添加Bnot(Ans到它。如果Ans为1(真),我们not(将得到0,因此我们的总和为A。如果Ans为0(伪),我们not(将得到1,然后将其乘以B并加到0得到B。

TI-Basic中的最后一个评估隐式返回。

-2个字节,感谢Scott Milner


您可以节省两个字节,方法是不将第三行存储到第四行中,Y而只Ans在第四行中使用。
Scott Milner

1

Pyt,32字节

←Đ←Đ3Ș⇹Đ3ȘĐ4Ș3Ș-3Ș⇹Ř∈Đ3Ș⇹¢*3Ș⇹*+

将stdin中的A和B作为两个单独的输入

说明:

AABB-> ABBA-> ABAB-> ABABB-> ABBBA-> ABBBAA-> ABAABB-> ABABBA-> ABABC-> ABCBA-> ABCAB-> ABC [A,...,B]-> ABD-> ABDD- > ADDB-> ADBD-> AD {B *(1-D)}-> {B *(1-D)} AD-> {B *(1-D)} + {A * D}

其中:C = BA和D =C∈[A,...,B](如果为true,则为1,如果为false,则为0)


0

欧姆,10字节(CP437)

可能有一个更加高尔夫球手的方法,但是Ruby的严格类型化的特性使这一点变得困难。

G┼┘-îε?┼¿┘

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.