this post was submitted on 07 Dec 2023
2 points (100.0% liked)

Programming Horror

2328 readers
1 users here now

Welcome to Programming Horror!

This is a place to share strange or terrible code you come across.

For more general memes about programming there's also Programmer Humor.

Looking for mods. If youre interested in moderating the community feel free to dm @Ategon@programming.dev

Rules

Credits

founded 2 years ago
MODERATORS
 
all 18 comments
sorted by: hot top controversial new old
[–] olafurp@lemmy.world 1 points 2 years ago (1 children)

Of course there's an easier way. Just integrate the state of the art API dedicated for this exact problem. https://isevenapi.xyz/

[–] misophist@lemmy.world 1 points 2 years ago

This is confusing. I'm already using the iSeven API to determine if a number is 7. I'm getting a namespace collision error when I try to load this new API. Bug report filed.

[–] noddy@beehaw.org 1 points 2 years ago* (last edited 2 years ago) (1 children)

I know how to fix this!

bool IsEven(int number) {
    bool even = true;
    for (int i = 0; i < number; ++i) {
        if (even == true) {
            even = false;
        }
        else if (even == false) {
            even = true;
        }
        else {
            throw RuntimeException("Could not determine whether even is true or false.");
        }
    }

    if (even == true) {
        return even ? true : false;
    }
    else if (even == false) {
        return (!even) ? false : true;
    }
    else {
        throw RuntimeException("Could not determine whether even is true or false.");
    }
}
[–] odium@programming.dev 0 points 2 years ago (1 children)

Have you tried seeing if the recursive approach runs faster?

[–] noddy@beehaw.org 1 points 2 years ago

I know an even better way. We can make it run in O(1) by using a lookup table. We only need to store 2^64 booleans in an array first.

[–] SpeakinTelnet@programming.dev 1 points 2 years ago* (last edited 2 years ago)
def is_even(n):
    match n:
        case 1:
            return False
        case 0:
            return True
        # fix No1
        case n < 0:
            return is_even(-1*n)
        case _:
            return is_even(n-2)
[–] Thyrian@ttrpg.network 1 points 2 years ago

You could do this in one line...

By removing all the linebreaks.

[–] neidu@feddit.nl 1 points 2 years ago* (last edited 2 years ago) (1 children)

My solution in perl back in the day when I was a teenage hobbyist who didn't know about the modulus operator: Divide by 2 and use regex to check for a decimal point.

if ($num / 2 =~ /\./) { return "odd" }
else { return "even" }

[–] lysdexic@programming.dev 0 points 2 years ago (1 children)

Divide by 2 and check for a decimal point.

I mean, it ain't wrong.

[–] Chobbes@lemmy.world 0 points 2 years ago (1 children)

You know, I was going to let this slide under the notion that we're just ignoring the limited precision of floating point numbers... But then I thought about it and it's probably not right even if you were computing with real numbers! The decimal representation of real numbers isn't unique, so this could tell me that "2 = 1.9999..." is odd. Maybe your string coercion is guaranteed to return the finite decimal representation, but I think that would be undecidable.

[–] backgroundcow@lemmy.world 1 points 2 years ago

Ackchyually-- IEEE 754 guarantees any integer with absolute value less than 2^24 to be exactly representable as a single precision float. So, the "divide by 2, check for decimals" should be safe as long as the origin of the number being checked is somewhat reasonable.

[–] recursive_recursion@programming.dev 0 points 2 years ago* (last edited 2 years ago) (1 children)

modulo

pseudocode:

if number % 2 == 0
  return "number is even" (is_num_even = 1 or true)
else
  return "number is odd" (is_num_even = 0 or false)

plus you'd want an input validation beforehand

[–] mac@programming.dev 0 points 2 years ago* (last edited 2 years ago) (1 children)

who needs modulo when you can get less characters out of

while (number > 1) {
  number -= 2;
}
return number;

very efficient

edit: or theres the trusty iseven api

[–] nullPointer@programming.dev 0 points 2 years ago (1 children)

here is somewhat less:

return (number % 2) == 0;

[–] pivot_root@lemmy.world 1 points 2 years ago (1 children)
[–] venoft@lemmy.world 1 points 2 years ago* (last edited 2 years ago) (1 children)

This is the way. Modulo takes too long to compute, bitwise compare should be a lot faster.

return !(number & 0x1);
[–] recursive_recursion@programming.dev 1 points 2 years ago* (last edited 2 years ago)

oh shit yo

this comment chain is pretty awesome, I learned a lot from this thanks!