aboutsummaryrefslogtreecommitdiff
path: root/challenge-070/perlboy1967/perl/ch-2.pl
blob: edcf1372753073f2d685e1cb1fa0598a1aa6e353 (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
36
37
38
#!/usr/bin/perl

# Perl Weekly Challenge - 070
#
# Task 2 - Gray Code Sequence
#
# Author: Niels 'PerlBoy' van Dijke

use strict;
use warnings;

sub genGrayCodeSequence($);

my ($N) = @ARGV;

die "Argument must be a positive number"
  unless ($N =~ m#^\d+$#);

my @g = genGrayCodeSequence($N);

printf q{
Input: $N = %d
Output: [%s]
}, $N, join(', ', @g);

sub genGrayCodeSequence($) {
  my ($N) = @_;

  my @g = (0, 1);

  for my $i (2 .. $N) {
    map { $_ = "0$_" } @g;
    map { m/^.(.*)/; push(@g, "1$1") } reverse @g;
  }

  map { $_ = oct("0b$_") } @g;
}