aboutsummaryrefslogtreecommitdiff
path: root/challenge-046/dave-jacoby/perl/ch-2.pl
blob: 348902726c0c6ba57115606eeea790dc30704d07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use feature qw{ postderef say signatures state switch };
no warnings
  qw{ experimental::postderef experimental::smartmatch experimental::signatures };

# There are 500 rooms in a hotel with 500 employees having keys to all the rooms.
# The first employee opened main entrance door of all the rooms.
# The second employee then closed the doors of room numbers 2,4,6,8,10 and so on to 500.
# The third employee then closed the door if it was opened or opened the door
#     if it was closed of rooms 3,6,9,12,15 and so on to 500.
# Similarly the fourth employee did the same as the third but only room numbers
#     4,8,12,16 and so on to 500.
# This goes on until all employees has had a turn.
# Write a script to find out all the rooms still open at the end.

# for once, indexing on 1 not zero would be nice. But we can
# ignore door zero. 


# first employee opens everything, then the second employee closes
# half, so it's just a toggle, or x = !x

# and we use grep to only get every nth index into the array,
# and modulus equalling zero to indicate which indexes go through

my @doors = map { 1 } 0 .. 500;
for my $e ( 2 .. 500 ) {
    map { $doors[$_] = !$doors[$_] }
      grep { 0 == $_ % $e } 1 .. 500;
}
say join ' ', grep { $doors[$_] } 1 .. 500;