this post was submitted on 07 Dec 2023
171 points (90.1% liked)

Programming Horror

239 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 @[email protected]

Rules

Credits

founded 2 years ago
MODERATORS
 
all 46 comments
sorted by: hot top controversial new old
[–] [email protected] 54 points 1 year ago (3 children)

You could do this in one line...

By removing all the linebreaks.

[–] [email protected] 2 points 1 year ago

i think it should one giant ternary expression composition

[–] [email protected] 1 points 1 year ago

I love this thread 🫠

[–] olafurp 45 points 1 year 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 35 points 1 year 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.

[–] Anticorp 21 points 1 year ago (2 children)

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 16 points 1 year ago

You must see the pain before you confront it.

[–] Coreidan 7 points 1 year 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.

[–] [email protected] 17 points 1 year ago* (last edited 1 year 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" }

[–] [email protected] 20 points 1 year ago (1 children)

Divide by 2 and check for a decimal point.

I mean, it ain't wrong.

[–] Chobbes 4 points 1 year ago (2 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 4 points 1 year ago (1 children)

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.

[–] Chobbes 2 points 1 year ago

Of course, but it's somewhat nasty when all of a sudden is_even doesn't do what you expect :).

[–] [email protected] 1 points 1 year ago (1 children)

The decimal representation of real numbers isn’t unique, so this could tell me that “2 = 1.9999…” is odd.

I don't think your belief holds water. By definition an even number, once divided by 2, maps to an integer. In binary representations, this is equivalent to a right shift. You do not get a rounding error or decimal parts.

But this is nitpicking a tongue-in-cheek comment.

[–] Chobbes 1 points 1 year ago

“1.99999…” is an integer, though! If you’re computing with arbitrary real numbers and serializing it to a string, how do you know to print “2” instead of “1.9999…”? This shouldn’t be decidable, naively if you have a program that prints “1.” and then repeatedly runs a step of an arbitrary Turing machine and then prints “9” if it did not terminate and stops printing otherwise, determining if the number being printed would be equal to 2 would solve the halting problem.

Arbitrary precision real numbers are not represented by finite binary integers. Also a right shift on a normal binary integer cannot tell you if the number is even. A right shift is only division by 2 on even numbers, otherwise it’s division by 2 rounded down to the nearest integer. But if you have a binary integer and you want to know if it’s even you can just check the least significant bit.

[–] [email protected] 11 points 1 year ago* (last edited 1 year ago) (2 children)
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)
[–] [email protected] 4 points 1 year ago (1 children)

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

[–] [email protected] 3 points 1 year 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 3 points 1 year ago

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

[–] [email protected] 8 points 1 year ago* (last edited 1 year ago) (5 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

[–] [email protected] 16 points 1 year ago* (last edited 1 year ago) (2 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

[–] [email protected] 8 points 1 year ago (1 children)

here is somewhat less:

return (number % 2) == 0;

[–] pivot_root 10 points 1 year ago (1 children)
[–] venoft 8 points 1 year ago* (last edited 1 year ago) (1 children)

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

return !(number & 0x1);
[–] [email protected] 5 points 1 year ago* (last edited 1 year ago)

oh shit yo

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

[–] [email protected] 1 points 1 year ago

are the negative numbers all even?

[–] [email protected] 5 points 1 year ago
[–] [email protected] 4 points 1 year ago (1 children)
#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.

[–] [email protected] 4 points 1 year ago

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

[–] misophist 3 points 1 year ago

Name doesn't check out.

[–] [email protected] 2 points 1 year 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)
[–] [email protected] 5 points 1 year ago
[–] [email protected] 4 points 1 year ago* (last edited 1 year ago) (1 children)

I would replace each if/else with a while.

[–] [email protected] 4 points 1 year ago
[–] [email protected] 4 points 1 year ago (1 children)

This could be optimized by using a recursive function.

[–] [email protected] 3 points 1 year ago

This could be made more servicavle by using a switch case

[–] [email protected] 2 points 1 year 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.

[–] [email protected] 2 points 1 year ago

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

[–] aodhsishaj 1 points 1 year ago (2 children)
[–] [email protected] 6 points 1 year ago

print(theJoke % you);

wooosh

[–] dylanTheDeveloper 3 points 1 year ago

I'm more of a Gemini myself

[–] [email protected] 1 points 1 year ago

You joke, but I've seen a programming language that didn't have a loop, and if you copied a line of text and pasted it in a text editor, JSON would come out...

The editor could barely handle 400+ lines because it probably converted the text to JSON, added a letter and converted it back to JSON... Per inserted symbol...