State name puzzle: Difference between revisions

m
m (→‎{{header|jq}}: fix typo)
m (→‎{{header|Wren}}: Minor tidy)
 
(29 intermediate revisions by 17 users not shown)
Line 4:
This task is inspired by [http://drdobbs.com/windows/198701685 Mark Nelson's DDJ Column "Wordplay"] and one of the weekly puzzle challenges from Will Shortz on NPR Weekend Edition [http://www.npr.org/templates/story/story.php?storyId=9264290] and originally attributed to David Edelheit.
 
The challenge was to take the names of two U.S. States, mix them all together, then rearrange the letters to form the names of two ''different'' U.S. States (so that all four state names differ from one another). What states are these?
 
What states are these?
 
 
The problem was reissued on [https://tapestry.tucson.az.us/twiki/bin/view/Main/StateNamesPuzzle the Unicon Discussion Web] which includes several solutions with analysis. Several techniques may be helpful and you may wish to refer to [[wp:Goedel_numbering|Gödel numbering]], [[wp:Equivalence_relation|equivalence relations]], and [[wp:Equivalence_classes|equivalence classes]]. The basic merits of these were discussed in the Unicon Discussion Web.
Line 10 ⟶ 13:
A second challenge in the form of a set of fictitious new states was also presented.
 
 
'''Task:'''<br>
;Task:
Write a program to solve the challenge using both the original list of states and the fictitious list.
 
 
Caveats:
;Caveats:
* case and spacing aren't significant - just letters (harmonize case)
* don't expect the names to be in any order - such as being sorted
* don't rely on names to be unique (eliminate duplicates - meaning if Iowa appears twice you can only use it once)
 
 
Comma separated list of state names used in the original puzzle:
<pre>
"Alabama", "Alaska", "Arizona", "Arkansas",
"California", "Colorado", "Connecticut", "Delaware",
"Florida", "Georgia", "Hawaii", "Idaho", "Illinois",
"Delaware",
"FloridaIndiana", "GeorgiaIowa", "Kansas", "Kentucky", "HawaiiLouisiana",
"IdahoMaine", "IllinoisMaryland", "IndianaMassachusetts", "IowaMichigan",
"KansasMinnesota", "KentuckyMississippi", "Missouri", "LouisianaMontana",
"MaineNebraska", "MarylandNevada", "MassachusettsNew Hampshire", "MichiganNew Jersey",
"MinnesotaNew Mexico", "MississippiNew York", "MissouriNorth Carolina", "MontanaNorth Dakota",
"NebraskaOhio", "NevadaOklahoma", "NewOregon", Hampshire"Pennsylvania", "NewRhode JerseyIsland",
"NewSouth MexicoCarolina", "NewSouth YorkDakota", "North Carolina"Tennessee", "North Dakota"Texas",
"OhioUtah", "OklahomaVermont", "OregonVirginia",
"Washington", "West Virginia", "Wisconsin", "Wyoming"
"Pennsylvania", "Rhode Island",
"South Carolina", "South Dakota", "Tennessee", "Texas",
"Utah", "Vermont", "Virginia",
"Washington", "West Virginia", "Wisconsin", "Wyoming"
</pre>
Comma separated list of additional fictitious state names to be added to the original (Includes a duplicate):
<pre>
"New Kory", "Wen Kory", "York New", "Kory New", "New Kory"
</pre>
 
 
{{Template:Strings}}
<br><br>
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">V states = [‘Alabama’, ‘Alaska’, ‘Arizona’, ‘Arkansas’,
‘California’, ‘Colorado’, ‘Connecticut’, ‘Delaware’, ‘Florida’,
‘Georgia’, ‘Hawaii’, ‘Idaho’, ‘Illinois’, ‘Indiana’, ‘Iowa’, ‘Kansas’,
‘Kentucky’, ‘Louisiana’, ‘Maine’, ‘Maryland’, ‘Massachusetts’,
‘Michigan’, ‘Minnesota’, ‘Mississippi’, ‘Missouri’, ‘Montana’,
‘Nebraska’, ‘Nevada’, ‘New Hampshire’, ‘New Jersey’, ‘New Mexico’,
‘New York’, ‘North Carolina’, ‘North Dakota’, ‘Ohio’, ‘Oklahoma’,
‘Oregon’, ‘Pennsylvania’, ‘Rhode Island’, ‘South Carolina’,
‘South Dakota’, ‘Tennessee’, ‘Texas’, ‘Utah’, ‘Vermont’, ‘Virginia’,
‘Washington’, ‘West Virginia’, ‘Wisconsin’, ‘Wyoming’]
 
states = sorted(states)
 
DefaultDict[String, [String]] smap
L(s1) states[0 .< (len)-1]
V i = L.index
L(s2) states[i+1..]
smap[sorted(s1‘’s2)].append(s1‘ + ’s2)
 
L(pairs) sorted(smap.values())
I pairs.len > 1
print(pairs.join(‘ = ’))</syntaxhighlight>
 
{{out}}
<pre>
North Carolina + South Dakota = North Dakota + South Carolina
</pre>
 
=={{header|AppleScript}}==
<syntaxhighlight lang="applescript">use AppleScript version "2.3.1" -- Mac OS X 10.9 (Mavericks) or later.
use sorter : script ¬
"Custom Iterative Ternary Merge Sort" -- <www.macscripter.net/t/timsort-and-nigsort/71383/3>
 
on stateNamePuzzle()
script o
property stateNames : {"Alabama", "Alaska", "Arizona", "Arkansas", ¬
"California", "Colorado", "Connecticut", "Delaware", ¬
"Florida", "Georgia", "Hawaii", "Idaho", "Illinois", ¬
"Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", ¬
"Maine", "Maryland", "Massachusetts", "Michigan", ¬
"Minnesota", "Mississippi", "Missouri", "Montana", ¬
"Nebraska", "Nevada", "New Hampshire", "New Jersey", ¬
"New Mexico", "New York", "North Carolina", "North Dakota", ¬
"Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", ¬
"South Carolina", "South Dakota", "Tennessee", "Texas", ¬
"Utah", "Vermont", "Virginia", ¬
"Washington", "West Virginia", "Wisconsin", "Wyoming", ¬
"New Kory", "Wen Kory", "York New", "Kory New", "New Kory"}
property workList : {}
-- Custom comparison handler for the sort.
on isGreater(a, b)
return (beginning of a > beginning of b)
end isGreater
end script
ignoring case
-- Remove duplicates.
repeat with i from 1 to (count o's stateNames)
set thisName to o's stateNames's item i
if ({thisName} is not in o's workList) then set end of o's workList to thisName
end repeat
set o's stateNames to o's workList
-- Build a list of lists containing unique pairs of names preceded by
-- text composed of their combined and sorted visible characters.
set o's workList to {}
set stateCount to (count o's stateNames)
repeat with i from 1 to (stateCount - 1)
set name1 to o's stateNames's item i
repeat with j from (i + 1) to stateCount
set name2 to o's stateNames's item j
set chrs to (name1 & name2)'s characters
tell sorter to sort(chrs, 1, -1, {})
set end of o's workList to {join(chrs, "")'s word 1, {name1, name2}}
end repeat
end repeat
-- Sort the lists on the character strings
set pairCount to (count o's workList)
tell sorter to sort(o's workList, 1, pairCount, {comparer:o})
-- Look for groups of equal character strings and match
-- associated name pairs not containing the same name(s).
set output to {}
set l to 1
repeat while (l < pairCount)
set chrs to beginning of o's workList's item l
set r to l
repeat while ((r < pairCount) and (beginning of o's workList's item (r + 1) = chrs))
set r to r + 1
end repeat
if (r > l) then
repeat with i from l to (r - 1)
set {name1, name2} to end of o's workList's item i
set text1 to join(result, " and ") & " --> "
repeat with j from (i + 1) to r
set pair2 to end of o's workList's item j
if (not (({name1} is in pair2) or ({name2} is in pair2))) then
set end of output to text1 & join(pair2, " and ")
end if
end repeat
end repeat
end if
set l to r + 1
end repeat
end ignoring
return join(output, linefeed)
end stateNamePuzzle
 
on join(lst, delim)
set astid to AppleScript's text item delimiters
set AppleScript's text item delimiters to delim
set txt to lst as text
set AppleScript's text item delimiters to astid
return txt
end join
 
stateNamePuzzle()</syntaxhighlight>
 
{{output}}
<syntaxhighlight lang="applescript">"North Carolina and South Dakota --> North Dakota and South Carolina
New York and New Kory --> Wen Kory and York New
New York and New Kory --> Wen Kory and Kory New
New York and New Kory --> York New and Kory New
New York and Wen Kory --> New Kory and York New
New York and Wen Kory --> New Kory and Kory New
New York and Wen Kory --> York New and Kory New
New York and York New --> New Kory and Wen Kory
New York and York New --> New Kory and Kory New
New York and York New --> Wen Kory and Kory New
New York and Kory New --> New Kory and Wen Kory
New York and Kory New --> New Kory and York New
New York and Kory New --> Wen Kory and York New
New Kory and Wen Kory --> York New and Kory New
New Kory and York New --> Wen Kory and Kory New
New Kory and Kory New --> Wen Kory and York New"
</syntaxhighlight>
 
=={{header|Bracmat}}==
<langsyntaxhighlight lang="bracmat">( Alabama
Alaska
Arizona
Line 132 ⟶ 282:
& "State name puzzle"$!states
& "State name puzzle"$(!states !extrastates)
);</langsyntaxhighlight>
Output:
<pre>North Carolina + South Dakota = North Dakota + South Carolina
Line 156 ⟶ 306:
=={{header|C}}==
Sort by letter occurence and deal with dupes.
<langsyntaxhighlight Clang="c">#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Line 261 ⟶ 411:
find_mix();
return 0;
}</langsyntaxhighlight>
 
=={{header|C++}}==
Ported from C solution.
<syntaxhighlight lang="cpp">#include <algorithm>
#include <iostream>
#include <string>
#include <array>
#include <vector>
 
template<typename T>
T unique(T&& src)
{
T retval(std::move(src));
std::sort(retval.begin(), retval.end(), std::less<typename T::value_type>());
retval.erase(std::unique(retval.begin(), retval.end()), retval.end());
return retval;
}
 
#define USE_FAKES 1
 
auto states = unique(std::vector<std::string>({
#if USE_FAKES
"Slender Dragon", "Abalamara",
#endif
"Alabama", "Alaska", "Arizona", "Arkansas",
"California", "Colorado", "Connecticut",
"Delaware",
"Florida", "Georgia", "Hawaii",
"Idaho", "Illinois", "Indiana", "Iowa",
"Kansas", "Kentucky", "Louisiana",
"Maine", "Maryland", "Massachusetts", "Michigan",
"Minnesota", "Mississippi", "Missouri", "Montana",
"Nebraska", "Nevada", "New Hampshire", "New Jersey",
"New Mexico", "New York", "North Carolina", "North Dakota",
"Ohio", "Oklahoma", "Oregon",
"Pennsylvania", "Rhode Island",
"South Carolina", "South Dakota", "Tennessee", "Texas",
"Utah", "Vermont", "Virginia",
"Washington", "West Virginia", "Wisconsin", "Wyoming"
}));
 
struct counted_pair
{
std::string name;
std::array<int, 26> count{};
 
void count_characters(const std::string& s)
{
for (auto&& c : s) {
if (c >= 'a' && c <= 'z') count[c - 'a']++;
if (c >= 'A' && c <= 'Z') count[c - 'A']++;
}
}
 
counted_pair(const std::string& s1, const std::string& s2)
: name(s1 + " + " + s2)
{
count_characters(s1);
count_characters(s2);
}
};
 
bool operator<(const counted_pair& lhs, const counted_pair& rhs)
{
auto lhs_size = lhs.name.size();
auto rhs_size = rhs.name.size();
return lhs_size == rhs_size
? std::lexicographical_compare(lhs.count.begin(),
lhs.count.end(),
rhs.count.begin(),
rhs.count.end())
: lhs_size < rhs_size;
}
 
bool operator==(const counted_pair& lhs, const counted_pair& rhs)
{
return lhs.name.size() == rhs.name.size() && lhs.count == rhs.count;
}
 
int main()
{
const int n_states = states.size();
 
std::vector<counted_pair> pairs;
for (int i = 0; i < n_states; i++) {
for (int j = 0; j < i; j++) {
pairs.emplace_back(counted_pair(states[i], states[j]));
}
}
std::sort(pairs.begin(), pairs.end());
 
auto start = pairs.begin();
while (true) {
auto match = std::adjacent_find(start, pairs.end());
if (match == pairs.end()) {
break;
}
auto next = match + 1;
std::cout << match->name << " => " << next->name << "\n";
start = next;
}
}</syntaxhighlight>
 
=={{header|Clojure}}==
<syntaxhighlight lang="clojure">(ns clojure-sandbox.statenames
(:require [clojure.data.csv :as csv]
[clojure.java.io :as io]
[clojure.string :refer [lower-case]]
[clojure.math.combinatorics :as c]
[clojure.pprint :as pprint]))
 
(def made-up-states ["New Kory" "Wen Kory" "York New" "Kory New" "New Kory"])
 
;; I saved the list of states in a local file to keep the code clean but you can copy and paste the list instead
(def real-states (with-open [in-file (io/reader (io/resource "states.csv"))]
(->> (doall
(csv/read-csv in-file))
(map first))))
 
(defn- state->charset [state-name]
"Convert state name into sorted list of characters with no spaces"
(->> state-name
char-array
sort
(filter (set (map char (range 97 123)))))) ;; ASCII range for lower case letters
 
(defn- add-charsets [states]
"Calculate sorted character list for each state and store with name"
(->> states
(map lower-case) ;; Convert all names to lower case
set ;; remove duplicates
(map
(fn [s] {:name s
:characters (state->charset s)})))) ;; add characters
 
(defn- pair-chars [state1 state2]
"Join the characters of two states together and sort them"
(-> state1
:characters
(concat (:characters state2))
sort))
 
(defn- pair [[state1 state2]]
"Record representing two state names and the total characters used in them"
{:inputs [(:name state1) (:name state2)]
:characters (pair-chars state1 state2)})
 
(defn- find-all-pairs [elements]
(c/combinations elements 2))
 
(defn- pairs-to-search [state-names]
"Create character lists for all states and return a list of all possible pairs"
(->> state-names
add-charsets
find-all-pairs
(map pair)))
 
(defn- pairs-have-same-letters? [[pair1 pair2]]
(= (:characters pair1) (:characters pair2)))
 
(defn- inputs-are-distinct? [[pair1 pair2 :as pairs]]
"Check that two pairs of states don't contain the same state"
(= 4 ;; There should be a total of 4 distinct states in the two pairs
(->> pairs
(map :inputs)
flatten
set
count)))
 
(defn- search [pairs]
(->> pairs
find-all-pairs ;; find pairs of pairs to search
(filter pairs-have-same-letters?) ;; Keep only those where each pair has the same characters
(filter inputs-are-distinct?))) ;; Remove pairs with duplicate states
 
(defn find-matches [state-names]
"Find all state pairs and return pairs of them using the same letters"
(-> state-names
pairs-to-search
search))
 
(defn- format-match-output [[pair1 pair2]]
"Format a pair of state pairs to print out"
(str (first (:inputs pair1))
" + "
(last (:inputs pair1))
" = "
(first (:inputs pair2))
" + "
(last (:inputs pair2))))
 
(defn- evaluate-and-print [states]
(->> states
find-matches
(map format-match-output)
pprint/pprint))
 
(defn -main [& args]
(println "Solutions for 50 real states")
(evaluate-and-print real-states)
(println "Solutions with made up states added")
(evaluate-and-print (concat real-states made-up-states)))
</syntaxhighlight>
{{out}}
<pre>
Solutions for 50 real states
("north carolina + south dakota = south carolina + north dakota")
Solutions with made up states added
("new york + new kory = kory new + york new"
"new york + new kory = kory new + wen kory"
"new york + new kory = york new + wen kory"
"new york + kory new = new kory + york new"
"new york + kory new = new kory + wen kory"
"new york + kory new = york new + wen kory"
"new york + york new = new kory + kory new"
"new york + york new = new kory + wen kory"
"new york + york new = kory new + wen kory"
"new york + wen kory = new kory + kory new"
"new york + wen kory = new kory + york new"
"new york + wen kory = kory new + york new"
"north carolina + south dakota = south carolina + north dakota"
"new kory + kory new = york new + wen kory"
"new kory + york new = kory new + wen kory"
"new kory + wen kory = kory new + york new")
</pre>
=={{header|D}}==
<langsyntaxhighlight lang="d">import std.stdio, std.algorithm, std.string, std.exception;
 
auto states = ["Alabama", "Alaska", "Arizona", "Arkansas",
Line 291 ⟶ 665:
writefln("%-(%-(%s = %)\n%)",
smap.values.sort().filter!q{ a.length > 1 });
}</langsyntaxhighlight>
{{out}}
<pre>North Carolina + South Dakota = North Dakota + South Carolina</pre>
 
=={{header|F_Sharp|F#}}==
<syntaxhighlight lang="fsharp">
// State name puzzle. Nigel Galloway: February 9th., 2023
let states=["Alabama"; "Alaska"; "Arizona"; "Arkansas"; "California"; "Colorado"; "Connecticut"; "Delaware"; "Florida"; "Georgia"; "Hawaii"; "Idaho"; "Illinois"; "Indiana"; "Iowa"; "Kansas"; "Kentucky"; "Louisiana"; "Maine"; "Maryland"; "Massachusetts"; "Michigan"; "Minnesota"; "Mississippi"; "Missouri"; "Montana"; "Nebraska"; "Nevada"; "New Hampshire"; "New Jersey"; "New Mexico"; "New York"; "North Carolina"; "North Dakota"; "Ohio"; "Oklahoma"; "Oregon"; "Pennsylvania"; "Rhode Island"; "South Carolina"; "South Dakota"; "Tennessee"; "Texas"; "Utah"; "Vermont"; "Virginia"; "Washington"; "West Virginia"; "Wisconsin"; "Wyoming"; "New Kory"; "Wen Kory"; "York New"; "Kory New"; "New Kory"]|>List.distinct
let fN(i,g)(e,l)=let n=Array.zeroCreate<int>256
let fN i g=n[g]<-n[g]+i
let fG n g=(g:string).ToLower().ToCharArray()|>Array.iter(fun g->fN n (int g))
fG 1 i; fG 1 g; fG -1 e; fG -1 l; n|>Array.forall((=)0)
let n=states|>List.allPairs states|>List.filter(fun(n,g)->n<g)|>List.groupBy(fun(n,g)->n.Length+g.Length)
let g=n|>List.map(fun(_,n)->n|>List.allPairs n|>List.filter(fun((n,g),(n',g'))->(n,g)<(n',g') && n<>n' && n<>g' && g<>n' && g<>g' && fN(n,g)(n',g')))|>List.filter(List.isEmpty>>not)
g|>List.iter(List.iter(fun((i,g),(e,l))->printfn $"%s{i},%s{g}->%s{e},%s{l}"))
</syntaxhighlight>
{{out}}
<pre>
New Kory,New York->Wen Kory,York New
New Kory,Wen Kory->New York,York New
New Kory,York New->New York,Wen Kory
Kory New,New York->New Kory,Wen Kory
Kory New,New York->New Kory,York New
Kory New,New York->Wen Kory,York New
Kory New,New Kory->New York,Wen Kory
Kory New,New Kory->New York,York New
Kory New,New Kory->Wen Kory,York New
Kory New,Wen Kory->New York,York New
Kory New,Wen Kory->New Kory,New York
Kory New,Wen Kory->New Kory,York New
Kory New,York New->New York,Wen Kory
Kory New,York New->New Kory,New York
Kory New,York New->New Kory,Wen Kory
North Carolina,South Dakota->North Dakota,South Carolina
</pre>
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import (
Line 372 ⟶ 777:
}
}
}</langsyntaxhighlight>
Output:
<pre>
Line 397 ⟶ 802:
 
=={{header|Haskell}}==
<langsyntaxhighlight lang="haskell">{-# LANGUAGE TupleSections #-}
 
import Data.Char (toLowerisLetter, isLettertoLower)
import Data.List (sort, sortBy, nub, groupBy)
import Data.Function (on)
import Data.List (groupBy, nub, sort, sortBy)
 
-------------------- STATE NAME PUZZLE -------------------
stateNames :: [String]
stateNames=
["Alabama",
"Alaska",
"Arizona",
"Arkansas",
"California",
"Colorado",
"Connecticut",
"Delaware",
"Florida",
"Georgia",
"Hawaii",
"Idaho",
"Illinois",
"Indiana",
"Iowa",
"Kansas",
"Kentucky",
"Louisiana",
"Maine",
"Maryland",
"Massachusetts",
"Michigan",
"Minnesota",
"Mississippi",
"Missouri",
"Montana",
"Nebraska",
"Nevada",
"New Hampshire",
"New Jersey",
"New Mexico",
"New York",
"North Carolina",
"North Dakota",
"Ohio",
"Oklahoma",
"Oregon",
"Pennsylvania",
"Rhode Island",
"South Carolina",
"South Dakota",
"Tennessee",
"Texas",
"Utah",
"Vermont",
"Virginia",
"Washington",
"West Virginia",
"Wisconsin",
"Wyoming"]
fakeStateNames :: [String]
fakeStateNames =
["New Kory",
"Wen Kory",
"York New",
"Kory New",
"New Kory"]
 
pairspuzzle :: [aString] -> [(a(String,a String), (String, String))]
puzzle states =
concatMap
((filter isValid . pairs) . map snd)
( filter ((> 1) . length) $
groupBy ((==) `on` fst) $
sortBy
(compare `on` fst)
[ (pkey (a <> b), (a, b))
| (a, b) <- pairs (nub $ sort states)
]
)
where
pkey = sort . filter isLetter . map toLower
isValid ((a0, a1), (b0, b1)) =
(a0 /= b0)
&& (a0 /= b1)
&& (a1 /= b0)
&& (a1 /= b1)
 
pairs :: [a] -> [(a, a)]
pairs [] = []
pairs (y : ys) = map (y,) ys ++<> pairs ys
 
puzzle :: [String] -> [((String,String), (String, String))]
puzzle states =
concatMap (filter isValid.pairs) $
map (map snd) $
filter ((>1) . length ) $
groupBy ((==) `on` fst) $
sortBy (compare `on` fst) [(pkey (a++b), (a,b)) | (a,b) <- pairs (nub $ sort states)] where
pkey = sort . filter isLetter . map toLower
isValid ((a0, a1),(b0, b1)) = (a0 /= b0) && (a0 /= b1) && (a1 /= b0) && (a1 /= b1)
 
--------------------------- TEST -------------------------
main :: IO ()
main = do
putStrLn $ "Matching pairs generated from "
"Matching pairs generated from "
++ show (length stateNames) ++ " state names and "
++<> show (length fakeStateNamesstateNames) ++ " fake state names:"
<> " state names and "
mapM_ print $ puzzle $ stateNames ++ fakeStateNames</lang>
<> show (length fakeStateNames)
<> " fake state names:"
mapM_ print $ puzzle $ stateNames <> fakeStateNames
 
stateNames :: [String]
stateNames =
[ "Alabama",
"Alaska",
"Arizona",
"Arkansas",
"California",
"Colorado",
"Connecticut",
"Delaware",
"Florida",
"Georgia",
"Hawaii",
"Idaho",
"Illinois",
"Indiana",
"Iowa",
"Kansas",
"Kentucky",
"Louisiana",
"Maine",
"Maryland",
"Massachusetts",
"Michigan",
"Minnesota",
"Mississippi",
"Missouri",
"Montana",
"Nebraska",
"Nevada",
"New Hampshire",
"New Jersey",
"New Mexico",
"New York",
"North Carolina",
"North Dakota",
"Ohio",
"Oklahoma",
"Oregon",
"Pennsylvania",
"Rhode Island",
"South Carolina",
"South Dakota",
"Tennessee",
"Texas",
"Utah",
"Vermont",
"Virginia",
"Washington",
"West Virginia",
"Wisconsin",
"Wyoming"
]
 
fakeStateNames :: [String]
fakeStateNames =
[ "New Kory",
"Wen Kory",
"York New",
"Kory New",
"New Kory"
]</syntaxhighlight>
{{out}}
<pre style="font-size:80%">Matching pairs generated from 50 state names and 5 fake state names:
Line 503 ⟶ 926:
(("New Kory","York New"),("New York","Wen Kory"))
</pre>
 
 
=={{header|Icon}} and {{header|Unicon}}==
=== Equivalence Class Solution ===
<langsyntaxhighlight Iconlang="icon">link strings # for csort and deletec
 
procedure main(arglist)
Line 555 ⟶ 977:
}
write("... runtime ",(&time - st)/1000.,"\n",m," matches found.")
end</langsyntaxhighlight>
 
The following are common routines:<langsyntaxhighlight Iconlang="icon">procedure getStates() # return list of state names
return ["Alabama", "Alaska", "Arizona", "Arkansas",
"California", "Colorado", "Connecticut",
Line 577 ⟶ 999:
procedure getStates2() # return list of state names + fictious states
return getStates() ||| ["New Kory", "Wen Kory", "York New", "Kory New", "New Kory"]
end</langsyntaxhighlight>
 
=== Godel Number Solution ===
<langsyntaxhighlight Iconlang="icon">link factors
 
procedure GNsolve(S)
Line 637 ⟶ 1,059:
every z *:= xlate[!s]
return z
end</langsyntaxhighlight>
 
{{libheader|Icon Programming Library}}
Line 686 ⟶ 1,108:
Implementation:
 
<langsyntaxhighlight lang="j">require'strings stats'
 
states=:<;._2]0 :0-.LF
Line 706 ⟶ 1,128:
pairUp=: (#~ matchUp)@({~ 2 comb #)@~.
matchUp=: (i.~ ~: i:~)@:(<@normalize@;"1)
normalize=: /:~@tolower@-.&' '</langsyntaxhighlight>
 
In action:
 
<langsyntaxhighlight lang="j"> pairUp states
┌──────────────┬──────────────┐
│North Carolina│South Dakota │
├──────────────┼──────────────┤
│North Dakota │South Carolina│
└──────────────┴──────────────┘</langsyntaxhighlight>
 
Note: this approach is sufficient to solve the original problem, but does not properly deal with the addition of fictitious states. So:
 
<langsyntaxhighlight lang="j">isolatePairs=: ~.@matchUp2@(#~ *./@matchUp"2)@({~ 2 comb #)
matchUp2=: /:~"2@:(/:~"1)@(#~ 4=#@~.@,"2)</langsyntaxhighlight>
 
In action:
 
<langsyntaxhighlight lang="j"> isolatePairs pairUp 'New Kory';'Wen Kory';'York New';'Kory New';'New Kory';states
┌──────────────┬──────────────┐
│Kory New │York New │
Line 819 ⟶ 1,241:
├──────────────┼──────────────┤
│North Dakota │South Carolina│
└──────────────┴──────────────┘</langsyntaxhighlight>
 
=={{header|Java}}==
{{works with|Java|8}}
<langsyntaxhighlight lang="java">import java.util.*;
import java.util.stream.*;
 
Line 859 ⟶ 1,281:
String key = Arrays.toString(s.chars().sorted().toArray());
 
List<String[]> val = map.getOrDefault(key, new ArrayList<>());
if ((val = map.get(key)) == null)
val = new ArrayList<>();
val.add(pair);
map.put(key, val);
Line 882 ⟶ 1,302:
});
}
}</langsyntaxhighlight>
 
Output:
Line 905 ⟶ 1,325:
=={{header|jq}}==
{{works with|jq|1.4}}
<langsyntaxhighlight lang="jq"># Input: a string
# Output: an array, being the exploded form of the normalized input
def normalize:
Line 944 ⟶ 1,364:
else .
end)
| .[];</langsyntaxhighlight>
 
'''The task:'''
<langsyntaxhighlight lang="jq">def States: [
"Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado",
"Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho",
Line 966 ⟶ 1,386:
(States + ["New Kory", "Wen Kory", "York New", "Kory New", "New Kory"] | solve) ;
 
task</langsyntaxhighlight>
{{out}}
<langsyntaxhighlight lang="sh">$ jq -c -n -r -f State_name_puzzle.jq
Real state names:
[["North Carolina","South Dakota"],["North Dakota","South Carolina"]]
Line 988 ⟶ 1,408:
[["New Kory","Wen Kory"],["New York","York New"]]
[["New Kory","York New"],["New York","Wen Kory"]]
[["North Carolina","South Dakota"],["North Dakota","South Carolina"]]</langsyntaxhighlight>
 
=={{header|Julia}}==
{{works with|Julia|0.6}}
{{trans|Kotlin}}
 
'''Module''':
<syntaxhighlight lang="julia">module StateNamePuzzle
 
const realnames = ["Alabama", "Alaska", "Arizona", "Arkansas", "California",
"Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho",
"Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine",
"Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri",
"Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico",
"New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon",
"Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee",
"Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia",
"Wisconsin", "Wyoming"]
 
const fictitious = ["New Kory", "Wen Kory", "York New", "Kory New", "New Kory"]
 
function combine(a::AbstractString, b::AbstractString)
chars = vcat(collect(Char, a), collect(Char, b))
sort!(chars)
return join(chars)
end
 
function solve(input::Vector{<:AbstractString})
dict = Dict{String,String}()
for state in input
key = replace(state, " ", "") |> lowercase
if !haskey(dict, key)
dict[key] = state
end
end
keyset = collect(keys(dict))
solutions = String[]
duplicates = String[]
for i in eachindex(keyset), j in (i+1):endof(keyset)
len1 = length(keyset[i]) + length(keyset[j])
combined1 = combine(keyset[i], keyset[j])
for k in eachindex(keyset), l in k+1:endof(keyset)
k ∈ (i, j) && continue
l ∈ (i, j) && continue
len2 = length(keyset[k]) + length(keyset[l])
len1 != len2 && continue
combined2 = combine(keyset[k], keyset[l])
if combined1 == combined2
f1 = dict[keyset[i]] * " + " * dict[keyset[j]]
f2 = dict[keyset[k]] * " + " * dict[keyset[l]]
f3 = f1 * " = " * f2
f3 ∈ duplicates && continue
push!(solutions, f3)
f4 = f2 * " = " * f1
push!(duplicates, f4)
end
end
end
return sort!(solutions)
end
 
end # module StateNamePuzzle</syntaxhighlight>
 
'''Main''':
<syntaxhighlight lang="julia">println("Real states:")
foreach(println, StateNamePuzzle.solve(StateNamePuzzle.realnames))
 
println("\nReal + fictitious state:")
foreach(println, StateNamePuzzle.solve(vcat(StateNamePuzzle.realnames,
StateNamePuzzle.fictitious)))</syntaxhighlight>
 
{{out}}
<pre>Real states:
South Dakota + North Carolina = South Carolina + North Dakota
 
Real + fictitious state:
Kory New + New Kory = New York + York New
Kory New + New Kory = Wen Kory + New York
Kory New + New Kory = Wen Kory + York New
Kory New + New York = New Kory + Wen Kory
Kory New + New York = New Kory + York New
Kory New + New York = Wen Kory + York New
Kory New + Wen Kory = New Kory + New York
Kory New + Wen Kory = New Kory + York New
Kory New + Wen Kory = New York + York New
Kory New + York New = New Kory + New York
Kory New + York New = New Kory + Wen Kory
Kory New + York New = Wen Kory + New York
New Kory + New York = Wen Kory + York New
New Kory + Wen Kory = New York + York New
New Kory + York New = Wen Kory + New York
South Dakota + North Carolina = South Carolina + North Dakota</pre>
 
=={{header|Kotlin}}==
<syntaxhighlight lang="scala">// version 1.2.10
 
fun solve(states: List<String>) {
val dict = mutableMapOf<String, String>()
for (state in states) {
val key = state.toLowerCase().replace(" ", "")
if (dict[key] == null) dict.put(key, state)
}
val keys = dict.keys.toList()
val solutions = mutableListOf<String>()
val duplicates = mutableListOf<String>()
for (i in 0 until keys.size) {
for (j in i + 1 until keys.size) {
val len = keys[i].length + keys[j].length
val chars = (keys[i] + keys[j]).toCharArray()
chars.sort()
val combined = String(chars)
for (k in 0 until keys.size) {
for (l in k + 1 until keys.size) {
if (k == i || k == j || l == i || l == j) continue
val len2 = keys[k].length + keys[l].length
if (len2 != len) continue
val chars2 = (keys[k] + keys[l]).toCharArray()
chars2.sort()
val combined2 = String(chars2)
if (combined == combined2) {
val f1 = "${dict[keys[i]]} + ${dict[keys[j]]}"
val f2 = "${dict[keys[k]]} + ${dict[keys[l]]}"
val f3 = "$f1 = $f2"
if (f3 in duplicates) continue
solutions.add(f3)
val f4 = "$f2 = $f1"
duplicates.add(f4)
}
}
}
}
}
solutions.sort()
for ((i, sol) in solutions.withIndex()) {
println("%2d %s".format(i + 1, sol))
}
}
 
fun main(args: Array<String>) {
val states = listOf(
"Alabama", "Alaska", "Arizona", "Arkansas",
"California", "Colorado", "Connecticut",
"Delaware",
"Florida", "Georgia", "Hawaii",
"Idaho", "Illinois", "Indiana", "Iowa",
"Kansas", "Kentucky", "Louisiana",
"Maine", "Maryland", "Massachusetts", "Michigan",
"Minnesota", "Mississippi", "Missouri", "Montana",
"Nebraska", "Nevada", "New Hampshire", "New Jersey",
"New Mexico", "New York", "North Carolina", "North Dakota",
"Ohio", "Oklahoma", "Oregon",
"Pennsylvania", "Rhode Island",
"South Carolina", "South Dakota", "Tennessee", "Texas",
"Utah", "Vermont", "Virginia",
"Washington", "West Virginia", "Wisconsin", "Wyoming"
)
println("Real states only:")
solve(states)
println()
val fictitious = listOf(
"New Kory", "Wen Kory", "York New", "Kory New", "New Kory"
)
println("Real and fictitious states:")
solve(states + fictitious)
}</syntaxhighlight>
 
{{out}}
<pre>
Real states only:
1 North Carolina + South Dakota = North Dakota + South Carolina
 
Real and fictitious states:
1 New Kory + Kory New = Wen Kory + York New
2 New Kory + Wen Kory = York New + Kory New
3 New Kory + York New = Wen Kory + Kory New
4 New York + Kory New = New Kory + Wen Kory
5 New York + Kory New = New Kory + York New
6 New York + Kory New = Wen Kory + York New
7 New York + New Kory = Wen Kory + Kory New
8 New York + New Kory = Wen Kory + York New
9 New York + New Kory = York New + Kory New
10 New York + Wen Kory = New Kory + Kory New
11 New York + Wen Kory = New Kory + York New
12 New York + Wen Kory = York New + Kory New
13 New York + York New = New Kory + Kory New
14 New York + York New = New Kory + Wen Kory
15 New York + York New = Wen Kory + Kory New
16 North Carolina + South Dakota = North Dakota + South Carolina
</pre>
 
=={{header|LiveCode}}==
This is going to be O(N^2).
<langsyntaxhighlight lang="livecode">function pairwiseAnagrams X
if the optionkey is down then breakpoint
put the long seconds into T
Line 1,036 ⟶ 1,644:
replace comma with empty in X
return X
end itemsToChars</langsyntaxhighlight>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">letters[words_,n_] := Sort[Flatten[Characters /@ Take[words,n]]];
groupSameQ[g1_, g2_] := Sort /@ Partition[g1, 2] === Sort /@ Partition[g2, 2];
permutations[{a_, b_, c_, d_}] = Union[Permutations[{a, b, c, d}], SameTest -> groupSameQ];
Select[Flatten[permutations /@
 
Select[Flatten[
permutations /@
Subsets[Union[ToLowerCase/@{"Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "Florida",
"Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland",
Line 1,051 ⟶ 1,657:
"Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington",
"West Virginia", "Wisconsin", "Wyoming"}], {4}], 1],
letters[#, 2] === letters[#, -2] &]</langsyntaxhighlight>
 
=={{header|Nim}}==
<syntaxhighlight lang="nim">import algorithm, sequtils, strformat, strutils, tables
 
 
const
States = @["Alabama", "Alaska", "Arizona", "Arkansas",
"California", "Colorado", "Connecticut", "Delaware",
"Florida", "Georgia", "Hawaii", "Idaho", "Illinois",
"Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana",
"Maine", "Maryland", "Massachusetts", "Michigan",
"Minnesota", "Mississippi", "Missouri", "Montana",
"Nebraska", "Nevada", "New Hampshire", "New Jersey",
"New Mexico", "New York", "North Carolina", "North Dakota",
"Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island",
"South Carolina", "South Dakota", "Tennessee", "Texas",
"Utah", "Vermont", "Virginia",
"Washington", "West Virginia", "Wisconsin", "Wyoming"]
 
Fictitious = @["New Kory", "Wen Kory", "York New", "Kory New", "New Kory"]
 
type MatchingPairs = ((string, string), (string, string))
 
 
proc matchingPairs(states: openArray[string]): seq[MatchingPairs] =
## Build the list of matching pairs of states.
 
let states = sorted(states).deduplicate()
 
# Build a mapping from ordered sequence of chars to sequence of (state, state).
var mapping: Table[seq[char], seq[(string, string)]]
for i in 0..<states.high:
let s1 = states[i]
for j in (i + 1)..states.high:
let s2 = states[j]
mapping.mgetOrPut(sorted(map(s1 & s2, toLowerAscii)), @[]).add (s1, s2)
 
# Keep only the couples of pairs of states with no common state.
for pairs in mapping.values:
if pairs.len > 1:
# These pairs are candidates.
for i in 0..<pairs.high:
let pair1 = pairs[i]
for j in i..pairs.high:
let pair2 = pairs[j]
if pair1[0] != pair2[0] and pair1[0] != pair2[1] and
pair1[1] != pair2[0] and pair1[1] != pair2[1]:
# "pair1" and "pair2" have no common state.
result.add (pair1, pair2)
 
 
proc `$`(pairs: MatchingPairs): string =
## Return the string representation of two matching pairs.
"$1 & $2 = $3 & $4".format(pairs[0][0], pairs[0][1], pairs[1][0], pairs[1][1])
 
echo "For real states:"
for n, pairs in matchingPairs(States):
echo &"{n+1:2}: {pairs}"
echo()
echo "For real + fictitious states:"
for n, pairs in matchingPairs(States & Fictitious):
echo &"{n+1:2}: {pairs}"</syntaxhighlight>
 
{{out}}
<pre>For real states:
1: North Carolina & South Dakota = North Dakota & South Carolina
 
For real + fictitious states:
1: North Carolina & South Dakota = North Dakota & South Carolina
2: Kory New & New Kory = New York & Wen Kory
3: Kory New & New Kory = New York & York New
4: Kory New & New Kory = Wen Kory & York New
5: Kory New & New York = New Kory & Wen Kory
6: Kory New & New York = New Kory & York New
7: Kory New & New York = Wen Kory & York New
8: Kory New & Wen Kory = New Kory & New York
9: Kory New & Wen Kory = New Kory & York New
10: Kory New & Wen Kory = New York & York New
11: Kory New & York New = New Kory & New York
12: Kory New & York New = New Kory & Wen Kory
13: Kory New & York New = New York & Wen Kory
14: New Kory & New York = Wen Kory & York New
15: New Kory & Wen Kory = New York & York New
16: New Kory & York New = New York & Wen Kory</pre>
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">#!/usr/bin/perl
use warnings;
use strict;
Line 1,118 ⟶ 1,808:
 
say @states + @fictious, ' states:';
puzzle(@states, @fictious);</langsyntaxhighlight>
 
=={{header|Perl 6Phix}}==
<!--<syntaxhighlight lang="phix">(phixonline)-->
{{works with|niecza|2012-02-24}}
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<lang perl6>my @states = <
<span style="color: #008080;">constant</span> <span style="color: #000000;">states</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"Alabama"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Alaska"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Arizona"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Arkansas"</span><span style="color: #0000FF;">,</span>
Alabama Alaska Arizona Arkansas California Colorado Connecticut Delaware
<span style="color: #008000;">"California"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Colorado"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Connecticut"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Delaware"</span><span style="color: #0000FF;">,</span>
Florida Georgia Hawaii Idaho Illinois Indiana Iowa Kansas Kentucky
<span style="color: #008000;">"Florida"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Georgia"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Hawaii"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Idaho"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Illinois"</span><span style="color: #0000FF;">,</span>
Louisiana Maine Maryland Massachusetts Michigan Minnesota Mississippi
<span style="color: #008000;">"Indiana"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Iowa"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Kansas"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Kentucky"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Louisiana"</span><span style="color: #0000FF;">,</span>
Missouri Montana Nebraska Nevada New_Hampshire New_Jersey New_Mexico
<span style="color: #008000;">"Maine"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Maryland"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Massachusetts"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Michigan"</span><span style="color: #0000FF;">,</span>
New_York North_Carolina North_Dakota Ohio Oklahoma Oregon Pennsylvania
<span style="color: #008000;">"Minnesota"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Mississippi"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Missouri"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Montana"</span><span style="color: #0000FF;">,</span>
Rhode_Island South_Carolina South_Dakota Tennessee Texas Utah Vermont
<span style="color: #008000;">"Nebraska"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Nevada"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"New Hampshire"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"New Jersey"</span><span style="color: #0000FF;">,</span>
Virginia Washington West_Virginia Wisconsin Wyoming
<span style="color: #008000;">"New Mexico"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"New York"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"North Carolina"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"North Dakota"</span><span style="color: #0000FF;">,</span>
>;
<span style="color: #008000;">"Ohio"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Oklahoma"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Oregon"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Pennsylvania"</span><span style="color: #0000FF;">,</span>
 
<span style="color: #008000;">"Rhode Island"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"South Carolina"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"South Dakota"</span><span style="color: #0000FF;">,</span>
say "50 states:";
<span style="color: #008000;">"Tennessee"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Texas"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Utah"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Vermont"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Virginia"</span><span style="color: #0000FF;">,</span>
.say for anastates @states;
<span style="color: #008000;">"Washington"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"West Virginia"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Wisconsin"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Wyoming"</span><span style="color: #0000FF;">},</span>
<span style="color: #000080;font-style:italic;">-- extras = {"New Kory", "Wen Kory", "York New", "Kory New", "New Kory"}</span>
say "\n54 states:";
<span style="color: #000000;">extras</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"Slender Dragon"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Abalamara"</span><span style="color: #0000FF;">}</span>
.say for anastates @states, < New_Kory Wen_Kory York_New Kory_New New_Kory >;
 
<span style="color: #008080;">function</span> <span style="color: #000000;">no_dup</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
sub anastates (*@states) {
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sort</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
my @s = @states.uniq».subst('_', ' ');
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">to</span> <span style="color: #000000;">2</span> <span style="color: #008080;">by</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]=</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span>
my @pairs = gather for ^@s -> $i {
<span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[$]</span>
for $i ^..^ @s -> $j {
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
take [ @s[$i], @s[$j] ];
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
}
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
}
<span style="color: #008080;">return</span> <span style="color: #000000;">s</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
my $equivs = hash @pairs.classify: *.lc.comb.sort.join.trim;
 
<span style="color: #008080;">procedure</span> <span style="color: #000000;">play</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
gather for $equivs.values -> @c {
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">no_dup</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">))</span>
for ^@c -> $i {
<span style="color: #7060A8;">destroy_dict</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- empty dict</span>
for $i ^..^ @c -> $j {
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
my $set = set @c[$i].list, @c[$j].list;
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
take $set.join(', ') if $set == 4;
<span style="color: #004080;">string</span> <span style="color: #000000;">key</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">trim</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sort</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">lower</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]&</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">])))</span>
}
<span style="color: #004080;">object</span> <span style="color: #000000;">data</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">getd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">key</span><span style="color: #0000FF;">)</span>
}
<span style="color: #008080;">if</span> <span style="color: #000000;">data</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
}
<span style="color: #7060A8;">putd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">key</span><span style="color: #0000FF;">,{{</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span><span style="color: #000000;">j</span><span style="color: #0000FF;">}})</span>
}</lang>
<span style="color: #008080;">else</span>
 
<span style="color: #008080;">for</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">data</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
Output:
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">m</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">data</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]</span>
<pre>50 states:
<span style="color: #008080;">if</span> <span style="color: #000000;">m</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">i</span> <span style="color: #008080;">and</span> <span style="color: #000000;">m</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">j</span> <span style="color: #008080;">and</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">i</span> <span style="color: #008080;">and</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">j</span> <span style="color: #008080;">then</span>
North Carolina, South Dakota, North Dakota, South Carolina
<span style="color: #0000FF;">?{</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">],</span><span style="color: #008000;">"&lt;==&gt;"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">m</span><span style="color: #0000FF;">],</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">n</span><span style="color: #0000FF;">]}</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
54 states:
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
North Carolina, South Dakota, North Dakota, South Carolina
<span style="color: #7060A8;">putd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">key</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">data</span><span style="color: #0000FF;">),{</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span><span style="color: #000000;">j</span><span style="color: #0000FF;">}))</span>
New York, New Kory, Wen Kory, York New
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
New York, New Kory, Wen Kory, Kory New
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
New York, New Kory, York New, Kory New
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
New York, Wen Kory, New Kory, York New
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
New York, Wen Kory, New Kory, Kory New
<span style="color: #000000;">play</span><span style="color: #0000FF;">(</span><span style="color: #000000;">states</span><span style="color: #0000FF;">)</span>
New York, Wen Kory, York New, Kory New
<span style="color: #0000FF;">?</span><span style="color: #008000;">"==="</span>
New York, York New, New Kory, Wen Kory
<span style="color: #000000;">play</span><span style="color: #0000FF;">(</span><span style="color: #000000;">states</span><span style="color: #0000FF;">&</span><span style="color: #000000;">extras</span><span style="color: #0000FF;">)</span>
New York, York New, New Kory, Kory New
<!--</syntaxhighlight>-->
New York, York New, Wen Kory, Kory New
{{out}}
New York, Kory New, New Kory, Wen Kory
<pre>
New York, Kory New, New Kory, York New
{"North Dakota","South Carolina","<==>","North Carolina","South Dakota"}
New York, Kory New, Wen Kory, York New
"==="
New Kory, Wen Kory, York New, Kory New
{"Alabama","Arkansas","<==>","Abalamara","Kansas"}
New Kory, York New, Wen Kory, Kory New
{"North Dakota","South Carolina","<==>","North Carolina","South Dakota"}
New Kory, Kory New, Wen Kory, York New</pre>
{"Oregon","Rhode Island","<==>","Ohio","Slender Dragon"}
</pre>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(setq *States
(group
(mapcar '((Name) (cons (clip (sort (chop (lowc Name)))) Name))
Line 1,222 ⟶ 1,914:
(car Y) ) )
(cdr X) ) )
*States ) ) )</langsyntaxhighlight>
Output:
<pre>-> ((("North Carolina" . "South Dakota") ("North Dakota" . "South Carolina")))</pre>
Line 1,229 ⟶ 1,921:
 
Works with SWI-Prolog. Use of Goedel numbers.
<langsyntaxhighlight Prologlang="prolog">state_name_puzzle :-
L = ["Alabama", "Alaska", "Arizona", "Arkansas",
"California", "Colorado", "Connecticut",
Line 1,299 ⟶ 1,991:
GC1 is GC + 26 ** Ind,
compute_Goedel(T, GC1, GF).
</syntaxhighlight>
</lang>
Output :
<pre> ?- time(state_name_puzzle).
Line 1,321 ⟶ 2,013:
true .
</pre>
 
 
=={{header|Python}}==
{{trans|D}}
<langsyntaxhighlight lang="python">from collections import defaultdict
 
states = ["Alabama", "Alaska", "Arizona", "Arkansas",
Line 1,350 ⟶ 2,041:
for pairs in sorted(smap.itervalues()):
if len(pairs) > 1:
print " = ".join(pairs)</langsyntaxhighlight>
 
=={{header|Racket}}==
<langsyntaxhighlight lang="racket">
#lang racket
(define states
Line 1,384 ⟶ 2,075:
(cond [(hash-ref seen c (λ() (hash-set! seen c (list s1 s2)) #f))
=> (λ(states) (displayln (~v states (list s1 s2))))]))
</syntaxhighlight>
</lang>
Output:
<langsyntaxhighlight lang="racket">
'("north dakota" "south carolina") '("north carolina" "south dakota")
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
{{Works with|rakudo|2018.03}}
<syntaxhighlight lang="raku" line>my @states = <
Alabama Alaska Arizona Arkansas California Colorado Connecticut Delaware
Florida Georgia Hawaii Idaho Illinois Indiana Iowa Kansas Kentucky
Louisiana Maine Maryland Massachusetts Michigan Minnesota Mississippi
Missouri Montana Nebraska Nevada New_Hampshire New_Jersey New_Mexico
New_York North_Carolina North_Dakota Ohio Oklahoma Oregon Pennsylvania
Rhode_Island South_Carolina South_Dakota Tennessee Texas Utah Vermont
Virginia Washington West_Virginia Wisconsin Wyoming
>;
 
say "50 states:";
.say for anastates @states;
say "\n54 states:";
.say for sort anastates @states, < New_Kory Wen_Kory York_New Kory_New New_Kory >;
 
sub anastates (*@states) {
my @s = @states.unique».subst('_', ' ');
my @pairs = gather for ^@s -> $i {
for $i ^..^ @s -> $j {
take [ @s[$i], @s[$j] ];
}
}
my $equivs = hash @pairs.classify: *.lc.comb.sort.join;
 
gather for $equivs.values -> @c {
for ^@c -> $i {
for $i ^..^ @c -> $j {
my $set = set @c[$i].list, @c[$j].list;
take @c[$i].list.join(', ') ~ ' = ' ~ @c[$j].list.join(', ') if $set == 4;
}
}
}
}</syntaxhighlight>
 
Output:
<pre>50 states:
North Carolina, South Dakota = North Dakota, South Carolina
 
54 states:
New Kory, Kory New = Wen Kory, York New
New Kory, Wen Kory = York New, Kory New
New Kory, York New = Wen Kory, Kory New
New York, Kory New = New Kory, Wen Kory
New York, Kory New = New Kory, York New
New York, Kory New = Wen Kory, York New
New York, New Kory = Wen Kory, Kory New
New York, New Kory = Wen Kory, York New
New York, New Kory = York New, Kory New
New York, Wen Kory = New Kory, Kory New
New York, Wen Kory = New Kory, York New
New York, Wen Kory = York New, Kory New
New York, York New = New Kory, Kory New
New York, York New = New Kory, Wen Kory
New York, York New = Wen Kory, Kory New
North Carolina, South Dakota = North Dakota, South Carolina</pre>
 
=={{header|REXX}}==
Code was added to the REXX program to remove dead-end words (state names) that can't possibly be part of
<br>a solution, in particular, words that contain a unique letter (among all the state names).
<langsyntaxhighlight lang="rexx">/*REXX pgmprogram (state name puzzle) rearranges two state's names ──► two new states. */
!='Alabama, Alaska, Arizona, Arkansas, California, Colorado, Connecticut, Delaware, Florida, Georgia,',
'Hawaii, Idaho, Illinois, Indiana, Iowa, Kansas, Kentucky, Louisiana, Maine, Maryland, Massachusetts, ',
Line 1,399 ⟶ 2,152:
'New York, North Carolina, North Dakota, Ohio, Oklahoma, Oregon, Pennsylvania, Rhode Island, South Carolina,',
'South Dakota, Tennessee, Texas, Utah, Vermont, Virginia, Washington, West Virginia, Wisconsin, Wyoming'
parse arg xtra; !=! ',' xtra /*add optional (fictitious) names.*/
 
@abcU= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; !=space(!) /*!: the state list, no extra blanks*/
parse arg xtra; !=! ',' xtra /*add optional (fictitious) names.*/
@abcUdeads='ABCDEFGHIJKLMNOPQRSTUVWXYZ'0; dups=0; L.=0; !orig=space(!); @@.= /*ABCs;initialize some theREXX state listvariables. */
z=0 /* [↑] elide dend─end (DE) states.*/
deads=0; dups=0; L.=0; !orig=!; z=0; @@.= /*initialize some vars. */
do de=0 for 2; !=!orig /*use original state list for each. */
 
@.=
do de=0 for 2; !=!orig; @.= /*use original state list for each. */
do states=0 by 0 until !=='' /*parse until the cows come home. */
 
do states=0 until parse var !== x ',' !; x=space(x) /*parseremove untilall theblanks cowsfrom comestate homename. */
parse var ! x if @.x\==',' !; then do x=space(x) /*removewas allstate blankswas fromalready specified? state name.*/
if @.x\=='' then do if de then iterate /*wasdon't statetell waserror alreadyif specified?doing 2nd pass*/
if de then iterate dups=dups + 1 /*don'tbump the duplicate counter. tell error if doing 2nd pass*/
dups=dups+1 say 'ignoring the 2nd naming /*bumpof the duplicatestate: ' counter. x; */iterate
say 'ignoring the 2nd naming of the state: ' xend
@.x=x iterate /*indicate this state name exists. */
y=space(x,0); upper y; yLen=length(y) /*get upper name endwith no spaces; Len*/
@.x=x if de then do /*indicateIs thisthe statefirstt namepass? exists. Then process.*/
do j=1 for yLen /*see if it's a dead─end state name.*/
y=space(x,0); upper y; yLen=length(y) /*get upper name with no spaces; Len*/
_=substr(y, j, 1) /* _: is some state name character.*/
 
if de then do if L._ \== 1 then iterate /*IsCount the¬ 1st pass1? Then process.state name is OK.*/
do j=1 for yLen say 'removing dead─end state /*see[which ifhas the letter it's a dead─end state_"]: " name.*/x
_ deads=substr(y,j,deads + 1) /* _: is/*bump somenumber stateof namedead─ends characterstates. */
if L._\==1 then iterate states /*Countgo ¬1?and process Thenanother state name is O.K.*/
say 'removing dead─end state [which has theend letter ' _"]: " x/*j*/
deads z=deadsz+1 /*bump numbercounter of dead─endsthe state statesnames. */
iterate states #.z=y; ##.z=x /*go and process another /*assign state name; also original.*/
end /*j*/end
zelse do k=z+1 for yLen /*bumpinventorize counterletters of the state namesname. */
#.z=y; ##.z=x _=substr(y,k,1); L._=L._ + 1 /*count each letter /*assignin state name;. and original. */
end /*k*/
end /*states*/ else do k=1 for yLen /*inventorizethe stateindex name'sSTATES letters.isn't incremented*/
end /*de*/
_=substr(y,k,1); L._=L._+1 /*count each letter in state name. */
call list end /*klist state names in order given. */
say z 'state name's(z) "are useable."
 
if dups \==0 then say dups 'duplicate of a state's(dups) 'ignored.'
end /*states*/
if deads\==0 then say deads 'dead─end state's(deads) 'deleted.'
end /*de*/
sols=0 /*number of solutions found (so far)*/
 
say; do i=1 for z /*list[↑] state nameslook infor ordermix given.and match states*/
do j=1 for z /* ◄──────────────────────────────────────────────────────────┐ */
say right(i,9) ##.i /*show the index number, state name.*/
do k=j+1 to z end /*i ◄─── state K, state J ►─────┘ */
if #.j<<#.k then JK=#.j || #.k /*is the state in the proper order? */
 
say; else JK=#.k || say#.j z 'state name's(z) "are/*No, useable then use the new state name." */
do m=1 for z; if m==j | m==k then iterate /*no state overlaps are allowed. */
if dups \==0 then say dups 'duplicate of a state's(dups) 'ignored.'
if verify(#.m, jk) \== 0 then iterate /*is this state name even possible? */
if deads\==0 then say deads 'dead─end state's(deads) 'deleted.'
nJK=elider(JK, #.m) /*a new JK, after eliding #.m chars.*/
say
sols=0 do n=m+1 to z; if n==j | n==k then iterate /*numberno ofoverlaps solutionsare foundallowed. (so far)*/
if verify(#.n, nJK) \== 0 then iterate /*is it possible? */
 
if elider(nJK, #.n) \== '' then iterate /*any leftovers letters? */
do j=1 for z /*◄─────────────────────────────────────────────────────┐ */
if #.m<<#.n then MN=#.m || #.n /*lookis forit mix and match states.in the proper order?*/
do k=j+1 to z else MN=#.n || #.m /* ◄─── state K, state J ►───────┘ /*we found a new state name.*/
if #.j<<#.k then if @@.JK.MN\=#.j='' || #@@.kMN.JK\=="" then iterate /*was it done before? /*is in proper order?*/
say 'found: ' ##.j',' else JK= ##.k || #.j " ───► " ##.m',' /*use new state name ##.*/n
@@.JK.MN=1 /*indicate this solution as being found*/
 
do m sols=sols+1 for z; if m==j | m==k then iterate /*nobump the number of solutions found. overlaps allowed*/
if verify(#.m,jk)\==0 then iterate /*is this possible? */
nJK=elider(JK,#.m) /*new JK, after eliding #.m characters.*/
 
do n=m+1 to z; if n==j | n==k then iterate /*no overlaps allowed*/
if verify(#.n,nJK)\==0 then iterate /*is it possible? */
if elider(nJK,#.n)\=='' then iterate /*leftovers letters? */
if #.m<<#.n then MN=#.m || #.n /*is in proper order?*/
else MN=#.n || #.m /*a new state name. */
if @@.JK.MN\=='' | @@.MN.JK\=='' then iterate /*was it done before?*/
say 'found: ' ##.j',' ##.k " ───► " ##.m',' ##.n
@@.JK.MN=1 /*indicate this solution as being found*/
sols=sols+1 /*bump the number of solutions found. */
end /*n*/
end /*m*/
end /*k*/
end /*j*/
say /*show a blank line for easier reading.*/
if sols==0 then sols= 'No' /*use mucher gooder (sic) Englishings. */
say sols 'solution's(sols) "found." /*display the number of solutions found*/
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
/*───────────────────────────────────ELIDER───────────────────────────────────*/
elider: parse arg hay,pins /*remove letters (pins) from haystack. */
do e=1 for length(pins); p=pos( substr( pins, e, 1), hay)
 
do e if p==10 then iterate for length(pins); p hay=posoverlay(substr(pins,e,1)' ', hay, p)
if p==0 then iterate end ; /*e*/ hay=overlay(' ',hay,p) /* [↑] remove a letter from haystack. */
return space(hay, 0) end /*e*/ /*remove blanks from the haystack. /* [↑] remove a letter.*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
return space(hay,0) /*remove blanks from hay*/
list: say; do i=1 for z; say right(i, 9) ##.i; end; say; return
/*──────────────────────────────────S subroutine──────────────────────────────*/
s: if arg(1)==1 then return arg(3); return word(arg(2) 's', 1) /*pluralizer.*/</langsyntaxhighlight>
'''{{out|output'''|text=&nbsp; when using the default input:}}
<pre style="height:60ex">
removing dead─end state [which has the letter Z]: Arizona
Line 1,627 ⟶ 2,368:
=={{header|Ruby}}==
{{trans|Tcl}}
<langsyntaxhighlight lang="ruby">require 'set'
 
# 26 prime numbers
Line 1,671 ⟶ 2,412:
puts ""
puts "with fictional states"
print_answer(States + ["New Kory", "Wen Kory", "York New", "Kory New", "New Kory"])</langsyntaxhighlight>
 
outputs
Line 1,694 ⟶ 2,435:
15 New Kory, Kory New Wen Kory, York New
16 North Carolina, South Dakota North Dakota, South Carolina</pre>
 
=={{header|Scala}}==
<langsyntaxhighlight Scalalang="scala">object StateNamePuzzle extends App {
// Logic:
def disjointPairs(pairs: Seq[Set[String]]) =
Line 1,720 ⟶ 2,462:
 
println(anagramPairs(states).map(_.map(_ mkString " + ") mkString " = ") mkString "\n")
}</langsyntaxhighlight>
{{out}}
<pre>New Kory + Wen Kory = York New + Kory New
Line 1,740 ⟶ 2,482:
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
# Gödel number generator
proc goedel s {
Line 1,806 ⟶ 2,548:
"New Kory" "Wen Kory" "York New" "Kory New" "New Kory"
}
printPairs "Real and False States" [groupStates [concat $realStates $falseStates]]</langsyntaxhighlight>
Output:
<pre>
Line 1,860 ⟶ 2,602:
North Carolina, South Dakota
North Dakota, South Carolina
</pre>
 
=={{header|Wren}}==
{{trans|Kotlin}}
{{libheader|Wren-str}}
{{libheader|Wren-sort}}
{{libheader|Wren-fmt}}
<syntaxhighlight lang="wren">import "./str" for Str
import "./sort" for Sort
import "./fmt" for Fmt
 
var solve = Fn.new { |states|
var dict = {}
for (state in states) {
var key = Str.lower(state).replace(" ", "")
if (!dict[key]) dict[key] = state
}
var keys = dict.keys.toList
Sort.quick(keys)
var solutions = []
var duplicates = []
for (i in 0...keys.count) {
for (j in i+1...keys.count) {
var len = keys[i].count + keys[j].count
var chars = (keys[i] + keys[j]).toList
Sort.quick(chars)
var combined = chars.join()
for (k in 0...keys.count) {
for (l in k+1...keys.count) {
if (k != i && k != j && l != i && l != j) {
var len2 = keys[k].count + keys[l].count
if (len2 == len) {
var chars2 = (keys[k] + keys[l]).toList
Sort.quick(chars2)
var combined2 = chars2.join()
if (combined == combined2) {
var f1 = "%(dict[keys[i]]) + %(dict[keys[j]])"
var f2 = "%(dict[keys[k]]) + %(dict[keys[l]])"
var f3 = "%(f1) = %(f2)"
if (!duplicates.contains(f3)) {
solutions.add(f3)
var f4 = "%(f2) = %(f1)"
duplicates.add(f4)
}
}
}
}
}
}
}
}
Sort.quick(solutions)
var i = 0
for (sol in solutions) {
Fmt.print("$2d $s", i + 1, sol)
i = i + 1
}
}
 
var states = [
"Alabama", "Alaska", "Arizona", "Arkansas",
"California", "Colorado", "Connecticut",
"Delaware",
"Florida", "Georgia", "Hawaii",
"Idaho", "Illinois", "Indiana", "Iowa",
"Kansas", "Kentucky", "Louisiana",
"Maine", "Maryland", "Massachusetts", "Michigan",
"Minnesota", "Mississippi", "Missouri", "Montana",
"Nebraska", "Nevada", "New Hampshire", "New Jersey",
"New Mexico", "New York", "North Carolina", "North Dakota",
"Ohio", "Oklahoma", "Oregon",
"Pennsylvania", "Rhode Island",
"South Carolina", "South Dakota", "Tennessee", "Texas",
"Utah", "Vermont", "Virginia",
"Washington", "West Virginia", "Wisconsin", "Wyoming"
]
System.print("Real states only:")
solve.call(states)
System.print()
var fictitious = [ "New Kory", "Wen Kory", "York New", "Kory New", "New Kory" ]
System.print("Real and fictitious states:")
solve.call(states + fictitious)</syntaxhighlight>
 
{{out}}
<pre>
Real states only:
1 North Carolina + South Dakota = North Dakota + South Carolina
 
Real and fictitious states:
1 Kory New + New Kory = New York + Wen Kory
2 Kory New + New Kory = New York + York New
3 Kory New + New Kory = Wen Kory + York New
4 Kory New + New York = New Kory + Wen Kory
5 Kory New + New York = New Kory + York New
6 Kory New + New York = Wen Kory + York New
7 Kory New + Wen Kory = New Kory + New York
8 Kory New + Wen Kory = New Kory + York New
9 Kory New + Wen Kory = New York + York New
10 Kory New + York New = New Kory + New York
11 Kory New + York New = New Kory + Wen Kory
12 Kory New + York New = New York + Wen Kory
13 New Kory + New York = Wen Kory + York New
14 New Kory + Wen Kory = New York + York New
15 New Kory + York New = New York + Wen Kory
16 North Carolina + South Dakota = North Dakota + South Carolina
</pre>
 
=={{header|zkl}}==
{{trans|Python}}
<syntaxhighlight lang="zkl">#<<< // here doc
<lang zkl>states := T("Alabama", "Alaska", "Arizona", "Arkansas",
states:=("Alabama, Alaska, Arizona, Arkansas,
"California", "Colorado", "Connecticut", "Delaware", "Florida",
California, Colorado, Connecticut, Delaware, Florida,
"Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas",
Georgia, Hawaii, Idaho, Illinois, Indiana, Iowa, Kansas,
"Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts",
Kentucky, Louisiana, Maine, Maryland, Massachusetts,
"Michigan", "Minnesota", "Mississippi", "Missouri", "Montana",
Michigan, Minnesota, Mississippi, Missouri, Montana,
"Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico",
Nebraska, Nevada, New Hampshire, New Jersey, New Mexico,
"New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma",
New York, North Carolina, North Dakota, Ohio, Oklahoma,
"Oregon", "Pennsylvania", "Rhode Island", "South Carolina",
Oregon, Pennsylvania, Rhode Island, South Carolina,
"South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia",
South Dakota, Tennessee, Texas, Utah, Vermont, Virginia,
"Washington", "West Virginia", "Wisconsin", "Wyoming",
Washington, West Virginia, Wisconsin, Wyoming"
# Uncomment the next line for the fake states.
/* Uncomment the next line for the fake states. */
# "New Kory", "Wen Kory", "York New", "Kory New", "New Kory"
# ",New Kory, Wen Kory, York New, Kory New, New Kory"
);
#<<<
).split(",").apply("strip");
smap := D();
 
smap:=Dictionary();
Utils.Helpers.pickNFrom(2,states).apply2('wrap(ss){ // 1225 combinations
key:=(ss.concat()).toLower().sort()-" ";
Line 1,886 ⟶ 2,735:
foreach pairs in (smap.values){ // 1224 keys
// pairs=Utils.Helpers.listUnique(pairs); // eliminate dups
if (pairs.len() > 1)
println(pairs.concat(" = ")) }</langsyntaxhighlight>
{{out}}
<pre>
9,482

edits