#!/usr/bin/perl use strict; use warnings; # Seed can be longer than 3 digits but always 0,1,2,3 my $seed = $ARGV[0] || "000"; if ($seed =~ /[^0-3]/) { die "Invalid seed. Seed may only contain digits from 0 through 3.\n"; } my $max_differences = 2; frobnicate($seed); sub frobnicate { my ($prefix, $suffix, $difference_count) = @_; unless (defined $suffix) { $suffix = $prefix; $prefix = ''; } $difference_count++; while (length $suffix) { my $initial = substr($suffix, 0, 1); substr($suffix, 0, 1) = ''; for my $substitute (0..3) { next if $substitute == $initial; print "\t" unless $difference_count == 1; print $prefix, $substitute, $suffix; if ($difference_count < $max_differences && length $suffix) { frobnicate($prefix . $substitute, $suffix, $difference_count); } print "\n" if $difference_count == 1; } $prefix .= $initial; } }