Frage

Für einige Spiel, wo man braucht Anagramme aus einem Bündel von losen Buchstaben finde ich eine Permutation Algorithmus implementiert beendet, um alle möglichen Anagramme zu finden und diejenigen auswählen, wenn für bekannte Brief Positionen benötigt (-match ist groß, übrigens). Aber für längere Wörter erwies sich dies sehr fehleranfällig, da eine große Liste von Kauderwelsch Skimming wirklich nicht die richtigen Worte offenbaren, die innerhalb verborgen waren.

So dachte ich, dass , wenn würde ich eine große Liste von englischen Worten hat (sollte irgendwo erhältlich sein) I könnte nur meine Liste von Permutationen mit der Liste der richtigen schneiden Worte und bekommen (hoffentlich) alle wirklichen Worte aus der Permutation Liste.

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 Ich habe gedacht wären über eine Liste zu durchlaufen und eine -contains für jedes Element tun:

$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:

$wordlist -matches (($permlist | %{ "^$_`$" }) -join "|")

Aber das wäre wahrscheinlich nicht sehr schnell sein entweder. Ich könnte vielleicht auch findstr mit über gigantische Regex verwenden, aber das fühlt sich einfach falsch.

Gibt es Einbau-Lösungen, die ich verwenden könnte und dass es besser als meine Versuche bisher? Sonst würde ich wahrscheinlich die Wortliste in eine Hash-Tabelle setzen und den iterativen -contains Ansatz verwenden, die genug ist, dann schnell sein sollte.

War es hilfreich?

Lösung

$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 sind in-Place-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))

Natürlich muss jemand diese statisch-generic-Reflexion Mist in einem freundlichen Cmdlets wickeln! Keine Sorge, ich arbeite daran ...

Andere Tipps

Sie können die Rechtschreibung prüfen Sie Ihre Liste von Wörtern und beseitigen alle Rechtschreibfehler gegenüber einem Standard-Wörterbuch.

Mit dem GNU aspell Paket installiert

 cat text.txt | aspell list

werden Sie eine Liste aller miss-geschriebenen Worte.
Sie können mit aspell mit anderen Wörterbüchern arbeiten.


oder nur Pickup ein Anagrammgenerator wie diese für Scrabble-Spieler gemacht .

  

Die Revolution Word-Finder hat zwei Möglichkeiten; ein Anagram Finder und ein Scrabble Solver. Die Anagram Finder nimmt eine Liste von Buchstaben und gibt alle gültigen Anagramme, die erstellt werden, können sie relativ zu einer festen Liste von Wörtern verwenden. Jedes Anagramm wird auf Gültigkeit geprüft gegen die SOWPODS Wortliste, die die Wortliste ist in der aktuellen internationalen verwendet Scrabble-Turniere.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top