# RabbitFarm

### 2021-07-11

#### Swapping Bits / Time Angle

*The examples used here are from the weekly challenge problem statement and demonstrate
the working solution.*

## Part 1

*You are given a positive integer $N less than or equal to 255. Write a script to swap the
odd positioned bits with the even positioned bits and print the decimal equivalent of the
new binary representation.*

### Solution

```
use strict;
use warnings;
sub swap_bits{
my($n) = @_;
my $bits = substr(unpack("B32", pack("N", shift)), 24, 8);
my @bits = split(//, $bits);
for(my $i = 0; $i < @bits; $i += 2){
@bits[$i, $i + 1] = @bits[$i + 1, $i];
}
my $swapped_decimal = unpack("N", pack("B32", substr("0" x 32 . join("", @bits), -32)));
return $swapped_decimal;
}
MAIN:{
my $N;
$N = 101;
print swap_bits($N) . "\n";
$N = 18;
print swap_bits($N) . "\n";
}
```

### Sample Run

```
$ perl perl/ch-1.pl
154
33
```

### Notes

This code re-uses much of the code from last week's challenge solution. The only difference here is the for loop which swaps the even/odd bits.

## Part 2

*You are given time $T in the format hh:mm. Write a script to find the smaller angle
formed by the hands of an analog clock at a given time.*

### Solution

```
use strict;
use warnings;
sub clock_angle{
my($h, $m) = split(/:/, $_[0]);
my $angle = abs(0.5 * (60 * $h - 11 * $m));
$angle = 360 - $angle if $angle > 180;
return $angle;
}
MAIN:{
my $T;
$T = "03:10";
print clock_angle($T) . "\n";
$T = "04:00";
print clock_angle($T) . "\n";
}
```

### Sample Run

```
$ perl perl/ch-1.pl
35
120
```

### Notes

Perhaps not a whole lot going on here: the time is broken into hour and minute parts and then the angle is computed directly from those values.

## References

posted at: 17:41 by: Adam Russell | path: /perl | permanent link to this entry