Jump to content

Word ladder: Difference between revisions

m
syntax highlighting fixup automation
(J)
m (syntax highlighting fixup automation)
Line 23:
{{trans|Nim}}
 
<langsyntaxhighlight lang="11l">F isOneAway(word1, word2)
V result = 0B
L(i) 0 .< word1.len
Line 74:
print(‘No path from "’start‘" to "’target‘".’)
E
print(path.join(‘ -> ’))</langsyntaxhighlight>
 
{{out}}
Line 90:
=={{header|ALGOL 68}}==
With ''a68g'' use option <code>--storage 2</code>, otherwise it runs out of memory.
<langsyntaxhighlight lang="algol68"># quick implementation of a stack of INT.
real program starts after it.
#
Line 268:
print(newline)
FI
OD</langsyntaxhighlight>
{{out}}
<pre>boy->bay->ban->man
Line 292:
=={{header|C++}}==
This borrows heavily from [[#Wren|Wren]] and a bit from [[#Raku|Raku]].
<langsyntaxhighlight lang="cpp">#include <algorithm>
#include <fstream>
#include <iostream>
Line 383:
word_ladder(words, "bubble", "tickle");
return EXIT_SUCCESS;
}</langsyntaxhighlight>
 
{{out}}
Line 398:
 
=={{header|F_Sharp|F#}}==
<langsyntaxhighlight lang="fsharp">
// Word ladder: Nigel Galloway. June 5th., 2021
let fG n g=n|>List.partition(fun n->2>Seq.fold2(fun z n g->z+if n=g then 0 else 1) 0 n g)
Line 407:
let i,e=fG dict n in match i with Done i->Some([n;g]) |_->wL(i|>List.map(fun g->[g;n])) [] e
[("boy","man");("girl","lady");("john","jane");("child","adult")]|>List.iter(fun(n,g)->printfn "%s" (match wL n g with Some n->n|>String.concat " -> " |_->n+" into "+g+" can't be done"))
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 418:
The bad news is evil can not be turned into good, but the good news is god can become man.
 
<langsyntaxhighlight lang="fsharp">
[("evil","good");("god","man")]|>List.iter(fun(n,g)->printfn "%s" (match wL n g with Some n->n|>String.concat " -> " |_->n+" into "+g+" can't be done"))
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 429:
=={{header|Go}}==
{{trans|Wren}}
<langsyntaxhighlight lang="go">package main
 
import (
Line 517:
wordLadder(words, pair[0], pair[1])
}
}</langsyntaxhighlight>
 
{{out}}
Line 531:
The function first expands a ball around the starting word in the space of possible words, until the ball surface touches the goal (if ever). After that it performs depth-first path-finding from the goal back to the center.
 
<langsyntaxhighlight lang="haskell">import System.IO (readFile)
import Control.Monad (foldM)
import Data.List (intercalate)
Line 577:
showChain $ wordLadder dict "john" "jane"
showChain $ wordLadder dict "alien" "drool"
showChain $ wordLadder dict "child" "adult"</langsyntaxhighlight>
 
<pre>λ> lines <$> readFile "unixdict.txt" >>= print . wordLadders "boy" "man"
Line 598:
Performs searching from both ends. This solution is much faster for cases with no chains, and for for short chains. In case of long chains looses its' efficiency.
 
<langsyntaxhighlight lang="haskell">wordLadders2 :: String -> String -> [String] -> [[String]]
wordLadders2 start end dict
| length start /= length end = []
Line 629:
where g (b, r) a = (\x -> (x, x:r)) <$> f b a
 
findM p = msum . map (\x -> if p x then pure x else mzero)</langsyntaxhighlight>
 
===Using A*-search===
See [[A*_search_algorithm#Haskell]]
 
<langsyntaxhighlight lang="haskell">import AStar (findPath, Graph(..))
import qualified Data.Map as M
 
Line 646:
g = Graph $ \w -> M.fromList [ (x, 1)
| x <- short_dict
, distance w x == 1 ]</langsyntaxhighlight>
 
<pre>λ> main
Line 660:
Here we use a double ended breadth first search (starting from each end). This tends to give us several options where they meet in the middle, so we pick a shortest example from those.
 
<langsyntaxhighlight Jlang="j">extend=: {{
j=. {:y
l=. <:{:$m
Line 689:
end.
}.,' ',.r{words
}}</langsyntaxhighlight>
 
Task examples:<langsyntaxhighlight Jlang="j"> 'boy' wlad 'man'
boy bay ban man
'girl' wlad 'lady'
Line 705:
white whine chine chink clink blink blank black
'bubble' wlad 'tickle'
bubble babble gabble garble gargle gaggle giggle jiggle jingle tingle tinkle tickle</langsyntaxhighlight>
 
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
Line 802:
wordLadder(words, "bubble", "tickle", 12);
}
}</langsyntaxhighlight>
{{out}}
<pre>boy -> bay -> may -> man
Line 815:
===Faster alternative===
{{trans|C++}}
<langsyntaxhighlight lang="java">import java.io.*;
import java.util.*;
 
Line 886:
System.out.printf("%s into %s cannot be done.\n", from, to);
}
}</langsyntaxhighlight>
 
{{out}}
Line 904:
{{works with|jq}}
'''Works with gojq, the Go implementation of jq'''
<langsyntaxhighlight lang="jq">def count(stream): reduce stream as $i (0; .+1);
 
def words: [inputs]; # one way to read the word list
Line 946:
words
| pairs as $p
| wordLadder($p[0]; $p[1])</langsyntaxhighlight>
 
{{out}}
Line 959:
 
=={{header|Julia}}==
<langsyntaxhighlight lang="julia">const dict = Set(split(read("unixdict.txt", String), r"\s+"))
 
function targeted_mutations(str::AbstractString, target::AbstractString)
Line 985:
println("john to jane: ", targeted_mutations("john", "jane"))
println("child to adult: ", targeted_mutations("child", "adult"))
</langsyntaxhighlight>{{out}}
<pre>
boy to man: [["boy", "bay", "may", "man"], ["boy", "bay", "ban", "man"], ["boy", "bon", "ban", "man"]]
Line 995:
=={{header|Mathematica}} / {{header|Wolfram Language}}==
{{incorrect|Mathmatica|The requirement is to find the shortest path other examples do John to Jane with 4 intermediate words. Also an impossible example is required: child to adult.}}
<langsyntaxhighlight Mathematicalang="mathematica">db=DeleteDuplicates[RemoveDiacritics[ToLowerCase[Select[DictionaryLookup[],StringLength/*EqualTo[3]]]]];
sel=Select[Subsets[db,{2}],HammingDistance[#[[1]],#[[2]]]==1&];
g=Graph[db,UndirectedEdge@@@sel];
Line 1,009:
sel=Select[Subsets[db,{2}],HammingDistance[#[[1]],#[[2]]]==1&];
g=Graph[db,UndirectedEdge@@@sel];
FindShortestPath[g,"child","adult"]</langsyntaxhighlight>
{{out}}
<pre>{"boy", "bay", "ban", "man"}
Line 1,017:
 
=={{header|Nim}}==
<langsyntaxhighlight Nimlang="nim">import sets, strformat, strutils
 
 
Line 1,072:
echo &"No path from “{start}” to “{target}”."
else:
echo path.join(" → ")</langsyntaxhighlight>
 
{{out}}
Line 1,087:
===Direct translation===
{{trans|C++}}
<langsyntaxhighlight lang="perl">use strict;
use warnings;
 
Line 1,185:
word_ladder('lead', 'gold');
word_ladder('white', 'black');
word_ladder('bubble', 'tickle');</langsyntaxhighlight>
{{out}}
<pre>boy -> bay -> ban -> man
Line 1,198:
===Idiomatic version===
<b>Exactly</b> the same algorithm, written in a more Perl-ish style. Is this better, or worse? Maybe both. Interestingly, runs 1/3-rd faster.
<langsyntaxhighlight lang="perl">use strict;
use warnings;
use feature 'say';
Line 1,248:
}
 
word_ladder(split) for 'boy man', 'girl lady', 'john jane', 'child adult';</langsyntaxhighlight>
Same style output.
 
=={{header|Phix}}==
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">words</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">unix_dict</span><span style="color: #0000FF;">()</span>
Line 1,282:
<span style="color: #000000;">word_ladder</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"john"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"jane"</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">word_ladder</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"child"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"adult"</span><span style="color: #0000FF;">)</span>
<!--</langsyntaxhighlight>-->
<small>Aside: an initial poss = filter(poss,"out",{a}) might be prudent, but would only prevent a single next:={} step, at about the same cost as the initial filter anyway.</small>
{{out}}
Line 1,294:
=={{header|Python}}==
The function ''cache'' is not part of the algorithm but avoid re-download and map re-computing at each re-run.
<langsyntaxhighlight lang="python">import os,sys,zlib,urllib.request
 
def h ( str,x=9 ):
Line 1,341:
 
for w in ('boy man','girl lady','john jane','alien drool','child adult'):
print( find_path( cache( build_map,load_dico( dico_url )),*w.split()))</langsyntaxhighlight>
 
{{out}}
Line 1,354:
=={{header|Racket}}==
 
<langsyntaxhighlight lang="racket">#lang racket
 
(define *unixdict* (delay (with-input-from-file "../../data/unixdict.txt"
Line 1,394:
(Word-ladder "john" "jane")
(Word-ladder "alien" "drool")
(Word-ladder "child" "adult"))</langsyntaxhighlight>
 
{{out}}
Line 1,445:
 
=={{header|Raku}}==
<syntaxhighlight lang="raku" perl6line>constant %dict = 'unixdict.txt'.IO.lines
.classify(*.chars)
.map({ .key => .value.Set });
Line 1,481:
say word_ladder($from, $to)
// "$from into $to cannot be done";
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,498:
Programming note: &nbsp; &nbsp; this REXX program uses the &nbsp; '''lower''' &nbsp; BIF &nbsp; which Regina has).
<br>If your REXX doesn't support that BIF, &nbsp; here is an equivalent function:
<langsyntaxhighlight lang="rexx">lower: procedure; parse arg a; @= 'abcdefghijklmnopqrstuvwxyz'; @u= @; upper @u
return translate(a, @, @u)</langsyntaxhighlight>
<langsyntaxhighlight lang="rexx">/*REXX program finds words (within an identified dict.) to solve a word ladder puzzle.*/
parse arg base targ iFID . /*obtain optional arguments from the CL*/
if base=='' | base=="," then base= 'boy' /*Not specified? Then use the default.*/
Line 1,557:
end /*k*/
end /*i*/
$= $$; return ''</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the default inputs:}}
<pre>
Line 1,612:
=={{header|Ruby}}==
{{trans|Raku}}
<langsyntaxhighlight lang="ruby">require "set"
 
Words = File.open("unixdict.txt").read.split("\n").
Line 1,654:
puts "#{from} into #{to} cannot be done"
end
end</langsyntaxhighlight>
 
{{Out}}
Line 1,664:
=={{header|Swift}}==
{{trans|Wren}}
<langsyntaxhighlight lang="swift">import Foundation
 
func oneAway(string1: [Character], string2: [Character]) -> Bool {
Line 1,724:
} catch {
print(error.localizedDescription)
}</langsyntaxhighlight>
 
{{out}}
Line 1,741:
{{trans|Phix}}
{{libheader|Wren-sort}}
<langsyntaxhighlight lang="ecmascript">import "io" for File
import "/sort" for Find
 
Line 1,781:
["child", "adult"]
]
for (pair in pairs) wordLadder.call(pair[0], pair[1])</langsyntaxhighlight>
 
{{out}}
10,333

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.