95 lines
2.3 KiB
Text
95 lines
2.3 KiB
Text
$ENTRY Go {
|
|
, <ReadFile 1 'unixdict.txt'>: e.Dict
|
|
= <DisplayLadder (e.Dict) ('boy') ('man')>
|
|
<DisplayLadder (e.Dict) ('girl') ('lady')>
|
|
<DisplayLadder (e.Dict) ('john') ('jane')>
|
|
<DisplayLadder (e.Dict) ('child') ('adult')>;
|
|
};
|
|
|
|
DisplayLadder {
|
|
(e.Dict) (e.From) (e.To),
|
|
e.From ' -> ' e.To ': ': e.Header,
|
|
<Ladder (e.Dict) (e.From) (e.To)>: {
|
|
Impossible = <Prout e.Header 'impossible'>;
|
|
Result e.Words = <Prout e.Header <Join ('->') e.Words>>;
|
|
};
|
|
};
|
|
|
|
Join {
|
|
(e.Join) = ;
|
|
(e.Join) (e.Word) = e.Word;
|
|
(e.Join) (e.Word) e.Words = e.Word e.Join <Join (e.Join) e.Words>;
|
|
};
|
|
|
|
ReadFile {
|
|
s.Chan e.File =
|
|
<Open 'r' s.Chan e.File>
|
|
<ReadFile (s.Chan)>;
|
|
(s.Chan), <Get s.Chan>: {
|
|
0 = ;
|
|
e.Line = (e.Line) <ReadFile (s.Chan)>;
|
|
};
|
|
};
|
|
|
|
Filter {
|
|
(e.Fn) = ;
|
|
(e.Fn) t.Item e.Items, <Mu e.Fn t.Item>: {
|
|
True = t.Item <Filter (e.Fn) e.Items>;
|
|
False = <Filter (e.Fn) e.Items>;
|
|
};
|
|
};
|
|
|
|
SameLen {
|
|
(e.Word1) (e.Word2),
|
|
<Lenw e.Word1>: s.Len e.Word1,
|
|
<Lenw e.Word2>: s.Len e.Word2 = True;
|
|
(e.Word1) (e.Word2) = False;
|
|
};
|
|
|
|
Diffs {
|
|
() () = 0;
|
|
(s.X e.Word1) (s.X e.Word2) = <Diffs (e.Word1) (e.Word2)>;
|
|
(s.X e.Word1) (s.Y e.Word2) = <+ 1 <Diffs (e.Word1) (e.Word2)>>;
|
|
};
|
|
|
|
OneDiff {
|
|
t.Word1 t.Word2, <Diffs t.Word1 t.Word2>: {
|
|
1 = True;
|
|
s.Diffs = False;
|
|
};
|
|
};
|
|
|
|
Ladder {
|
|
(e.Dict) t.From t.To,
|
|
<Filter (SameLen t.From) e.Dict>: e.Dict2 =
|
|
<Ladder2 ((t.From)) (e.Dict2) t.To>;
|
|
};
|
|
|
|
Ladder2 {
|
|
(e.Ladders) (e.Dict) t.To,
|
|
e.Ladders: e.X (e.Words t.To) e.Y = Result e.Words t.To;
|
|
|
|
(e.Ladders) () t.To = Impossible;
|
|
() (e.Dict) t.To = Impossible;
|
|
|
|
((e.Ladder) e.Ladders) (e.Dict) t.To,
|
|
e.Ladder: e.1 t.Last,
|
|
<Filter (OneDiff t.Last) e.Dict>: e.NextWords,
|
|
<RemoveAll (e.NextWords) e.Dict>: e.NextDict,
|
|
<AddAll (e.Ladder) e.NextWords>: e.NextLadders
|
|
= <Ladder2 (e.Ladders e.NextLadders) (e.NextDict) t.To>;
|
|
};
|
|
|
|
RemoveAll {
|
|
(e.Remove) = ;
|
|
(e.Remove) t.Word e.Words, e.Remove: {
|
|
e.X t.Word e.Y = <RemoveAll (e.Remove) e.Words>;
|
|
e.Remove = t.Word <RemoveAll (e.Remove) e.Words>;
|
|
};
|
|
};
|
|
|
|
AddAll {
|
|
(e.Ladder) = ;
|
|
(e.Ladder) t.Word e.Words =
|
|
(e.Ladder t.Word) <AddAll (e.Ladder) e.Words>;
|
|
};
|