Falls es jemanden interessiert:
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!perl
use strict;
use warnings;
++$|;
################################################################################
my $wl_standard = 'englisch2.wl';
################################################################################
my ($wort_start,$wort_ziel,$wl) = @ARGV;
$wort_start = ($wort_start ne '') ? lc $wort_start : die 'Es muss ein Startwort übergeben werden!';
$wort_ziel = ($wort_ziel ne '') ? lc $wort_ziel : die 'Es muss ein Zielwort übergeben werden!';
die 'Start und Zielwort müssen die selbe Länge haben!' if length $wort_start != length $wort_ziel;
$wl ||= $wl_standard;
print "
Startwort: $wort_start
Zielwort: $wort_ziel
Wörterliste: $wl
";
################################################################################
print "Wörterliste einlesen...";
open (DATEI,$wl) || die 'Wörterbuchdatei konnte nicht geöffnet werden!';
chomp (my @w = <DATEI>);
close (DATEI);
my $l = length $wort_start;
my %w = map { lc($_) => 1 } grep { length $_ == $l } @w;
print " fertig\n";
################################################################################
die 'Das Startwort kommt im Wörterbuch nicht vor!' unless $w{$wort_start};
die 'Das Zielwort kommt im Wörterbuch nicht vor!' unless $w{$wort_ziel};
################################################################################
my @zw = (([]) x length $wort_start);
$zw[0] = [$wort_start];
my %von;
print "Suche starten...";
while (1) {
my $wort;
foreach (0..$#zw) {
next unless @{$zw[$_]};
$wort = shift @{$zw[$_]};
last;
}
unless ( defined $wort ) {
print " fertig\n\n";
print "Keine Lösung möglich!\n";
exit;
}
foreach my $foo (&foo($wort)) {
$von{$foo} = $wort;
my $u = &bar($foo);
if ( $u == 0 ) {
print " fertig\n\n";
my @weg = ($foo);
while ( $foo ne $wort_start ) {
$foo = $von{$foo};
unshift @weg, $foo;
}
print (join(' -> ',@weg), "\n");
exit;
}
push @{$zw[$u]}, $foo;
}
}
################################################################################
################################################################################
################################################################################
sub foo {
my $wort = shift;
my @m;
foreach my $i (0..length($wort)-1) {
foreach my $v ('a'..'z') {
next if substr($wort,$i,1) eq $v;
my $m = substr($wort,0,$i).$v.substr($wort,$i+1);
next unless $w{$m};
next if $von{$m};
push @m, $m;
}
}
return @m;
}
sub bar {
my $wort = shift;
my $unterschied = length($wort);
foreach my $i (0..length($wort)-1) {
--$unterschied if substr($wort,$i,1) eq substr($wort_ziel,$i,1);
}
return $unterschied;
}