#!/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; } }