NEWTON

NEWTON

# How to make conditional expressions if..then..else in Cairo lang?

4 months ago

146

views

1

Hello! This is day 3 of the 17 days of the Cairo Challenge. And I have no idea how to solve the playground exercise “Conditionals”. Perhaps you can help me?

``````// The function `abs_eq` should return 1 if its inputs
// are equal or differ only in sign and 0 otherwise.
// Its current implementation is incorrect.
//
// 1. Click on "Run" to see where it fails.
// 2. Fix the body of `abs_eq`, so that the
//    program terminates successfully.

// Returns 1 if |x| = |y| (that is, x = y or x = -y),
// 0 otherwise.
func abs_eq(x: felt, y: felt) -> (bit: felt) {
if (x == -y) {
return (bit=1);
} else {
return (bit=0);
}
}

func main() {
let (bit) = abs_eq(2, -2);
assert bit = 1;

let (bit) = abs_eq(2, 3);
assert bit = 0;

let (bit) = abs_eq(2, 2);
assert bit = 1;

return ();
}``````

Answers to this question are a part of the ✨ 17 days of Cairo Lang with Playground & Newton.

Vote for your favorite answer - the best answer will win a \$10 award. A new day – a new reward! During the next 17 days, our goal is to attract more developers to the Cairo language and to systematize the knowledge of Cairo lang. Read rules

#17daysOfCairocairo-beginnerscairoplayground

Newton

4 months ago

3

One of the ways to implement the required function would be to add a check on the situation where `x == y`. You could also remove the else which is redundant and just return `bit = 0` if your function reaches the end of execution. You would get something like this:

``````func abs_eq(x: felt, y: felt) -> (bit: felt) {
if (x == y) {
return(bit=1);
}
if (x == -y) {
return (bit=1);
}
return(bit=0);
}
``````

4 months ago

0

## You need a forest...

...of IFs. Yes Cairo doesn't support logic operators. (like ||)

``````if (x == y) {
return (bit=1);
}
``````

victorforissier.eth

3 months ago

0

Unfortunately seems like Cairo doesn't support logical operators (|| , &&, !) so something like this is not possible:

``````if (x == -y || x == y) {
return (bit=1);
}
``````

So the solution is to use multiple `if-s` (or one if and use `abs_value` as other users pointed out)

``````func abs_eq(x: felt, y: felt) -> (bit: felt) {
if (x == -y) {
return (bit=1);
}
if (x == y) {
return (bit=1);
} else { // else can be omitted, but if it's not, it must be in the same line as {
return (bit=0);
}
}
``````

1

I wondered that such a basic function as `abs` should exist on cairo. Therefore, I went through the cairo-lang repository and found the function I wanted.

However, I had a problem with the implementation of the `abs` function. But thanks to the help from the cairo community I was able to solve it. Here is the error

My answer for the day 3

``````%builtins range_check

from starkware.cairo.common.math import abs_value

func abs_eq{range_check_ptr}(x: felt, y: felt) -> (bit: felt) {
if (abs_value(x) == abs_value(y)) {
return (bit=1);
} else {
return (bit=0);
}
}

func main{range_check_ptr}() {
let (bit) = abs_eq(2, -2);
assert bit = 1;

let (bit) = abs_eq(2, 3);
assert bit = 0;

let (bit) = abs_eq(2, 2);
assert bit = 1;

return ();
}
``````

Repository challenge

0

# Problem

``````// The function `abs_eq` should return 1 if its inputs
// are equal or differ only in sign and 0 otherwise.
// Its current implementation is incorrect.
// Returns 1 if |x| = |y| (that is, x = y or x = -y),
// 0 otherwise.
func abs_eq(x: felt, y: felt) -> (bit: felt) {
if (x == -y) {
return (bit=1);
} else {
return (bit=0);
}
}

func main() {
let (bit) = abs_eq(2, -2);
assert bit = 1;

let (bit) = abs_eq(2, 3);
assert bit = 0;

let (bit) = abs_eq(2, 2);
assert bit = 1;

return ();
}
``````

# Solution

``````func abs_eq(x: felt, y: felt) -> (bit: felt) {
if (x == y) { //2===2 or -2 ==. -2
return (bit=1);
}
if (x == -y) { // 2 == -(-2) or -2 == -2
return (bit=1);
}
return (bit=0);
}
func main() {
let (bit) = abs_eq(2, -2);
assert bit = 1;

let (bit) = abs_eq(2, 2);
assert bit = 1;

let (bit) = abs_eq(-2, 2);
assert bit = 1;

let (bit) = abs_eq(-2, -2);
assert bit = 1;

let (bit) = abs_eq(2, 3);
assert bit = 0;

return ();
}
``````

# Explanation

abs_eq function accepts two arguments x and y, if x and y equal in magnitude or differ only in sign it will return 1 otherwise 0.

First if statement checks the both magnitude and signs should be equal to return true that is (2,2), (-2,-2)

Second if statement checks the both magnitude should be same but return true only if signs are different that is (-2,2) , (2,-2)

main function uses assert to verifies the computation of all the test cases possible for the conditions.

0

// The function `abs_eq` should return 1 if its inputs // are equal or differ only in sign and 0 otherwise. // Its current implementation is incorrect. // // 1. Click on "Run" to see the where it fails. // 2. Fix the body of `abs_eq`, so that the // program terminates successfully.

// Returns 1 if |x| = |y| (that is, x = y or x = -y), // 0 otherwise. func abs_eq(x: felt, y: felt) -> (bit: felt) { if( x == y){ return (bit=1); } if (x == -y) { return (bit=1); } else { return (bit=0); } }

func main() { let (bit) = abs_eq(2, -2); assert bit = 1;

``````let (bit) = abs_eq(2, 3);
assert bit = 0;

let (bit) = abs_eq(2, 2);
assert bit = 1;

return ();
``````

}

4 months ago

0

``````func abs_eq(x: felt, y: felt) -> (bit: felt) {
if (x == -y) {
return (bit=1);
}

if (x == y) {
return (bit=1);
}

return (bit=0);
}

func main() {
let (bit) = abs_eq(2, -2);
assert bit = 1;

let (bit) = abs_eq(2, 3);
assert bit = 0;

let (bit) = abs_eq(2, 2);
assert bit = 1;

return ();
}
``````

0

func abs_eq(x: felt, y: felt) -> (bit: felt) { if (x == y) { return(bit = 1); } if (x == -y) { return(bit = 1);
} return (bit = 0); }

func main() { let (bit) = abs_eq(2, -2); assert bit = 1;

``````let (bit) = abs_eq(2, 3);
assert bit = 0;

let (bit) = abs_eq(2, 2);
assert bit = 1;

return ();
``````

}

1

``````func abs_eq(x: felt, y: felt) -> (bit: felt) {
//return 1 if x = -y
if (x == -y) {
return (bit=1);
}

//return 1 if x = y
if (x == y) {
return (bit=1);
}

//otherwise
return (bit=0);
}
``````

4 months ago