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.
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
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.
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 tellodd() (($1&1))
)I’m waiting for a code golf style solution now.
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.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 possibleSee:
man bash
, “Compound Commands” and “Shell Function Definitions”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 isThe 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 callingfake_exit
will do nothing as theexit 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.
amazing, thanks!