#!/usr/bin/perl
use strict;
use warnings;
my %digit_letters = (
2 => [qw(a b c)],
3 => [qw(d e f)],
4 => [qw(g h i)],
5 => [qw(j k l)],
6 => [qw(m n o)],
7 => [qw(p r s)],
8 => [qw(t u v)],
9 => [qw(w x y)],
);
my @letter_combinations;
my $letterchooser = choose([0 .. 2], 4);
while (my $letters = $letterchooser->()) {
push @letter_combinations, $letters;
}
my $digitchooser = choose([2 .. 9], 4);
while (my $digits = $digitchooser->()) {
for my $letters (@letter_combinations) {
my @digits = split //, $digits;
my @letters = split //, $letters;
my @word = map { $digit_letters{$digits[$_]}[$letters[$_]] }
0 .. $#digits;
print "$digits: ", @word, "\n";
}
}
sub basen {
my ($base, $num) = @_;
my $q = int($num / $base);
my $r = $num % $base;
return $r if $q == 0;
return basen($base, $q), $r;
}
sub choose {
my ($list, $number) = @_;
my $listcount = @$list;
my $combcount = @$list**$number;
my $curr = 0;
sub {
return if $curr >= $combcount;
my @choice = basen($listcount, $curr++);
unshift @choice, 0 while @choice < $number;
return join "", map $list->[$_], @choice;
}
}
####
#!/usr/bin/python
def basen (base, num):
q = num / base
r = num % base
if q == 0:
return [r]
else:
return basen(base, q) + [r]
def choose (list, number):
iterations = len(list)**number
for i in range(0, iterations):
choice = basen(len(list), i)
while len(choice) < number:
choice.insert(0, 0)
yield [ list[x] for x in choice ]
digit_letters = { 2: [ 'a', 'b', 'c' ],
3: [ 'd', 'e', 'f' ],
4: [ 'g', 'h', 'i' ],
5: [ 'j', 'k', 'l' ],
6: [ 'm', 'n', 'o' ],
7: [ 'p', 'r', 's' ],
8: [ 't', 'u', 'v' ],
9: [ 'w', 'x', 'y' ] }
letter_choices = []
for letters in choose([0,1,2], 4):
letter_choices.append(letters)
for digits in choose(range(2,10), 4):
for letters in letter_choices:
word = []
for i in range(0, len(digits)):
digit = digits[i]
letter_i = letters[i]
letter = digit_letters[digit][letter_i]
word.append(letter)
print digits, ":", ''.join(word)
##
##
#!/usr/bin/pugs
my %digit_letters = (
2 => [qw(a b c)],
3 => [qw(d e f)],
4 => [qw(g h i)],
5 => [qw(j k l)],
6 => [qw(m n o)],
7 => [qw(p r s)],
8 => [qw(t u v)],
9 => [qw(w x y)],
);
my @letterchoices;
my $letters;
my $letterchooser = choose([0 .. 2], 4);
while $letters = $letterchooser() {
push @letterchoices, $letters;
}
my $digits;
my $digitchooser = choose([2 .. 9], 4);
while $digits = $digitchooser() {
my $letters;
for @letterchoices -> $letters {
my @digits = split '', $digits;
my @letters = split '', $letters;
my @word;
for zip(@digits, @letters) -> $digit, $letter {
push @word, %digit_letters{$digit}[$letter];
}
say "$digits: ", @word;
}
}
sub basen ($base, $num) {
my $q = int($num / $base);
my $r = $num % $base;
return $r if $q == 0;
return basen($base, $q), $r;
}
sub choose ($list, $number) {
my $iterations = $list.elems ** $number;
my $current = 0;
return sub {
return if $current >= $iterations;
my @choice = basen($list.elems, $current++);
unshift @choice, 0 while @choice.elems < $number;
return @choice.map({$list[$_]}).join("");
};
}