• @[email protected]
      link
      fedilink
      345 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.

  • @[email protected]
    link
    fedilink
    23
    edit-2
    5 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
      link
      75 months ago

      Have you tried seeing if the recursive approach runs faster?

      • @[email protected]
        link
        fedilink
        135 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.

  • AwkwardLookMonkeyPuppet
    link
    fedilink
    215 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?”.

    • @[email protected]
      link
      fedilink
      English
      65 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.

  • @[email protected]
    link
    fedilink
    19
    edit-2
    5 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
      link
      English
      215 months ago

      Divide by 2 and check for a decimal point.

      I mean, it ain’t wrong.

      • @[email protected]
        link
        fedilink
        35 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.

        • @[email protected]
          link
          fedilink
          35 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.

          • @[email protected]
            link
            fedilink
            15 months ago

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

        • @lysdexic
          link
          English
          15 months ago

          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.

          • @[email protected]
            link
            fedilink
            15 months 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.

  • Shinji_Ikari [he/him]
    link
    fedilink
    English
    17
    edit-2
    5 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.

    • @[email protected]
      link
      fedilink
      English
      45 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
    link
    15
    edit-2
    5 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)
    
  • recursive_recursion [they/them]A
    link
    English
    8
    edit-2
    5 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
      link
      22
      edit-2
      5 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

    • @[email protected]
      link
      fedilink
      45 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
        link
        English
        45 months ago

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

    • @RandomVideos
      link
      25 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)
      
    • Kogasa
      link
      1
      edit-2
      5 months ago

      deleted by creator