--- id: 5a23c84252665b21eecc8024 title: Puzzle sui nomi degli Stati challengeType: 5 forumTopicId: 302323 dashedName: state-name-puzzle --- # --description-- Questo compito è ispirato dalla colonna DDJ di Mark Nelson "Wordplay" e una delle sfide del puzzle settimanale da Will Shortz sulla NPR Weekend Edition [\[1\]](https://www.npr.org/templates/story/story.php?storyId=9264290) e originariamente attribuito a David Edelheit. La sfida è di prendere i nomi di due stati dell'USA, mischiarli, poi riarrangiare le lettere per formare i nomi di due *diversi* stati dell'USA (così da avere 4 nomi di stati diversi). Quali sono questi Stati? Il problema è stato ristampato su [Unicon Discussion Web](https://tapestry.tucson.az.us/twiki/bin/view/Main/StateNamesPuzzle) che include diverse soluzioni con analisi. Diverse tecniche possono essere utili e potresti voler fare riferimento a [ Gödel numbering](https://en.wikipedia.org/wiki/Goedel_numbering), [relazioni di equivalenza](https://en.wikipedia.org/wiki/Equivalence_relation), e [classi di equivalenza](https://en.wikipedia.org/wiki/Equivalence_classes). I meriti fondamentali di questi sono stati discussi nell'Unicon Discussion Web. È stata presentata anche una seconda sfida sotto forma di una serie di nuovi Stati fittizi. # --instructions-- Scrivere una funzione per risolvere la sfida per la gamma data di nomi di Stati. La funzione dovrebbe restituire un array. Ogni elemento deve essere un oggetto in questa forma: `{"from":[],"to":[]}`. L'array "from" dovrebbe contenere i nomi originali e l'array "to" dovrebbe contenere i nomi risultanti. # --hints-- `solve` dovrebbe essere una funzione. ```js assert(typeof solve == 'function'); ``` `solve(["New Mexico", "New York", "North Carolina ", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota"])` dovrebbe restituire un array. ```js assert( Array.isArray( solve([ 'New Mexico', 'New York', 'North Carolina ', 'North Dakota', 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island', 'South Carolina', 'South Dakota' ]) ) ); ``` `solve(["New Mexico", "New York", "North Carolina ", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota"])` dovrebbe restituire `[{ from: ["North Carolina ", "South Dakota"], to: ["North Dakota", "South Carolina"] }]`. ```js assert.deepEqual( solve([ 'New Mexico', 'New York', 'North Carolina ', 'North Dakota', 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island', 'South Carolina', 'South Dakota' ]), [ { from: ['North Carolina ', 'South Dakota'], to: ['North Dakota', 'South Carolina'] } ] ); ``` `solve(["New York", "New Kory", "Wen Kory", "York New", "Kory New", "New Kory"])` dovrebbe restituire `[{ from: ["New Kory", "New York"], to: ["Wen Kory", "York New"] }, { from: ["New Kory", "New York"], to: ["Kory New", "Wen Kory"] }, { from: ["New Kory", "New York"], to: ["Kory New", "York New"] }, { from: ["New York", "Wen Kory"], to: ["New Kory", "York New"] }, { from: ["New York", "Wen Kory"], to: ["Kory New", "New Kory"] }, { from: ["New York", "Wen Kory"], to: ["Kory New", "York New"] }, { from: ["New York", "York New"], to: ["New Kory", "Wen Kory"] }, { from: ["New York", "York New"], to: ["Kory New", "New Kory"] }, { from: ["New York", "York New"], to: ["Kory New", "Wen Kory"] }, { from: ["Kory New", "New York"], to: ["New Kory", "Wen Kory"] }, { from: ["Kory New", "New York"], to: ["New Kory", "York New"] }, { from: ["Kory New", "New York"], to: ["Wen Kory", "York New"] }, { from: ["New Kory", "Wen Kory"], to: ["Kory New", "York New"] }, { from: ["New Kory", "York New"], to: ["Kory New", "Wen Kory"] }, { from: ["Kory New", "New Kory"], to: ["Wen Kory", "York New"] }]`. ```js assert.deepEqual( solve([ 'New York', 'New Kory', 'Wen Kory', 'York New', 'Kory New', 'New Kory' ]), [ { from: ['New Kory', 'New York'], to: ['Wen Kory', 'York New'] }, { from: ['New Kory', 'New York'], to: ['Kory New', 'Wen Kory'] }, { from: ['New Kory', 'New York'], to: ['Kory New', 'York New'] }, { from: ['New York', 'Wen Kory'], to: ['New Kory', 'York New'] }, { from: ['New York', 'Wen Kory'], to: ['Kory New', 'New Kory'] }, { from: ['New York', 'Wen Kory'], to: ['Kory New', 'York New'] }, { from: ['New York', 'York New'], to: ['New Kory', 'Wen Kory'] }, { from: ['New York', 'York New'], to: ['Kory New', 'New Kory'] }, { from: ['New York', 'York New'], to: ['Kory New', 'Wen Kory'] }, { from: ['Kory New', 'New York'], to: ['New Kory', 'Wen Kory'] }, { from: ['Kory New', 'New York'], to: ['New Kory', 'York New'] }, { from: ['Kory New', 'New York'], to: ['Wen Kory', 'York New'] }, { from: ['New Kory', 'Wen Kory'], to: ['Kory New', 'York New'] }, { from: ['New Kory', 'York New'], to: ['Kory New', 'Wen Kory'] }, { from: ['Kory New', 'New Kory'], to: ['Wen Kory', 'York New'] } ] ); ``` # --seed-- ## --seed-contents-- ```js function solve(input) { } ``` # --solutions-- ```js function solve(input) { var orig = {}; input.forEach(function(e) { orig[__helpers.removeWhiteSpace(e).toLowerCase()] = e; }); input = Object.keys(orig); var map = {}; for (var i = 0; i < input.length - 1; i++) { var pair0 = input[i]; for (var j = i + 1; j < input.length; j++) { var pair = [pair0, input[j]]; var s = pair0 + pair[1]; var key = s.split('').sort(); var val = map[key] ? map[key] : []; val.push(pair); map[key] = val; } } var result = []; Object.keys(map).forEach(key => { for (var i = 0; i < map[key].length - 1; i++) { var a = map[key][i]; for (var j = i + 1; j < map[key].length; j++) { var b = map[key][j]; if (new Set([a[0], b[0], a[1], b[1]]).size < 4) continue; var from = [orig[a[0]], orig[a[1]]].sort(); var to = [orig[b[0]], orig[b[1]]].sort(); result.push({ from, to }); } } }); return result; } ```