Quoting James E. Tilley ([EMAIL PROTECTED]):
> Can you post the unfun, brute-force approach, and maybe we can whittle it
> down?
Here ya go. Don't say I didn't warn you.
Adam
--
Adam Rice -- [EMAIL PROTECTED] -- Blackburn, Lancashire, England
#!/usr/local/bin/perl -w
use strict;
# convert a Perl program to one that uses each ASCII character at most once
# usage ./atmostonce input-program.pl > output-program.pl
my($FIRST_PART,
$MIDDLE_PART,
$LAST_PART,
$ALSO_REMOVE) = (
"s{}[",
'],$_^=q<',
">;eval\n",
"()[EMAIL PROTECTED]".join("", map(chr, 0x00 .. 0x1f, 0x7f ..
0xff)),
);
local $/;
my $input = <>;
my $maxlength = int((256-length($FIRST_PART.$MIDDLE_PART.$LAST_PART.$ALSO_REMOVE))/2);
if (length($input) > $maxlength) {
die "Input program is too long (must be at most $maxlength characters\n";
}
my($used) = "\0\0\0\0\0\0\0\0";
foreach (split //, $FIRST_PART.$MIDDLE_PART.$LAST_PART.$ALSO_REMOVE) {
vec($used, ord($_), 1) = 1;
}
my $string=scan(0, $used, "");
print $FIRST_PART, $string, $MIDDLE_PART, $string^$input, $LAST_PART;
sub scan {
my($offset, $used, $answer) = @_;
foreach my $char (0x20 .. 0x7e, 0xa0 .. 0xff, 0x00 .. 0x1f, 0x7f..0x9f) {
my $eorchar = $char^ord(substr($input, $offset, 1));
next if (vec($used, $char, 1) || vec($used, $eorchar, 1));
if ($offset + 1 == length($input)) {
return $answer.chr($char);
} else {
my $nowused = $used;
vec($nowused, $char, 1) = 1;
vec($nowused, $eorchar, 1) = 1;
my $next = scan($offset + 1, $nowused, $answer.chr($char));
return $next if defined $next;
}
}
return undef;
}