#! /usr/bin/perl use strict; use warnings; use Term::ANSIColor; # get cipherText my $txt = do{local $/; }; $txt =~ s/\s//go; my @letters = split '', $txt; # create trigraphs my (%trigraphs, %flanks); add_trigraph('-', @letters[0..1]); while(@letters > 2){ add_trigraph(@letters[0..2]); shift @letters; } add_trigraph(@letters[0..1], '-'); # sort by most seen middle character my @sorted_keys = sort{ @{$trigraphs{$b}} <=> @{$trigraphs{$a}} || $a cmp $b } keys %trigraphs; # create columns/lines for(my $i = -1;$i < @{$trigraphs{$sorted_keys[0]}};++$i){ my @line; for my $k (@sorted_keys){ unless($i > -1){ # create header @{$trigraphs{$k}} = sort @{$trigraphs{$k}}; push @line, sprintf('%2d%s%-2d', scalar @{$trigraphs{$k}}, $k, scalar keys %{$flanks{$k}}); next; } next unless defined $trigraphs{$k}->[$i]; push @line, sprintf(' %s ', $trigraphs{$k}->[$i]); } print "@line\n"; } sub add_trigraph { ++$flanks{$_[1]}->{$_} for @_[0,2]; push(@{$trigraphs{$_[1]}}, join('', @_)); } __DATA__ # elcy pg.73 in P format FDRJN UHVXX URDMD SKVSO PJRKZ DYFZJ XGSRR VTQYR WDARW DFVRK VDRKV TDFSZ ZDYFR DNNVO VTSXS AWVZR