State name puzzle: Difference between revisions

m
m (→‎{{header|REXX}}: added/changed comments and whitespace, added a subroutine..)
m (→‎{{header|Wren}}: Minor tidy)
 
(21 intermediate revisions by 13 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.
<langsyntaxhighlight lang="cpp">#include <algorithm>
#include <iostream>
#include <string>
Line 363 ⟶ 513:
start = next;
}
}</langsyntaxhighlight>
 
=={{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 393 ⟶ 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 474 ⟶ 777:
}
}
}</langsyntaxhighlight>
Output:
<pre>
Line 499 ⟶ 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 =
pairs [] = []
concatMap
pairs (y:ys) = map (y,) ys ++ pairs ys
((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)
 
puzzlepairs :: [Stringa] -> [((String,String), (Stringa, String)a)]
puzzlepairs states[] = []
pairs (y : ys) = map (y,) ys <> pairs ys
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 605 ⟶ 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 657 ⟶ 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 679 ⟶ 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 739 ⟶ 1,059:
every z *:= xlate[!s]
return z
end</langsyntaxhighlight>
 
{{libheader|Icon Programming Library}}
Line 788 ⟶ 1,108:
Implementation:
 
<langsyntaxhighlight lang="j">require'strings stats'
 
states=:<;._2]0 :0-.LF
Line 808 ⟶ 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 921 ⟶ 1,241:
├──────────────┼──────────────┤
│North Dakota │South Carolina│
└──────────────┴──────────────┘</langsyntaxhighlight>
 
=={{header|Java}}==
{{works with|Java|8}}
<langsyntaxhighlight lang="java">import java.util.*;
import java.util.stream.*;
 
Line 982 ⟶ 1,302:
});
}
}</langsyntaxhighlight>
 
Output:
Line 1,005 ⟶ 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 1,044 ⟶ 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 1,066 ⟶ 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 1,088 ⟶ 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,136 ⟶ 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,151 ⟶ 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,218 ⟶ 1,808:
 
say @states + @fictious, ' states:';
puzzle(@states, @fictious);</langsyntaxhighlight>
 
=={{header|Perl 6}}==
{{Works with|rakudo|2016.09}}
<lang perl6>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 anastates @states, < New_Kory Wen_Kory York_New Kory_New New_Kory >;
 
sub anastates (*@states) {
my @s = @states.uniq».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 $set.keys.join(', ') if $set == 4;
}
}
}
}</lang>
 
Output:
<pre>50 states:
North Carolina, North Dakota, South Carolina, South Dakota
 
54 states:
New Kory, New York, York New, Wen Kory
New Kory, New York, Wen Kory, Kory New
New Kory, New York, York New, Kory New
New Kory, New York, York New, Wen Kory
New Kory, New York, Wen Kory, Kory New
New York, York New, Wen Kory, Kory New
New Kory, New York, York New, Wen Kory
New Kory, New York, York New, Kory New
New York, York New, Wen Kory, Kory New
New Kory, New York, Wen Kory, Kory New
New Kory, New York, York New, Kory New
New York, York New, Wen Kory, Kory New
New Kory, York New, Wen Kory, Kory New
New Kory, York New, Wen Kory, Kory New
New Kory, York New, Wen Kory, Kory New
North Carolina, South Dakota, North Dakota, South Carolina</pre>
 
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>constant states = {"Alabama", "Alaska", "Arizona", "Arkansas",
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
"California", "Colorado", "Connecticut", "Delaware",
<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>
"Florida", "Georgia", "Hawaii", "Idaho", "Illinois",
<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>
"Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana",
<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>
"Maine", "Maryland", "Massachusetts", "Michigan",
<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>
"Minnesota", "Mississippi", "Missouri", "Montana",
<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>
"Nebraska", "Nevada", "New Hampshire", "New Jersey",
<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>
"New Mexico", "New York", "North Carolina", "North Dakota",
<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>
"Ohio", "Oklahoma", "Oregon", "Pennsylvania",
<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>
"Rhode Island", "South Carolina", "South Dakota",
<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>
"Tennessee", "Texas", "Utah", "Vermont", "Virginia",
<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>
"Washington", "West Virginia", "Wisconsin", "Wyoming"},
<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>
-- extras = {"New Kory", "Wen Kory", "York New", "Kory New", "New Kory"}
<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>
extras = {"Slender Dragon", "Abalamara"}
<span style="color: #000080;font-style:italic;">-- extras = {"New Kory", "Wen Kory", "York New", "Kory New", "New Kory"}</span>
 
<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>
function no_dup(sequence s)
s = sort(s)
<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>
for i=length(s) to 2 by -1 do
<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>
if s[i]=s[i-1] then
<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>
s[i] = s[$]
<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>
s = s[1..$-1]
<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>
end if
<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>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
return s
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end function
<span style="color: #008080;">return</span> <span style="color: #000000;">s</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
procedure play(sequence s)
s = no_dup(s)
<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>
destroy_dict(1) -- empty dict
<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 i=1 to length(s)-1 do
<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 j=i+1 to length(s) do
<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>
string key = trim(sort(lower(s[i]&s[j])))
<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>
object data = getd(key)
<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>
if data=0 then
<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>
putd(key,{{i,j}})
<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>
else
<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>
for k=1 to length(data) do
<span integer {m,n} style="color: data[k]#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>
if m!=i and m!=j and n!=i and n!=j then
<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>
?{s[i],s[j],"<==>",s[m],s[n]}
<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>
end if
<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>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
putd(key,append(data,{i,j}))
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end if
<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>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end procedure
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
play(states)
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
?"==="
<span style="color: #000000;">play</span><span style="color: #0000FF;">(</span><span style="color: #000000;">states</span><span style="color: #0000FF;">)</span>
play(states&extras)</lang>
<span style="color: #0000FF;">?</span><span style="color: #008000;">"==="</span>
<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>
<!--</syntaxhighlight>-->
{{out}}
<pre>
Line 1,342 ⟶ 1,874:
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(setq *States
(group
(mapcar '((Name) (cons (clip (sort (chop (lowc Name)))) Name))
Line 1,382 ⟶ 1,914:
(car Y) ) )
(cdr X) ) )
*States ) ) )</langsyntaxhighlight>
Output:
<pre>-> ((("North Carolina" . "South Dakota") ("North Dakota" . "South Carolina")))</pre>
Line 1,389 ⟶ 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,459 ⟶ 1,991:
GC1 is GC + 26 ** Ind,
compute_Goedel(T, GC1, GF).
</syntaxhighlight>
</lang>
Output :
<pre> ?- time(state_name_puzzle).
Line 1,481 ⟶ 2,013:
true .
</pre>
 
 
=={{header|Python}}==
{{trans|D}}
<langsyntaxhighlight lang="python">from collections import defaultdict
 
states = ["Alabama", "Alaska", "Arizona", "Arkansas",
Line 1,510 ⟶ 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,544 ⟶ 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 program (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,628 ⟶ 2,221:
/*──────────────────────────────────────────────────────────────────────────────────────*/
list: say; do i=1 for z; say right(i, 9) ##.i; end; say; return
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">
Line 1,775 ⟶ 2,368:
=={{header|Ruby}}==
{{trans|Tcl}}
<langsyntaxhighlight lang="ruby">require 'set'
 
# 26 prime numbers
Line 1,819 ⟶ 2,412:
puts ""
puts "with fictional states"
print_answer(States + ["New Kory", "Wen Kory", "York New", "Kory New", "New Kory"])</langsyntaxhighlight>
 
outputs
Line 1,842 ⟶ 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,868 ⟶ 2,462:
 
println(anagramPairs(states).map(_.map(_ mkString " + ") mkString " = ") mkString "\n")
}</langsyntaxhighlight>
{{out}}
<pre>New Kory + Wen Kory = York New + Kory New
Line 1,888 ⟶ 2,482:
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
# Gödel number generator
proc goedel s {
Line 1,954 ⟶ 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 2,008 ⟶ 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}}
<langsyntaxhighlight lang="zkl">#<<< // here doc
states:=("Alabama, Alaska, Arizona, Arkansas,
California, Colorado, Connecticut, Delaware, Florida,
Line 2,037 ⟶ 2,736:
// pairs=Utils.Helpers.listUnique(pairs); // eliminate dups
if(pairs.len()>1)
println(pairs.concat(" = ")) }</langsyntaxhighlight>
{{out}}
<pre>
9,485

edits