/
cryptogen.pl
79 lines (66 loc) · 2.25 KB
/
cryptogen.pl
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/perl -w
#
# http://www.mail-archive.com/eug-lug@efn.org/msg01147.html
# Script for creating a cryptogram out of plaintext
# By: Rob Hudson <[EMAIL PROTECTED]>
# Created: 22 Jan 2000
# Updated: 07 Feb 2000 : Changed to using FYShuffle
# Updated: 15 Apr 2000 : Added fortune support
use Text::Wrap;
my $text = "";
my @lines;
my $alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
## Set up fortune locale
## You may need to change this to match your system
my $fortune_dir = "/usr/share/games/fortunes/";
## Which files you don't want quotes pulled from
## A list of files separated by '|'
my $exclude = "ascii-art|translate-me";
if (@ARGV && $ARGV[0] ne '-f') {
my $inFile = $ARGV[0] if ($ARGV[0] ne "") or die "No file specified\n";
# Read it, Scrunch it, Up it.
open IN, $inFile or die "Can't open input file: $!";
while (<IN>) {
s/[\s]+/ /g;
$text .= $_;
}
close (IN);
print "\nHere is your quote:\n\n";
}
else {
opendir FORTUNE_DIR, $fortune_dir or die "Can't read directory $fortune_dir: $!";
my @files = grep !/^\.|.dat$|$exclude/, readdir FORTUNE_DIR;
# Pick a random file from which to get the fortune
my $fortune_file = $files[rand @files];
# This is inefficient from a memory usage standpoint, but it's much easier
$/ = '%';
open FILE, "$fortune_dir$fortune_file" or die "Can't open file: $!";
while (<FILE>) {
push @lines, $_;
}
close (FILE);
$text = $lines[rand @lines];
$text =~ s/%$//g; # remove the %
$text =~ s/[\s]+/ /g; # make spacing uniform
$text =~ s/^\s+//g; # remove whitespace at beginning
print "\nQuote taken from fortune file '" . $fortune_file . "':\n\n";
}
## Start cryptogram processing
$text = uc($text);
# print wrap ("","", $text), "\n\n";
## Build random alphabet string, not allowing repeat letters
my @alpha = split //, $alpha;
my $substit = join '', fisher_yates_shuffle(\@alpha);
## Have to use an eval since $vars don't get interpreted inside a tr call.
eval "\$text =~ tr/$alpha/$substit/";
print wrap ("","", $text), "\n\n";
## Taken from perlfaq4 (thanks btrott)
sub fisher_yates_shuffle {
my $array = shift;
for (my $i = @$array; --$i; ) {
my $j = int rand ($i+1);
next if $i == $j;
@$array[$i, $j] = @$array[$j, $i];
}
return join '', @$array;
}