• tetris11@lemmy.ml
    link
    fedilink
    arrow-up
    0
    ·
    10 months ago

    I prefer good ole regex test of a binary num

    function isEven(number){
       binary=$(echo "obase=2; $number" | bc)
       if [ "${binary:-1}" = "1" ]; then
             return 255
       fi
       return 0
    }
    
      • Chais@sh.itjust.works
        link
        fedilink
        arrow-up
        0
        ·
        edit-2
        10 months ago

        If your codebase is closed source there’s no risk of that happening, if it’s open source there’s nothing you can do about it.
        Either way there’s no use worrying.

    • balsoft@lemmy.ml
      link
      fedilink
      arrow-up
      0
      ·
      10 months ago

      Amateur! I can read and understand that almost right away. Now I present a better solution:

      even() ((($1+1)&1))
      

      (I mean, it’s funny cause it’s unreadable, but I suspect this is also one of the most efficient bash implementations possible)

      (Actually the obvious one is a slight bit faster. But this impl for odd is the fastest one as far as I can tell odd() (($1&1)))

      • tetris11@lemmy.ml
        link
        fedilink
        arrow-up
        0
        ·
        10 months ago

        woah your bash is legit good. I thought numeric pretexts needed $(( blah )), but you’re ommiting the $ like an absolute madman. How is this wizardy possible

        • balsoft@lemmy.ml
          link
          fedilink
          arrow-up
          0
          ·
          10 months ago

          See: man bash, “Compound Commands” and “Shell Function Definitions”

          • tetris11@lemmy.ml
            link
            fedilink
            arrow-up
            0
            ·
            10 months ago

            Oh I see it, but for some reason I was taught to always use $(( arith )) instead of (( arith )) and I guess I’m just wondering what the difference is

            • balsoft@lemmy.ml
              link
              fedilink
              arrow-up
              0
              ·
              10 months ago

              The difference is that (( is a “compound command”, similar to [[ (evaluate conditional expression), while $(( )) is “aritmetic expansion”. They behave in almost exactly the same way but are used in different contexts - the former uses “exit codes” while the latter returns a string, so the former would be used where you would expect a command, while the latter would be used where you expect an expression.

              This is similar to how there is ( compound command (run in a subshell), and $( ) (command substitution). You can actually use the former to define a function too (as it’s a compound command):

              real_exit() { exit 1; }
              fake_exit() ( exit 1 )
              

              Calling real_exit will exit from the shell, while calling fake_exit will do nothing as the exit 1 command is executed in a separate subshell. Notice how you can also do the same in a command substition (because it runs in a subshell):

              echo $(echo foo; exit 1)
              

              Will run successfully and output foo.

              It is another one of those unknown, very rarely useful features of bash.

        • balsoft@lemmy.ml
          link
          fedilink
          arrow-up
          0
          ·
          10 months ago

          I don’t think there’s much to codegolf. The “obvious” solution (even() (($1%2))) is both shorter and faster. Don’t think it can be optimized much more.