2009-07-20 5 views
6

Für ein Spiel, wo man Anagramme aus einer Reihe loser Buchstaben finden musste, implementierte ich einen Permutationsalgorithmus, um alle möglichen Anagramme zu finden und diese bei bekannten Buchstabenpositionen zu filtern (-match ist übrigens toll). Aber für längere Wörter erwies sich dies als sehr fehleranfällig, da das Überfliegen einer großen Liste von Kauderwelsch nicht wirklich die richtigen Worte enthüllt, die darin verborgen waren. SoPowershell, Art der Schnittmenge integriert?

Ich dachte, dass wenn ich eine große Liste von englischen Wörtern haben würde (sollte irgendwo erhältlich sein) Ich konnte nur meine Liste von Permutationen mit der Liste der richtigen Worte schneiden und bekommen (hoffentlich) alle wirklichen Worte aus der Permutationsliste.

Da viele Betreiber in PS arbeiten anders mit Sammlungen dachte ich, ich könnte etwas nur tun, wie

$wordlist -contains $permlist 

und die Kreuzung zurück. Leider ist es nicht so einfach. Andere Optionen, die ich gedacht, der wäre über eine Liste zu durchlaufen und machen einen -contains für jedes Element:

$permlist | ? { $wordlist -contains $_ } 

Dies ist wahrscheinlich funktionieren würde, ist aber auch sehr langsam, ich denke, (vor allem, wenn $wordlist ist das Ergebnis einer gc wordlist.txt). Oder ich könnte einen gigantischen regulären Ausdruck erstellen:

Aber das wäre wahrscheinlich auch nicht sehr schnell. Ich könnte vielleicht auch findstr mit oben genannten gigantischen Regex verwenden, aber das fühlt sich einfach falsch an.

Gibt es eingebaute Lösungen, die ich verwenden könnte und die besser sind als meine bisherigen Versuche? Sonst würde ich die Wortliste wahrscheinlich in eine Hashtabelle einfügen und den iterativen -contains Ansatz verwenden, der dann schnell genug sein sollte.

Antwort

6
$left = New-HashSet string 
$left.Add("foo") 
$left.Add("bar") 
$right = New-HashSet string 
$right.Add("bar") 
$right.Add("baz") 

$left.IntersectWith($right) 
$left.UnionWith($right) 

(borgen New-HashSet von Josh Einstein)

Achtung: diese Methoden auf HashSet an Ort und Stelle sind Algorithmen, die die ursprüngliche Sammlung ändern.Wenn Sie funktionalen Stil auf unveränderliche Objekte umwandeln möchten, müssen Sie LINQ an die Partei bringen:

add-type system.core 

$asqueryable = [system.linq.queryable].getmethods() | ? { $_.name -eq "AsQueryable" } | select -first 1 
$asqueryable = $asqueryable.MakeGenericMethod([string]) 
$leftAsQueryable = $asqueryable.Invoke($null, (,$left)) 

$intersect = [system.linq.queryable].getmethods() | ? { $_.name -eq "Intersect" } | select -first 1 
$intersect = $intersect.MakeGenericMethod([string]) 
$result = $intersect.Invoke($null, ($leftAsQueryable, $right)) 

Offensichtlich jemand diese statische-generic-Reflexion Mist in einem freundlichen Cmdlets wickeln muss! Mach dir keine Sorgen, ich arbeite daran ...

+0

Ok, das wäre über meinen Ansatz gewesen. Definitiv nicht hübsch. (Und definitiv nicht gut geeignet für den unverpackten Gebrauch von der cmdline selbst). – Joey

0

Sie können Ihre Wortliste auf Rechtschreibung prüfen und alle Rechtschreibfehler anhand eines Standardwörterbuchs beseitigen.

Mit dem GNU aspell Paket installiert,

cat text.txt | aspell list 

wird Ihnen eine Liste aller vermissen-buchstabierten Worte.
Sie können mit anderen Wörterbüchern mit aspell arbeiten.


Oder nehmen Sie einfach eine anagram generator like this one made for Scrabble players.

Der Revolution Word Finder hat zwei Optionen; ein Anagramm Finder und ein Scrabble Solver. Der Anagramm-Finder nimmt eine Liste von Buchstaben und gibt alle gültigen Anagramme zurück, die mit ihnen relativ zu einer festen Liste von Wörtern erstellt werden können. Jedes Anagramm wird auf Gültigkeit gegen die SOWPODS Wortliste geprüft, die die Wortliste ist, die in gegenwärtigen internationalen Scrabble-Turnieren benutzt wird.

+0

"Sie könnten Ihre Wortliste Rechtschreibprüfung und alle Rechtschreibfehler gegen ein Standardwörterbuch beseitigen." Nun, genau das habe ich versucht. Das sagt mir aber nichts darüber, wie genau das erreicht werden kann, indem ich meine Frage zumindest teilweise umgehe. – Joey

+0

Entschuldigung, ich wollte deine Rechtschreibprüfung nicht auf die Seite setzen, habe eine Referenz hinzugefügt, was ich meinte. Ich sagte, Sie haben Standard-Tools, um die Match-Liste zu erarbeiten. – nik

+0

Hmm, richtig, obwohl das keine "Powershell-integrierte" Lösung ist. Ich könnte wahrscheinlich auch die Rechtschreibprüfung von Office dazu zwingen, zu arbeiten, aber das ist wahrscheinlich jenseits dessen, was ich dafür tun würde. Auch wenn ich eine Liste falsch geschriebener Wörter verwende, hilft mir das nicht, da ich lieber eine Liste richtig geschriebener Wörter brauche :) (Das fragliche Spiel ist http://www.kongregate.com/games/Morpheme/ blocks-with-letters-on und in einigen Levels hatte ich Mühe, das Wort zu finden, das ich konstruieren musste, deshalb entschied ich mich für brutale Zwänge und suchte nach Wörtern in der resultierenden Liste. – Joey

Verwandte Themen