193
submitted 6 months ago* (last edited 6 months ago) by andioop@programming.dev to c/programming_horror@programming.dev
top 50 comments
sorted by: hot top controversial new old
[-] Thyrian@ttrpg.network 63 points 6 months ago

You could do this in one line...

By removing all the linebreaks.

[-] DeathsEmbrace@lemmy.ml 11 points 6 months ago

Why even put spaces too many key presses.

[-] Strawberry@lemmy.blahaj.zone 2 points 6 months ago

i think it should one giant ternary expression composition

load more comments (1 replies)
[-] olafurp@lemmy.world 43 points 6 months ago

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 34 points 6 months 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 23 points 6 months ago* (last edited 6 months ago)

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 7 points 6 months ago

Have you tried seeing if the recursive approach runs faster?

[-] noddy@beehaw.org 13 points 6 months 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.

[-] Anticorp@lemmy.world 21 points 6 months ago

Back when I was learning programming a lot of lessons would make you do something like this, and then show you the real way to do it in the next lesson. My reaction was always "why didn't you lead with this?".

[-] Potatos_are_not_friends@lemmy.world 14 points 6 months ago

You must see the pain before you confront it.

[-] Coreidan@lemmy.world 6 points 6 months ago

Because the point of the lesson is to demonstrate that you can solve the same problem multiple ways where some paths are more efficient than others.

Bad programmers are the ones that find the first solution and implement it no matter how inefficient it is.

Good programmers spend time on figuring out the solution with the least amount broken or inefficient code. You don’t learn this by jumping straight to the best answer every time.

[-] neidu@feddit.nl 19 points 6 months ago* (last edited 6 months ago)

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 21 points 6 months ago

Divide by 2 and check for a decimal point.

I mean, it ain't wrong.

[-] Chobbes@lemmy.world 3 points 6 months ago

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 3 points 6 months 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.

load more comments (1 replies)
load more comments (2 replies)
[-] Shinji_Ikari@hexbear.net 17 points 6 months ago* (last edited 6 months ago)

Programming humor on reddit used to be excellent bits like this but then it devolved into new learners jumping straight to the irony they didn't understand and flooded the sub with nonsense.

I miss these bits.

btw it does get easier

import math
def is_even(num):
    if num in [i for i in range(1000) if float(i)/2.0 == math.floor(float(i)/2.0)]:
        print("true")
    else:
        print("false")

Obviously one would need to increase the range for bigger numbers but this code is optimized.

[-] sloppy_diffuser@sh.itjust.works 4 points 6 months ago

for i in itertools.count(): ... will count to infinity.

Better make it into a dictionary so it's O(1) complexity instead of O(n) while you're at it.

[-] SpeakinTelnet@programming.dev 15 points 6 months ago* (last edited 6 months 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)
[-] sloppy_diffuser@sh.itjust.works 5 points 6 months ago

Python added match/case?! Bunch of mypy issues have been closed too. Maybe its time to dust off some old projects.

[-] SpeakinTelnet@programming.dev 2 points 6 months ago

It was added in 3.10 and is surprisingly complete. The tutorial pep is a good starting point to see what it can accomplish

[-] Chobbes@lemmy.world 3 points 6 months ago

Well... At least it's tail recursive.

[-] AlyxMS@hexbear.net 2 points 6 months ago

What if the input is negative

[-] recursive_recursion@programming.dev 8 points 6 months ago* (last edited 6 months ago)

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 22 points 6 months ago* (last edited 6 months ago)

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 8 points 6 months ago

here is somewhat less:

return (number % 2) == 0;

[-] pivot_root@lemmy.world 9 points 6 months ago
[-] venoft@lemmy.world 8 points 6 months ago* (last edited 6 months ago)

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

return !(number & 0x1);
[-] recursive_recursion@programming.dev 5 points 6 months ago* (last edited 6 months ago)

oh shit yo

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

[-] huf@hexbear.net 4 points 6 months ago

just check the last bit jesus christ, what is it with these expensive modulo operations?!

return !(n&1);

[-] perviouslyiner@lemm.ee 2 points 6 months ago

are the negative numbers all even?

[-] Vex_Detrause@lemmy.ca 4 points 6 months ago
#You are an input. You have value! You matter!
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)

Am I doing it right? /S.

[-] PoolloverNathan@programming.dev 4 points 6 months ago

Don't put nbsps in code blocks, they show up literally.

[-] misophist@lemmy.world 3 points 6 months ago

Name doesn't check out.

[-] comrade_pibb@hexbear.net 2 points 6 months ago

John carmak posting

[-] RandomVideos@programming.dev 2 points 6 months ago

This code is terrible. If you input 10.66 it returns "number is odd

It should be:

if number % 2 == 0
  return "number is even" (is_num_even = 1 or true)
else
  return "number is not even" (is_num_even = 0 or false)
load more comments (1 replies)
[-] Thyrian@ttrpg.network 7 points 6 months ago

This could be optimized by using a recursive function.

[-] neeeeDanke@feddit.de 3 points 6 months ago

This could be made more servicavle by using a switch case

[-] comrade_pibb@hexbear.net 2 points 6 months ago

what's the big O of an even number

[-] FarraigePlaisteach@kbin.social 5 points 6 months ago* (last edited 6 months ago)

I would replace each if/else with a while.

load more comments (1 replies)
[-] vrighter@discuss.tchncs.de 5 points 6 months ago
[-] AI_toothbrush@lemmy.zip 4 points 6 months ago

...btw a switch statement is better in this case(get it?)

[-] Lucien@hexbear.net 4 points 6 months ago

God, this must go on for, like, twenty or so lines.

[-] andioop@programming.dev 4 points 6 months ago
[-] tweeks@feddit.nl 3 points 6 months ago

I would love it if someone edited this example and posted it with two statements near the end that are reversed, implying inconsistent behaviour at random in the list ahead, seemingly making this solution less inefficient.

load more comments
view more: next ›
this post was submitted on 07 Dec 2023
193 points (91.1% liked)

Programming Horror

1634 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 1 year ago
MODERATORS