TWC 120: Task #1, Swap Odd/Even bits & Task #2, Clock Angle
I was just going to use a variation on last week's "Nybble Swap" task for this, but then I foolishly thought, "No, I've read Hacker's Delight I should twiddle bits!"
Okay, now that I told you about my first mistake, let me tell you, the bit twiddling was fun once it started working but I do have a little regret that it's straightforward bit-twiddling: I created a bit mask to pick out alternating bits, then just did the shifting and OR-ing you would expect to switch the even/odd bits. I can't help but wonder if there isn't some clever one-liner in Hacker's Delight. I can't claim to have remembered it even once though: I skimmed the book.
But I didn't use arrays and array indexing tricks, like I did on the nybble-swap, so I did learn something and that something is this: Once you start using bigint, you have to start thinking in a paranoid way like you do in python, "This assignment will just create a pointer, I need to make a copy." Since I'm the type who hits
:w reflexively when at a lull in VIM, this isn't too outrageous for my sensibilities ... until I had to make a copy of the number 2 in a my declaration. That seemed a little much.
$ ./ch-1.pl --test ok 1 - First example: 101 -> 154 ok 2 - Second example: 18 -> 33 ok 3 - Identity for numbers with 'twinned bits': 51. ok 4 - Identity for numbers with 'twinned bits': 65535. 1..4
This was just a nice, quick exercise. There was a modest boundary case to handle, changing the hour "12" to "0" internally for mathematical convenience. And there was a nice non-intuitive result that pops out in testing, that the angle for any odd minute will have a fractional remainder of half a degree.
$ ./ch-2.pl --test ok 1 - First example: 03:10 is 35 degrees. ok 2 - Second example: 04:10 is 120 degrees. ok 3 - Twelve o'clock, the hands are coincident. ok 4 - Six o'clock, 180 degrees. ok 5 - One minute after six o'clock, 174.5 degrees. 1..5