# Equal, sum or difference!

Write shortest possible code that will return true if the two given integer values are equal or their sum or absolute difference is 5.

Example test cases:

4 1 => True
10 10 => True
1 3 => False
6 2 => False
1 6 => True
-256 -251 => True
6 1 => True
-5 5 => False


The shortest I could come up with in python2 is 56 characters long:

x=input();y=input();print all([x-y,x+y-5,abs(x-y)-5])<1


-9, thanks @ElPedro. It takes input in format x,y:

x,y=input();print all([x-y,x+y-5,abs(x-y)-5])<1

• welcome to PPCG! This is a good first challenge -- the challenge is clearly defined, it has ample test cases, and uses our default I/O! If you stick around for a while and keep thinking up interesting challenges, I would recommend using The Sandbox to get feedback before posting them to this site. I hope you enjoy the time you spend here! Commented Jan 16, 2019 at 16:22

# Python 2, 30 bytes

lambda a,b:a in(b,5-b,b-5,b+5)


Try it online!

One byte saved by Arnauld

Three bytes saved by alephalpha

• This is amazingly concise, thanks Commented Jan 16, 2019 at 17:17
• Same can be done in Octave/MATLAB in 29 bytes (Try it online!). Commented Jan 17, 2019 at 18:51

# JavaScript (ES6), 28 bytes

Takes input as (a)(b). Returns $$\0\$$ or $$\1\$$.

a=>b=>a+b==5|!(a-=b)|a*a==25


Try it online!

• Damn, took me a long long time to figure out how this handling the difference part. :) Commented Jan 16, 2019 at 19:34

# Dyalog APL, 9 bytes

=∨5∊+,∘|-


Try it online!

Spelled out:

  =   ∨  5      ∊                +   , ∘    |            -
equal or 5 found in an array of sum and absolute of difference.


# x86 machine code, 39 bytes

00000000: 6a01 5e6a 055f 5251 31c0 39d1 0f44 c601  j.^j._RQ1.9..D..
00000010: d139 cf0f 44c6 595a 29d1 83f9 050f 44c6  .9..D.YZ).....D.
00000020: 83f9 fb0f 44c6 c3                        ....D..


# Assembly

section .text
global func
func:					;inputs int32_t ecx and edx
push 0x1
pop esi
push 0x5
pop edi
push edx
push ecx
xor eax, eax

;ecx==edx?
cmp ecx, edx
cmove eax, esi

;ecx+edx==5?
cmp edi, ecx
cmove eax, esi

;ecx-edx==5?
pop ecx
pop edx
sub ecx, edx
cmp ecx, 5

;ecx-edx==-5?
cmove eax, esi
cmp ecx, -5
cmove eax, esi

ret


Try it online!

Edit: fixed bash stderr errors on TIO

Edit 2: improved formatting in TIO header and footer code

# Jelly, 7 bytes

+,ạ5eo=


Try it online!

### How it works

+,ạ5eo=  Main link. Arguments: x, y (integers)

+        Yield x+y.
ạ      Yield |x-y|.
,       Pair; yield (x+y, |x-y|).
5e    Test if 5 exists in the pair.
=  Test x and y for equality.
o   Logical OR.


# R, 40 bytes (or 34)

function(x,y)any((-1:1*5)%in%c(x+y,x-y))


Try it online!

For non-R users:

• -1:1*5 expands to [-5, 0, 5]
• the %in% operator takes elements from the left and checks (element-wise) if they exist in the vector on the right

A direct port of @ArBo's solution has 35 34 bytes, so go upvote that answer if you like it:

function(x,y)x%in%c(y--1:1*5,5-y)

• The 34 byte one can be reduced by 1 with function(x,y)x%in%c(y--1:1*5,5-y) Commented Jan 16, 2019 at 21:36
• Can drop to 30 bytes by moving the subtraction: function(x,y)(x-y)%in%(-1:1*5), and drop it further to 24 bytes by dropping the function notation to scan() input: diff(scan())%in%(-1:1*5) Try it online!. Still very much the same method though. Commented Jan 17, 2019 at 14:38
• @CriminallyVulgar does that account for the sum being 5?
– ArBo
Commented Jan 17, 2019 at 15:45
• @ArBo Hah, missed that in the spec, and there wasn't a test case in the TIO so I just glossed over it! Commented Jan 18, 2019 at 9:39
• Minor change that can be made to both is to use pryr::f, which happens to work in both cases. Whether it can properly detect the arguments is entirely somewhat hit or miss but it seems to nail these two functions. e.g. pryr::f(x%in%c(y--1:1*5,5-y)) Try it online!. Gets you to 36 and 29 bytes respectively. Commented Jan 18, 2019 at 15:50

# Python 2, 29 31 bytes

lambda a,b:a+b==5ora-bin"0-5"


Try it online!

Since I didn't manage to read the task carefully the first time, in order to fix it, I had to come up with a completely different approach, which is unfortunately not as concise.

# J, 12 11 bytes

1 byte saved thanks to Adám

1#.=+5=|@-,+


Try it online!

## Explanation

This is equivalent to:

1 #. = + 5 = |@- , +


This can be divided into the following fork chain:

(= + (5 e. (|@- , +)))


Or, visualized using 5!:4<'f':

  ┌─ =
├─ +
──┤   ┌─ 5
│   ├─ e.
└───┤          ┌─ |
│    ┌─ @ ─┴─ -
└────┼─ ,
└─ +


Annotated:

  ┌─ =                                     equality
├─ +                                     added to (boolean or)
──┤   ┌─ 5                                   noun 5
│   ├─ e.                                  is an element of
└───┤          ┌─ |  absolute value         |
│    ┌─ @ ─┴─ -  (of) subtraction       |
└────┼─ ,        paired with            |
└─ +        addition               | any of these?

• Save a byte with e.
Commented Jan 16, 2019 at 16:58
• @Adám How so? Shortest approach I got with e. was =+.5 e.|@-,+. Maybe you forget 5e. is an invalid token in J? Commented Jan 16, 2019 at 17:05
• Since two integers cannot simultaneously sum to 5 and be equal, you can use + instead of +.
Commented Jan 16, 2019 at 17:11
• @Adám Ah, I see, thank you. Commented Jan 16, 2019 at 17:15

# Python 2, 38 bytes

-2 bytes thanks to @DjMcMayhem

lambda a,b:a+b==5or abs(a-b)==5or a==b


Try it online!

• Your TIO is actually 42 bytes but you can fix it by deleting the spaces between the 5s and the ors Commented Jan 16, 2019 at 16:12
• Actually, the TIO link could be 38 bytes Commented Jan 16, 2019 at 16:14
• @ElPedro the function itself was 40 bytes but I used f= in order to be able to call it Commented Jan 16, 2019 at 18:10
• @DJMcMayhem I don't normally golf in python. I just did it because the question asker used python for their example Commented Jan 16, 2019 at 18:12
• 36 bytes Commented Feb 19, 2021 at 11:15

# Java (JDK), 30 bytes

a->b->a+b==5|a==b|(b-=a)*b==25


Try it online!

# Wolfram Language (Mathematica), 22 bytes

Takes input as [a][b].

MatchQ[#|5-#|#-5|#+5]&


Try it online!

# PowerShell, 4844 40 bytes

param($a,$b)$b-in($a-5),(5-$a),(5+$a),$a  Takes input $a and $b. Checks if $b is -in the group ($a-5, 5-$a 5+$a, or $a), which checks all possible combinations of $a,$b, and 5.

-4 bytes thanks to mazzy.
-4 bytes thanks to KGlasier.

• ($a-$b) is -$x :) Commented Jan 16, 2019 at 17:14 • @mazzy Ooo, good call. Commented Jan 16, 2019 at 17:41 • If you switch 5 and $b around you can cut off a couple bytes(ie param($a,$b)$b-in($a-5),(5-$a),($a+5),$a) Try it out here Commented Jan 17, 2019 at 15:13 • @KGlasier Excellent suggestion. I needed to swap $a+5 to 5+$a to get it to cast appropriately when taking command-line input, but otherwise awesome. Thanks! Commented Jan 17, 2019 at 15:55 # Perl 6, 24 bytes -1 byte thanks to Grimy {$^a-$^b==5|0|-5|5-2*$b}


Try it online!

This uses the Any Junction but technically, ^ could work as well.

### Explanation:

{                      }  # Anonymous code block
$^a-$^b==                # Is the difference equal to
| |  |        # Any of
0
5
-5
5-2*$b  • -1 byte with {$^a-$^b==5|0|-5|5-2*$b} Commented Jan 17, 2019 at 15:00

# Pascal (FPC), 26 70 bytes

Edit: + input variables.

Procedure z(a,b:integer);begin Writeln((abs(a-b)in[0,5])or(a+b=5))end;


Try it online!

(abs(a-b)in[0,5])or(a+b=5)


Try it online!

I hope that my answer is according to all rules of code-golf. It was fun anyway.

• Hello, and welcome to PPCG! Normally, you have to take input, instead of assuming it is already in variables. I don't know Pascal, but I think that is what this code is doing. Commented Jan 20, 2019 at 17:42
• Hello, NoOneIsHere and thank you for the remark. It was may concern too - shall I include the initialization of the variables. Looking at several other solutions, like Java for example, where the function definition with parameters was excluded from the total length of the solution, I decided not to include ReadLn. Commented Jan 20, 2019 at 18:42
• Alright. Welcome to PPCG! Commented Jan 20, 2019 at 23:47
• The Java submission is an anonymous lambda which takes two parameters. This appears to use predefined variables, which is not a valid method of input.
– Jo King
Commented Jan 24, 2019 at 11:08
• No problem, I will change my submission. Commented Jan 24, 2019 at 13:55

# x86-16 machine code, 21 20 bytes

00000000: 8bd0 2bc3 740d 7902 f7d8 3c05 7405 03d3  ..+.t.y...<.t...
00000010: 80fa 05c3                                ....


Listing:

8B D0       MOV  DX, AX     ; Save AX to DX
2B C3       SUB  AX, BX     ; AX = AX - BX
74 0D       JZ   DONE       ; if 0, they are equal (ZF=1)
79 02       JNS  IS_POS     ; if positive, check if result is 5
F7 D8       NEG  AX         ; is negative, negate the result to get abs value
IS_POS:
3C 05       CMP  AL, 5      ; is result 5?
74 05       JZ   DONE       ; if so, exit with ZF=1
03 D3       ADD  DX, BX     ; DX = DX + BX
80 FA 05    CMP  DL, 5      ; ZF = ( DX == 5 )
DONE:


Input numbers in AX and BX and returns Zero Flag (ZF) if result is truthy.

Try it online! (testing code borrowed and adapted from @Logem's answer - thanks!)

Explanation:

If the difference between the numbers is 0, they are equal. Otherwise if result is negative, first negate it (abs value) and check for 5. If still not true, add and check for 5.

Bonus:

If desired, you can also determine which condition was true with the following:

• ZF = 1 and DX = 5 ; sum is 5
• ZF = 1 and AX = 5 ; diff is 5
• ZF = 1 and AX = 0 ; equal
• ZF = 0 ; falsey

# 05AB1E, 10 bytes

OIÆ‚Ä50SåZ


Try it online!

O           # Sum the input.
IÆ         # Reduced subtraction of the input.
‚        # Wrap [sum,reduced_subtraction]
Ä       # abs[sum,red_sub]
50S    # [5,0]
å   # [5,0] in abs[sum,red_sub]?
Z  # Max of result, 0 is false, 1 is true.


Tried to do it using stack-only operations, but it was longer.

• This will unfortunately return true if the sum is 0 such as for [5, -5] Commented Jan 16, 2019 at 20:28
• Your other 10-byte solution that you left as a comment (OIÆÄ‚5QIËM) is correct for [5,-5]. Commented Jan 17, 2019 at 9:31
• Another 10-byte solution that I came up with is OsÆÄ‚5åsË~. Almost identical to yours it seems. Try it online! Commented Jan 17, 2019 at 10:54

# C# (.NET Core), 43, 48, 47, 33 bytes

EDIT: Tried to use % and apparently forgot how to %. Thanks to Arnauld for pointing that out!

EDIT2: AdmBorkBork with a -1 byte golf rearranging the parentheses to sit next to the return so no additional space is needed!

EDIT3: Thanks to dana for -14 byte golf for the one-line return shortcut and currying the function (Ty Embodiment of Ignorance for linking to TIO).

# C# (.NET Core), 33 bytes

a=>b=>a==b|a+b==5|(a-b)*(a-b)==25


Try it online!

• Bah. Trying to avoid System.Math. Back to it! Thanks for pointing that out :D Commented Jan 16, 2019 at 16:41
• You can get it down to 33 bytes applying dana's tips Commented Jan 16, 2019 at 18:10

# C (gcc), 33 bytes

f(a,b){a=!(a+b-5&&(a-=b)/6|a%5);}


Try it online!

Tried an approach I didn't see anyone else try using. The return expression is equivalent to a+b==5||((-6<a-b||a-b<6)&&(a-b)%5==0).

# Scala, 43 bytes

def f(a:Int,b:Int)=a+b==5|(a-b).abs==5|a==b


Try it online!

• Isn't it possible to golf the || to |? I know it's possible in Java, C#, Python, or JavaScript, but not sure about Scala. Commented Jan 17, 2019 at 12:15
• Actually yes! thanks Commented Jan 17, 2019 at 12:18

# Brachylog, 8 bytes

=|+5|-ȧ5


Takes input as a list of two numbers (use _ for negatives). Try it online!

### Explanation

Pretty much a direct translation of the spec:

=          The two numbers are equal
|         or
+        The sum of the two numbers
5       is 5
|      or
-     The difference of the two numbers
ȧ    absolute value
5   is 5


# C (gcc), 41 34 bytes

f(a,b){a=5==abs(a-b)|a+b==5|a==b;}


Try it online!

• Why does f return a? Just some Undefined Behavior? Commented Jan 16, 2019 at 17:05
• @Tyilo Yes, it's implementation specific. So happens the first parameter is stored in the same register as the return value. Commented Jan 16, 2019 at 17:07
• 30 bytes Try it online!
– user36046
Commented Jan 16, 2019 at 18:02
• @Logern Doesn't work for f(6,1) Commented Jan 16, 2019 at 18:31
• @ceilingcat Doesn't work for f(6,1) Commented Jan 16, 2019 at 18:32

# 05AB1E, 13 12 bytes

ÐO5Qsα5QrËO


Try it online!

Takes input as a list of integers, saving one byte. Thanks @Wisław!

Q¹²α5Q¹²+5QO


Try it online!

This one takes input on separate lines.

• Since it is not very clearly specified, can you not assume the input is a list of integers, thus eliminating the initial |? Commented Jan 16, 2019 at 17:22
• @Wisław Good point, I updated my answer. Thanks! Commented Jan 16, 2019 at 17:28
• I found a 11 bytes alternative: OIαª5¢IË~Ā. Input is a list of integers. Commented Jan 16, 2019 at 17:54
• OIÆÄ)5QIËM is 10. Commented Jan 16, 2019 at 18:35
• @MagicOctopusUrn I'm not sure exactly what the rules are but I think your solution is different enough from mine to submit your own answer, no? Also, unrelated but I've seen your username on this site for a long time but only after typing it out did I realize that it's "Urn", not "Um" :) Commented Jan 16, 2019 at 18:43

## Ruby, 34 Bytes

->(a,b){[a+5,a-5,5-a,a].include?b}


Online Eval - Thanks @ASCII-Only

• do you check if they're equal though... Commented Jan 20, 2019 at 12:20
• Oops, forgot to add that check. Thanks @ASCII-only for pointing out the mistake. Commented Jan 20, 2019 at 12:23
• i'd be nice if you could link to this Commented Jan 21, 2019 at 2:57
• this might be valid? not completely sure though, you might wanna check with someone else Commented Jan 28, 2019 at 4:45
• This will work but it requires .nil? check to give output in the required format. ->(a,b){[a+5,a-5,5-a,a].index(b).nil?}, this is longer than the current one. Commented Jan 28, 2019 at 5:04

# Factor, 44 40 bytes

Saved 4 bytes thanks to @chunes!

[ { [ = ] [ - abs 5 = ] [ + 5 = ] } || ]


Try it online!

The repetition of = is annoying, but I couldn't find another way.

|| tries out each of the three quotations in {...} and checks if the result is true for any of them. The first, [ = ], checks if they're equal, the second finds the absolute value of their difference and compares that to 5, and the third compares their sum to 5.

• You can save 4 bytes with ||. Try it online! Commented Mar 27, 2021 at 9:08
• @chunes Nice, thanks!
– user
Commented Mar 27, 2021 at 17:23

# Tcl, 53 bytes

proc P a\ b {expr abs($a-$b)==5|$a==$b|abs($a+$b)==5}


Try it online!

# Japt, 14 13 bytes

¥VªaU ¥5ª5¥Nx


Try it online!

## Batch, 81 bytes

@set/as=%1+%2,d=%1-%2
@if %d% neq 0 if %d:-=% neq 5 if %s% neq 5 exit/b
@echo 1


Takes input as command-line arguments and outputs 1 on success, nothing on failure. Batch can't easily do disjunctions so I use De Morgan's laws to turn it into a conjunction.

# Charcoal, 18 bytes

Ｎθ¿№⟦θ⁺⁵θ⁻⁵θ⁻θ⁵⟧Ｎ1


Try it online! Link is to verbose version of code. Port of @ArBo's Python 2 solution.

# Retina 0.8.2, 82 bytes

\d+
$* ^(-?1*) \1$|^(-?1*)1{5} -?\2$|^-?(-?1*) (\3)1{5}$|^-?(1 ?){5}$|^(1 ?-?){5}$


Try it online! Link includes test cases. Explanation: The first two lines convert the inputs into unary. The final line then checks for any of the permitted matches:

^(-?1*) \1$x==y ^(-?1*)1{5} -?\2$   x>=0 y>=0 x=5+y i.e. x-y=5
x>=0 y<=0 x=5-y i.e. x+y=5
x<=0 y<=0 x=y-5 i.e. y-x=5
^-?(-?1*) (\3)1{5}$x<=0 y<=0 y=x-5 i.e. x-y=5 x<=0 y>=0 y=5-x i.e. x+y=5 x>=0 y>=0 y=5+x i.e. y-x=5 ^-?(1 ?){5}$        x>=0 y>=0 y=5-x i.e. x+y=5
x<=0 y>=0 y=5+x i.e. y-x=5
^(1 ?-?){5}$x>=0 y>=0 x=5-y i.e. x+y=5 x>=0 y<=0 x=5+y i.e. x-y=5  Pivoted by the last column we get: x==y ^(-?1*) \1$
x+y=5 x>=0 y>=0 ^-?(1 ?){5}$x>=0 y>=0 ^(1 ?-?){5}$
x>=0 y<=0 ^(-?1*)1{5} -?\2$x<=0 y>=0 ^-?(-?1*) (\3)1{5}$
x<=0 y<=0 (impossible)
x-y=5 x>=0 y>=0 ^(-?1*)1{5} -?\2$x>=0 y<=0 ^(1 ?-?){5}$
x<=0 y>=0 (impossible)
x<=0 y<=0 ^-?(-?1*) (\3)1{5}$y-x=5 x>=0 y>=0 ^-?(-?1*) (\3)1{5}$
x>=0 y<=0 (impossible)
x<=0 y>=0 ^-?(1 ?){5}$x<=0 y<=0 ^(-?1*)1{5} -?\2$


# Japt, 13 12 bytes

x ¥5|50ìøUra

x ¥5|50ìøUra
:Implicit input of array U

• Fails for [-5,5] (should be falsey) Commented Jan 17, 2019 at 9:26