furrycow Posted March 26, 2010 Posted March 26, 2010 (edited) BEFORE I START: I just want to say a quick thanks to martin and Xand3r, for their help on a part of this in the General Help Forum - cheers guys!OK, so this was part of a MUCH larger project of mine...but i thought i might as well, share this seriously good finding on the internet that i...well...found. The site being: http://www.f1compiler.com/samples/Anagram123.f1.htmlBrief explanation of code from site:If you give each letter of the alphabet a different PRIME NUMBER, so..a=2 b=3 c=5 d=7 e=11 ..and so on...and then multiply the letters numerical values in a given word, eg. BATB=3 A=2 T=71 BAT=3*2*71=426This will have the same numerical value as the word, TABT=71 A=2 B=3 TAB=71*2*3=426Therefore, all the program needs to do is find the numerical value of the anagram that the user has input, and find that exact same numerical value in a pre-built dictionary file.So, this is nothing neat as i've just put pieces of code together that i used, but it works, and it does so beautifully...on my old school 2.8GHz P4, it calculates all possible words of the anagram input by the user in these time periods:ANAGRAM LENGTH --- TIME (secs) 2 letters --- 0.017 3 letters --- 0.026 4 letters --- 0.043 5 letters --- 0.101 6 letters --- 0.201 7 letters --- 0.432 8 letters --- 1.054 9 letters --- 2.277 10 letters --- 6.423 11 letters --- 19.50I need to point out this is giving EVERY POSSIBLE word that can be found in the anagram...right down to two letter words, so when searching a 9 letter anagram, it is giving all the words of letter length; 9, 8, 7, 6, 5, 4, 3 and 2.If you just want to find the exact anagram + the exact anagram with an additional letter to the anagram, this only takes 0.021 secs on my computer.SOHere is all the code you need, with a GUI as well, so all you need to do is run it, and bob's your uncle.MAKE SURE YOU DOWNLOAD THE DICTIONARY FILES AS WELLTHIS IS THE ANAGRAM SOLVERexpandcollapse popup#include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> #include <GuiEdit.au3> #include <Array.au3> Opt('GUIOnEventMode', 1) Opt("TrayMenuMode", 1) Opt("TrayOnEventMode", 1) ;========================================================= ;============== USER VALUES - NEED CHANGING ============== $DICTDestination=@DesktopDir & "\Library\Wordlist.txt";Destination of dictionary file $NUMDestination=@DesktopDir & "\Library\Numlist.txt";Destination of corresponding numerical file ;========================================================= ;========================================================= TraySetToolTip("Anagram Solver") $TrayEXIT = TrayCreateItem("Exit") TrayItemSetOnEvent($TrayEXIT, "_Exit") Global $Output, $NumFOUND, $Words, $arrALPHA[27] $FRMAnagramSolver = GUICreate("Anagram Solver", 210, 466, 421, 131) $LSTWords = GUICtrlCreateEdit("", 8, 96, 193, 344, $WS_VSCROLL) GUICtrlCreateLabel("", 8, 96, 176, 344) GUICtrlSetState(-1, $GUI_ONTOP) $LBLAnagram = GUICtrlCreateLabel("Anagram:", 8, 8, 49, 17) $IPAnagram = GUICtrlCreateInput("", 64, 6, 137, 21) GUICtrlSetState(-1, $GUI_DISABLE) $BUTSolve = GUICtrlCreateButton("Solve", 8, 64, 195, 25, $WS_GROUP) GUICtrlSetState(-1, $GUI_DISABLE) GUICtrlSetOnEvent(-1, "_Search") $RADExtra = GUICtrlCreateRadio("Additional Letters", 8, 40, 97, 17) GUICtrlSetState(-1, $GUI_CHECKED) $RADAll = GUICtrlCreateRadio("All Combinations", 108, 40, 97, 17) $LBLStatus = GUICtrlCreateLabel("Building Dictionaries...", 8, 448, 191, 17) GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") GUISetState(@SW_SHOW) $WordLIST = StringSplit(StringStripCR(FileRead($DICTDestination)), @LF) $NumLIST = StringSplit(StringStripCR(FileRead($NUMDestination)), @LF) $arrALPHA[1] = "A" $arrALPHA[2] = "B" $arrALPHA[3] = "C" $arrALPHA[4] = "D" $arrALPHA[5] = "E" $arrALPHA[6] = "F" $arrALPHA[7] = "G" $arrALPHA[8] = "H" $arrALPHA[9] = "I" $arrALPHA[10] = "J" $arrALPHA[11] = "K" $arrALPHA[12] = "L" $arrALPHA[13] = "M" $arrALPHA[14] = "N" $arrALPHA[15] = "O" $arrALPHA[16] = "P" $arrALPHA[17] = "Q" $arrALPHA[18] = "R" $arrALPHA[19] = "S" $arrALPHA[20] = "T" $arrALPHA[21] = "U" $arrALPHA[22] = "V" $arrALPHA[23] = "W" $arrALPHA[24] = "X" $arrALPHA[25] = "Y" $arrALPHA[26] = "Z" GUICtrlSetState($IPAnagram, $GUI_ENABLE) GUICtrlSetState($BUTSolve, $GUI_ENABLE) GUICtrlSetState($IPAnagram, $GUI_FOCUS) Sleep(500) GUICtrlSetData($LBLStatus, "Ready") $Break = "--------------------------------------------------------" While 1 Sleep(100) WEnd Func _Search() If StringIsAlpha(GUICtrlRead($IPAnagram)) = 0 Then Return GUICtrlSetState($BUTSolve, $GUI_DISABLE) Global $Time = TimerInit() If GUICtrlRead($RADExtra) = 1 Then _SearchLETTERS() Else _SearchCOMBOS() EndIf GUICtrlSetState($BUTSolve, $GUI_ENABLE) EndFunc ;==>_Search Func _AllCOMBOS($text) $a = StringSplit($text, "") For $i = 0 To 2 ^ StringLen($text) - 1 $res = '' For $j = 1 To StringLen($text) If BitAND($i, 2 ^ ($j - 1)) Then $res &= $a[$j] Next _ArrayAdd($arrWORDLIST, $res) Next EndFunc ;==>_AllCOMBOS Func _SearchCOMBOS() Global $arrWORDLIST[1], $WordRETURN = "", $OutputUNIQUE[1] GUICtrlSetData($LSTWords, "") GUICtrlSetData($LBLStatus, "Searching...") $Anagram = GUICtrlRead($IPAnagram) _AllCOMBOS($Anagram) $arrWORDLIST = _ArrayUnique($arrWORDLIST) $AnagramLEN = StringLen($Anagram) While 1 _GUICtrlEdit_AppendText($LSTWords, $Break&@CRLF&$AnagramLEN&" CHARACTERS"&@CRLF) For $i = 1 To UBound($arrWORDLIST) - 1 If StringLen($arrWORDLIST[$i]) = $AnagramLEN Then $Output = 1 $AnagramNUM = StringSplit($arrWORDLIST[$i], "") For $x = 1 To $AnagramNUM[0] _NumASSIGN($AnagramNUM[$x]) Next _SearchLIST() If _ArraySearch($OutputUNIQUE, $Output) < 0 Then _ArrayAdd($OutputUNIQUE, $Output) _GUICtrlEdit_AppendText($LSTWords, StringUpper($Words)) EndIf EndIf Next $AnagramLEN -= 1 If $AnagramLEN < 2 Then ExitLoop WEnd GUICtrlSetData($LBLStatus, "Searched in " & Round(TimerDiff($Time) / 1000, 5) & " secs") EndFunc ;==>_SearchCOMBOS Func _SearchLETTERS() GUICtrlSetData($LSTWords, "") GUICtrlSetData($LBLStatus, "Searching...") $List = "" $Anagram = GUICtrlRead($IPAnagram) $Output = 1 $AnagramNUM = StringSplit($Anagram, "") For $x = 1 To $AnagramNUM[0] _NumASSIGN($AnagramNUM[$x]) Next _SearchLIST() If $Words = "" Then $Words = "NONE FOUND" & @CRLF $List &= "ORIGINAL ANAGRAM RESULTS" & @CRLF & $Break & @CRLF & $Words & $Break & @CRLF & "WITH ADDITIONAL LETTERS" & @CRLF & $Break $OrigOUTPUT = $Output For $x = 1 To UBound($arrALPHA) - 1 _NumASSIGN($arrALPHA[$x]) $Output = Number($Output) _SearchLIST() If $NumFOUND > -1 Then $List &= @CRLF & $arrALPHA[$x] & @CRLF & $Words & $Break $Output = $OrigOUTPUT Next _GUICtrlEdit_AppendText($LSTWords, StringUpper($List)) GUICtrlSetData($LBLStatus, "Searched in " & Round(TimerDiff($Time) / 1000, 5) & " secs") EndFunc ;==>_SearchLETTERS Func _SearchLIST() Global $NumFOUND = _ArrayBinarySearch($NumLIST, $Output, 1, $NumLIST[0] - 1) If $NumFOUND > -1 Then $OrigNUM = $NumFOUND $Words = $WordLIST[$NumFOUND] & @CRLF While 1 $NumFOUND += 1 If $NumLIST[$NumFOUND] = $Output Then $Words &= $WordLIST[$NumFOUND] & @CRLF Else $NumFOUND = $OrigNUM While 1 $NumFOUND -= 1 If $NumLIST[$NumFOUND] = $Output Then $Words &= $WordLIST[$NumFOUND] & @CRLF Else ExitLoop EndIf WEnd ExitLoop EndIf WEnd Else $Words = "" EndIf EndFunc ;==>_SearchLIST Func _NumASSIGN($Letter) If $Letter = "A" Then $Output *= 2; If $Letter = "B" Then $Output *= 3; If $Letter = "C" Then $Output *= 5; If $Letter = "D" Then $Output *= 7; If $Letter = "E" Then $Output *= 11; If $Letter = "F" Then $Output *= 13; If $Letter = "G" Then $Output *= 17; If $Letter = "H" Then $Output *= 19; If $Letter = "I" Then $Output *= 23; If $Letter = "J" Then $Output *= 29; If $Letter = "K" Then $Output *= 31; If $Letter = "L" Then $Output *= 37; If $Letter = "M" Then $Output *= 41; If $Letter = "N" Then $Output *= 43; If $Letter = "O" Then $Output *= 47; If $Letter = "P" Then $Output *= 53; If $Letter = "Q" Then $Output *= 59; If $Letter = "R" Then $Output *= 61; If $Letter = "S" Then $Output *= 67; If $Letter = "T" Then $Output *= 71; If $Letter = "U" Then $Output *= 73; If $Letter = "V" Then $Output *= 79; If $Letter = "W" Then $Output *= 83; If $Letter = "X" Then $Output *= 89; If $Letter = "Y" Then $Output *= 97; If $Letter = "Z" Then $Output *= 101; EndFunc ;==>_NumASSIGN Func _Exit() Exit EndFunc ;==>_ExitIf you DO NOT WANT TO USE MY DICTIONARY FILE and you have your own you want to use, then i have written this quick program to read your dictionary, and output two new files, 1. the NEW dictionary file and 2. the corresponding numerical dictionary. NOTE: ENSURE YOUR OWN DICTIONARY FILE HAS ONE WORD PER LINE.THIS IS THE DICTIONARY BUILDERexpandcollapse popup#include <Array.au3> #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> Opt("TrayMenuMode", 1) Opt("TrayOnEventMode", 1) TraySetToolTip("Library Builder") $TrayEXIT = TrayCreateItem("Exit") TrayItemSetOnEvent($TrayEXIT, "_Exit") Global $Letter, $Output $FRMLibraryBuilder = GUICreate("Library Builder", 482, 50, 235, 180) $LBLDictSOURCE = GUICtrlCreateLabel("Dictionary File:", 8, 16, 73, 17) $IPDictSOURCE = GUICtrlCreateInput("", 88, 14, 265, 21) GUICtrlSetState(-1,$GUI_DISABLE) $BUTBuild = GUICtrlCreateButton("Build", 400, 12, 75, 25, $WS_GROUP) $BUTDictSOURCE = GUICtrlCreateButton("...", 360, 12, 27, 25, $WS_GROUP) GUISetState(@SW_SHOW) While 1 $msg = GUIGetMsg() Select Case $msg = $BUTBuild If GUICtrlRead($IPDictSOURCE)="" Then MsgBox(16,"ERROR","Please select DICTIONARY FILE.",0,$FRMLibraryBuilder) Else GUICtrlSetState($BUTDictSOURCE,$GUI_DISABLE) GUICtrlSetState($BUTBuild,$GUI_DISABLE) _ReadDICTIONARY() _BuildARRAY() _WriteDICTIONARY() Sleep(1000) WinSetTitle("Library Builder","","Library Builder") GUICtrlSetState($BUTDictSOURCE,$GUI_ENABLE) GUICtrlSetState($BUTBuild,$GUI_ENABLE) EndIf Case $msg = $BUTDictSOURCE $DestSOURCE=FileOpenDialog ( "Dictionary file destination", "", "Text Files (*.txt)" ,1, "" ,$FRMLibraryBuilder) If Not @ERROR Then GUICtrlSetData($IPDictSOURCE,$DestSOURCE) Case $msg=$GUI_EVENT_CLOSE _Exit() EndSelect WEnd Func _ReadDICTIONARY() WinSetTitle("Library Builder","","Library Builder - Reading Dictionary") Global $WordLIST = StringSplit(StringStripCR(FileRead(GUICtrlRead($IPDictSOURCE))), @LF) Global $NumLIST[UBound($WordLIST)] For $x=1 To $WordLIST[0] $WordSPLIT=StringSplit($WordLIST[$x],"") $Output=1 For $a=1 To $WordSPLIT[0] $Letter=$WordSPLIT[$a] _NumASSIGN() Next $NumLIST[$x]=Number($Output) WinSetTitle("Library Builder","","Library Builder - Assigning Values - "&$x&"\"&$WordLIST[0]) Next EndFunc Func _BuildARRAY() WinSetTitle("Library Builder","","Library Builder - Building 2D Array") _Array2D_From1D($WordLIST) _Array2D_From1D($NumLIST) _Array2D_Add($WordLIST, $NumLIST, 2) WinSetTitle("Library Builder","","Library Builder - Building 2D Array - Done") Sleep(500) WinSetTitle("Library Builder","","Library Builder - Sorting 2D Array") _ArraySort($WordLIST, 0, 0, 0, 1) WinSetTitle("Library Builder","","Library Builder - Sorting 2D Array - Done") Sleep(500) EndFunc Func _WriteDICTIONARY() $DestWORD=StringReplace(GUICtrlRead($IPDictSOURCE),".txt","-WORD.txt") $DestNUM=StringReplace(GUICtrlRead($IPDictSOURCE),".txt","-NUM.txt") For $x = 1 To UBound($WordLIST) - 1 FileWrite($DestWORD, $WordLIST[$x][0] & @CRLF) FileWrite($DestNUM, $WordLIST[$x][1] & @CRLF) WinSetTitle("Library Builder","","Library Builder - Writing Dictionary - "&$x&"\"&UBound($WordLIST) - 1) Next Sleep(500) WinSetTitle("Library Builder","","Library Builder - Finished") EndFunc Func _NumASSIGN() If $Letter = "A" Then $Output *= 2; If $Letter = "B" Then $Output *= 3; If $Letter = "C" Then $Output *= 5; If $Letter = "D" Then $Output *= 7; If $Letter = "E" Then $Output *= 11; If $Letter = "F" Then $Output *= 13; If $Letter = "G" Then $Output *= 17; If $Letter = "H" Then $Output *= 19; If $Letter = "I" Then $Output *= 23; If $Letter = "J" Then $Output *= 29; If $Letter = "K" Then $Output *= 31; If $Letter = "L" Then $Output *= 37; If $Letter = "M" Then $Output *= 41; If $Letter = "N" Then $Output *= 43; If $Letter = "O" Then $Output *= 47; If $Letter = "P" Then $Output *= 53; If $Letter = "Q" Then $Output *= 59; If $Letter = "R" Then $Output *= 61; If $Letter = "S" Then $Output *= 67; If $Letter = "T" Then $Output *= 71; If $Letter = "U" Then $Output *= 73; If $Letter = "V" Then $Output *= 79; If $Letter = "W" Then $Output *= 83; If $Letter = "X" Then $Output *= 89; If $Letter = "Y" Then $Output *= 97; If $Letter = "Z" Then $Output *= 101; EndFunc ;==>_NumASSIGN Func _Exit() Exit EndFunc ;**************************************************************** ;================================================================ ;REST OF CODE IS JUST THE REQUIRED FUNCTIONS FROM AN _ARRAY2D UDF ;================================================================ ;**************************************************************** Func _Array2D_Add(ByRef $avArray, $vValue, $iDim = 1, $iSubItem = 0, $iDoubleRedim = 0);== AUTHOR == JOS VAN DER ZANDE If $iDim = Default Then $iDim = 1 If $iSubItem = Default Then $iSubItem = 0 If $iDoubleRedim = Default Then $iDoubleRedim = 0 $vValue = __Array2D_GetValue($vValue) Local $iUbound, $iSize, $iElement Switch UBound($avArray, 0) Case 0 If Not IsArray($vValue) Then Dim $avArray [1] = [$vValue] ElseIf UBound($vValue, 0) = 1 Or UBound($vValue, 0) = 2 Then $avArray = $vValue Else Return SetError(4, 0, 0) EndIf Return SetError(0, 0, 1) Case 1 If Not IsArray($vValue) Then $iSize = 1 ElseIf UBound($vValue, 0) = 1 Then $iSize = UBound($vValue) Else Return SetError(4, 0, 0) EndIf $iElement = UBound($avArray) ReDim $avArray [UBound($avArray) + $iSize] Case 2 Local $iUbound2, $iSize2 If $iDim <> 1 And $iDim <> 2 Then Return SetError(3, 0, 0) If (Not IsArray($vValue)) Or UBound($vValue, 0) = 1 Then $iSize = 1 ElseIf UBound($vValue, 0) = 2 Then $iSize = UBound($vValue, $iDim) Else Return SetError(4, 0, 0) EndIf $iElement = UBound($avArray, $iDim) If Not $iDoubleRedim Then $iUbound2 = UBound($avArray, Mod($iDim, 2) + 1) Else If Not IsArray($vValue) Then $iSize2 = 0 ElseIf UBound($vValue, 0) = 1 Then $iSize2 = UBound($vValue) Else $iSize2 = UBound($vValue, Mod($iDim, 2) + 1) EndIf $iUbound2 = __Max(UBound($avArray, Mod($iDim, 2) + 1), $iSubItem + $iSize2) EndIf $iUbound = UBound($avArray, $iDim) + $iSize If $iDim = 1 Then ReDim $avArray [$iUbound][$iUbound2] Else ReDim $avArray [$iUbound2][$iUbound] EndIf Case Else Return SetError(2, 0, 0) EndSwitch If UBound($avArray, 0) = 2 And $iDim = 2 And IsArray($vValue) Then _Array2D_Swap($iElement, $iSubItem) _Array2D_PutValue($avArray, $vValue, $iElement, $iDim, $iSubItem) Return SetError(0, 0, 1) EndFunc ;==>_Array2D_Add Func _Array2D_PutValue(ByRef $avArray, $vValue, $iElement = 0, $iDim = 1, $iSubItem = 0) ;== AUTHOR == TOLF If $iElement = Default Then $iElement = 0 If $iDim = Default Then $iDim = 1 If $iSubItem = Default Then $iSubItem = 0 $vValue = __Array2D_GetValue($vValue) If Not IsArray($avArray) Then Return SetError(1, 0, 0) If UBound($avArray, 0) = 1 Then $iDim = 1 If $iDim <> 1 And $iDim <> 2 Then Return SetError(3, 0, 0) If $iElement < 0 Then $iElement = 0 Local $i, $j Local $iUbound = UBound($avArray) - 1 Switch UBound($avArray, 0) Case 1 If UBound($vValue, 0) > 1 Then Return SetError(4, 0, 0) If Not IsArray($vValue) Then If $iElement < UBound($avArray) Then $avArray [$iElement] = $vValue ElseIf UBound($vValue, 0) = 1 Then For $i = $iElement To __Min($iElement + UBound($vValue) - 1, $iUbound) $avArray [$i] = $vValue [$i - $iElement] Next EndIf Case 2 If UBound($vValue, 0) > 2 Then Return SetError(4, 0, 0) Local $iUbound2 = UBound($avArray, 2) - 1 If $iSubItem < 0 Then $iSubItem = 0 Switch $iDim Case 1 If Not IsArray($vValue) Then If $iElement < UBound($avArray) And $iSubItem < UBound($avArray, 2) Then $avArray [$iElement][$iSubItem] = $vValue ElseIf UBound($vValue, 0) = 1 Then For $i = $iSubItem To __Min($iSubItem + UBound($vValue) - 1, $iUbound2) $avArray [$iElement][$i] = $vValue [$i - $iSubItem] Next ElseIf UBound($vValue, 0) = 2 Then For $i = $iElement To __Min($iElement + UBound($vValue) - 1, $iUbound) For $j = $iSubItem To __Min($iSubItem + UBound($vValue, 2) - 1, $iUbound2) $avArray [$i][$j] = $vValue [$i - $iElement][$j - $iSubItem] Next Next EndIf Case 2 If Not IsArray($vValue) Then If $iElement < UBound($avArray, 2) And $iSubItem < UBound($avArray) Then $avArray [$iSubItem][$iElement] = $vValue ElseIf UBound($vValue, 0) = 1 Then For $i = $iElement To __Min($iElement + UBound($vValue) - 1, $iUbound) $avArray [$i][$iSubItem] = $vValue [$i - $iElement] Next ElseIf UBound($vValue, 0) = 2 Then For $i = $iElement To __Min($iElement + UBound($vValue) - 1, $iUbound) For $j = $iSubItem To __Min($iSubItem + UBound($vValue, 2) - 1, $iUbound2) $avArray [$i][$j] = $vValue [$i - $iElement][$j - $iSubItem] Next Next EndIf EndSwitch Case Else Return SetError(2, 0, 0) EndSwitch Return SetError(0, 0, 1) EndFunc ;==>_Array2D_PutValue Func __Array2D_GetValue($vValue);== AUTHOR = TOLF If IsString($vValue) And $ARRAY2D_DELIM_STRING <> "" And $vValue <> "" Then Return stringsplit ($vValue, $ARRAY2D_DELIM_STRING, $ARRAY2D_DELIM_FLAG) Return $vValue EndFunc ;==>__Array2D_GetValue Func _Array2D_From1D(ByRef $avArray, $iTranspose = 0);==AUTHOR = TOLF If $iTranspose = Default Then $iTranspose = 0 If Not IsArray($avArray) Then Return SetError(1, 0, 0) If Not UBound($avArray, 0) = 1 Then Return SetError(2, 0, 0) Local $i Switch $iTranspose Case 0 Local $avTransposed [UBound($avArray) ][1] For $i = 1 To UBound($avArray) $avTransposed [$i - 1][0] = $avArray [$i - 1] Next Case 1 Local $avTransposed [1][UBound($avArray) ] For $i = 1 To UBound($avArray) $avTransposed [0][$i - 1] = $avArray [$i - 1] Next Case Else Return SetError(3, 0, 0) EndSwitch $avArray = $avTransposed Return SetError(0, 0, 1) EndFunc ;==>_Array2D_From1D Func _Array2D_Max(Const ByRef $avArray, $iCompNumeric = 0, $iStart = 0, $iEnd = -1, $iDim = 1, $iSubItem = 0);==AUTHOR = CEPHAS If $iCompNumeric = Default Then $iCompNumeric = 0 If $iStart = Default Then $iStart = 0 If $iEnd = Default Then $iEnd = -1 If $iDim = Default Then $iDim = 1 If $iSubItem = Default Then $iSubItem = 0 Local $iResult = _Array2D_MaxIndex($avArray, $iCompNumeric, $iStart, $iEnd, $iDim, $iSubItem) If @error Then Return SetError(@error, 0, "") Select Case UBound($avArray, 0) = 1 Return SetError(0, 0, $avArray[$iResult]) Case UBound($avArray, 0) = 2 And $iDim = 1 Return SetError(0, 0, $avArray[$iResult][$iSubItem]) Case UBound($avArray, 0) = 2 And $iDim = 2 Return SetError(0, 0, $avArray[$iSubItem][$iResult]) EndSelect EndFunc ;==>_Array2D_Max Func _Array2D_Min(Const ByRef $avArray, $iCompNumeric = 0, $iStart = 0, $iEnd = -1, $iDim = 1, $iSubItem = 0);==AUTHOR = CEPHAS If $iCompNumeric = Default Then $iCompNumeric = 0 If $iStart = Default Then $iStart = 0 If $iEnd = Default Then $iEnd = -1 If $iDim = Default Then $iDim = 1 If $iSubItem = Default Then $iSubItem = 0 Local $iResult = _Array2D_MinIndex($avArray, $iCompNumeric, $iStart, $iEnd, $iDim, $iSubItem) If @error Then Return SetError(@error, 0, "") Select Case UBound($avArray, 0) = 1 Return SetError(0, 0, $avArray[$iResult]) Case UBound($avArray, 0) = 2 And $iDim = 1 Return SetError(0, 0, $avArray[$iResult][$iSubItem]) Case UBound($avArray, 0) = 2 And $iDim = 2 Return SetError(0, 0, $avArray[$iSubItem][$iResult]) EndSelect EndFunc ;==>_Array2D_Min Func _Array2D_MaxIndex(Const ByRef $avArray, $iCompNumeric = 0, $iStart = 0, $iEnd = -1, $iDim = 1, $iSubItem = 0);==AUTHOR = CEPHAS If $iCompNumeric = Default Then $iCompNumeric = 0 If $iStart = Default Then $iStart = 0 If $iEnd = Default Then $iEnd = -1 If $iDim = Default Then $iDim = 1 If $iSubItem = Default Then $iSubItem = 0 If Not IsArray($avArray) Then Return SetError(1, 0, -1) If UBound($avArray, 0) <> 1 And UBound($avArray, 0) <> 2 Then Return SetError(2, 0, -1) If UBound($avArray, 0) = 1 Then $iDim = 1 If $iDim <> 1 And $iDim <> 2 Then Return SetError(3, 0, -1) Local $iUbound = UBound($avArray, $iDim) - 1 ; Bounds checking If $iEnd < 0 Or $iEnd > $iUbound Then $iEnd = $iUbound If $iStart < 0 Then $iStart = 0 If $iStart > $iEnd Then Return SetError(4, 0, -1) Local $iMaxIndex = $iStart, $i ; Search Select Case UBound($avArray, 0) = 1 If $iCompNumeric Then For $i = $iStart To $iEnd If Number($avArray[$iMaxIndex]) < Number($avArray[$i]) Then $iMaxIndex = $i Next Else For $i = $iStart To $iEnd If $avArray[$iMaxIndex] < $avArray[$i] Then $iMaxIndex = $i Next EndIf Case UBound($avArray, 0) = 2 And $iDim = 1 If $iSubItem < 0 Or $iSubItem > UBound($avArray, 2) - 1 Then SetError(5, 0, -1) If $iCompNumeric Then For $i = $iStart To $iEnd If Number($avArray[$iMaxIndex][$iSubItem]) < Number($avArray[$i][$iSubItem]) Then $iMaxIndex = $i Next Else For $i = $iStart To $iEnd If $avArray[$iMaxIndex][$iSubItem] < $avArray[$i][$iSubItem] Then $iMaxIndex = $i Next EndIf Case UBound($avArray, 0) = 2 And $iDim = 2 If $iSubItem < 0 Or $iSubItem > UBound($avArray) - 1 Then SetError(5, 0, -1) If $iCompNumeric Then For $i = $iStart To $iEnd If Number($avArray[$iSubItem][$iMaxIndex]) < Number($avArray[$iSubItem][$i]) Then $iMaxIndex = $i Next Else For $i = $iStart To $iEnd If $avArray[$iSubItem][$iMaxIndex] < $avArray[$iSubItem][$i] Then $iMaxIndex = $i Next EndIf EndSelect Return SetError(0, 0, $iMaxIndex) EndFunc ;==>_Array2D_MaxIndex Func _Array2D_Swap(ByRef $vItem1, ByRef $vItem2);== AUTHOR - DAVID NUTALL Local $vTmp = $vItem1 $vItem1 = $vItem2 $vItem2 = $vTmp EndFunc ;==>_Array2D_Swap Func __Max($nNum1, $nNum2) If $nNum1 > $nNum2 Then Return $nNum1 Return $nNum2 EndFunc ;==>__Max Func __Min($nNum1, $nNum2) If $nNum1 < $nNum2 Then Return $nNum1 Return $nNum2 EndFunc ;==>__Min Func _Array2D_MinIndex(Const ByRef $avArray, $iCompNumeric = 0, $iStart = 0, $iEnd = -1, $iDim = 1, $iSubItem = 0);==AUTHOR = CEPHAS If $iCompNumeric = Default Then $iCompNumeric = 0 If $iStart = Default Then $iStart = 0 If $iEnd = Default Then $iEnd = -1 If $iDim = Default Then $iDim = 1 If $iSubItem = Default Then $iSubItem = 0 If Not IsArray($avArray) Then Return SetError(1, 0, -1) If UBound($avArray, 0) <> 1 And UBound($avArray, 0) <> 2 Then Return SetError(2, 0, -1) If UBound($avArray, 0) = 1 Then $iDim = 1 If $iDim <> 1 And $iDim <> 2 Then Return SetError(3, 0, -1) Local $iUbound = UBound($avArray, $iDim) - 1 ; Bounds checking If $iEnd < 0 Or $iEnd > $iUbound Then $iEnd = $iUbound If $iStart < 0 Then $iStart = 0 If $iStart > $iEnd Then Return SetError(4, 0, -1) Local $iMinIndex = $iStart, $i ; Search Select Case UBound($avArray, 0) = 1 If $iCompNumeric Then For $i = $iStart To $iEnd If Number($avArray[$iMinIndex]) > Number($avArray[$i]) Then $iMinIndex = $i Next Else For $i = $iStart To $iEnd If $avArray[$iMinIndex] > $avArray[$i] Then $iMinIndex = $i Next EndIf Case UBound($avArray, 0) = 2 And $iDim = 1 If $iSubItem < 0 Or $iSubItem > UBound($avArray, 2) - 1 Then SetError(5, 0, -1) If $iCompNumeric Then For $i = $iStart To $iEnd If Number($avArray[$iMinIndex][$iSubItem]) > Number($avArray[$i][$iSubItem]) Then $iMinIndex = $i Next Else For $i = $iStart To $iEnd If $avArray[$iMinIndex][$iSubItem] > $avArray[$i][$iSubItem] Then $iMinIndex = $i Next EndIf Case UBound($avArray, 0) = 2 And $iDim = 2 If $iSubItem < 0 Or $iSubItem > UBound($avArray) - 1 Then SetError(5, 0, -1) If $iCompNumeric Then For $i = $iStart To $iEnd If Number($avArray[$iSubItem][$iMinIndex]) > Number($avArray[$iSubItem][$i]) Then $iMinIndex = $i Next Else For $i = $iStart To $iEnd If $avArray[$iSubItem][$iMinIndex] > $avArray[$iSubItem][$i] Then $iMinIndex = $i Next EndIf EndSelect Return SetError(0, 0, $iMinIndex) EndFunc ;==>_Array2D_MinIndexOK, so the dictionary files are too big to attach :SHere is a .zip file, CONTENTS:Wordlist.txt ;SIZE=2259KB Numlist.txt ;SIZE=3018KB AnagramSOLVER.au3 ;SIZE=7KB LibraryBUILDER.au3 ;SIZE=4KBhttp://FastFreeFileHosting.com/file/35445/Anagram-zip.htmlIf you want to download the SOWPODS or TWL06 dictionaries, you can do so here:http://www.isc.ro/en/commands/lists.html ;You want the whole dictionary not the 2/3/4 letter dictionariesAlthough they will have pretty much all the words you would need in a dictionary, i am not sure how up-to-date these are. If you do download one of these dictionaries, make sure to run it in my DICTIONARY BUILDER.Please tell me what you think - all comments WELCOME! Edited March 27, 2010 by furrycow Instant Lockerz Invite - www.instantlockerzinvite.co.uk
Shafayat Posted March 26, 2010 Posted March 26, 2010 Looks pretty cool. Thanks. Is this free to use -err- in another project? I made one like this (without the numeric part). So, it took near a minute to do the work. Your method is much better. [Not using this account any more. Using "iShafayet" instead]
furrycow Posted March 27, 2010 Author Posted March 27, 2010 Is this free to use -err- in another project? I made one like this (without the numeric part). So, it took near a minute to do the work. Your method is much better.Thanks, although i can't really take any credit for this method as i just stumbled across it on the internet. But yes, feel free to use it as you wish! Instant Lockerz Invite - www.instantlockerzinvite.co.uk
James Posted March 27, 2010 Posted March 27, 2010 Hah, very clever! I'm going to have a good play with this! Blog - Seriously epic web hosting - Twitter - GitHub - Cachet HQ
GerrOrneq Posted April 17, 2010 Posted April 17, 2010 WOW! That is a fantastic find and a great translation into AutoIt.Five stars from me. I cannot believe how fast it is.Do you know if it would be difficult to modify it to produce a combination of words from a word or short phrase?i.e. given input something like:Calamity: It comes back with (among other combinations) = ay calm itThe earthquakes: It comes back with (among other combinations) = That queer shakeDebit card: It comes back with (among other combinations) = Bad creditSlot machines: It comes back with (among other combinations) = Cash lost in ‘emSchool master: It comes back with (among other combinations) = The classroomDormitory: It comes back with (among other combinations) = Dirty roomDesperation: It comes back with (among other combinations) = A rope ends itThe Morse code: It comes back with (among other combinations) = Here come dotsand here are some more:A decimal point: I’m a dot in placeFir cones: ConifersThe eyes: They seeConversation: Voices rant onElection results: Lies – let’s recountSchoolmaster: The classroomListen: SilentThe Country Side: No City Dust HereEvangelist: Evil’s AgentAstronomers: No more starsThe eyes: They seeThe Cockroach: Cook, Catch HerDesperation: A Rope Ends ItThe Morse Code: Here Come DotsSlot Machines: Cash Lost in’emConversation: Voices Rant OnFuneral: Real FunThe Hilton: Hint: HotelVacation Times: I’m Not as ActiveThe Detectives: Detect ThievesSemolina: Is No MealChristmas tree: Search, Set, TrimPresbyterian: Best In PrayerStatue of Liberty: Built to Stay FreeSource of the above funny anagrams.I'm afraid I wouldn't even begin to know where to start to do such a program, but it sure would be fun to be able to such anagrams. Once again Thank you for sharing.DeMo. Quote of the week:"BASIC programmers never die, they GOSUB and don't RETURN." -- UnknownWisdom of the ages:   I'd be unstoppable... if not for law enforcement and physics. Marriage, the number 1 cause of divorce. Don't steal... the government hates competition. Irish Government Motto: We’ve got what it takes to take what you’ve got. Birthdays are good for you. Statistics show that the people who have the most live the longest. Failure is not an option. It comes bundled with your Microsoft product.-- Ferenc Mantfeld If you learn from your mistakes, then why ain't I a genius?! -- Anonymous Remember, live every day as if it was your last day! one day you will be right. How is it one careless match can start a forest fire, but it takes a whole box to start a campfire? Sure my system is secure, it just locked up again. I haven't lost my mind; I have a tape back-up somewhere. ~Author Unknown
GerrOrneq Posted April 19, 2010 Posted April 19, 2010 @furrycowHi, in my last post I asked......Do you know if it would be difficult to modify it to produce a combination of words from a word or short phrase?i.e. given input something like:Calamity: It comes back with (among other combinations) = ay calm itThe earthquakes: It comes back with (among other combinations) = That queer shake...Well I guess that was a mistake in my wording, what I really meant was (Due to my brainfreeze) "Is there any way you could modify your code to produce a combination of words from a word or short phrase?" i.e. given input something like:Calamity: It comes back with (among other combinations) = ay calm itThe earthquakes: It comes back with (among other combinations) = That queer shake(The rest as per last post.)I have seen such an app in on-line web page a long time ago, but thought when I saw your app that this would be very useful/FUN to be able to do in AutoIt. I'm sorry, I know what I am asking is 'almost' rent-a-coder but I'm hoping it is an easy modification for you (or one of the other wizards here) to do. I would not even have a clue how to start to make the necessary changes/additions.If it is way too much to ask then please accept my apologies and thank you once again for sharing.DeMo. Quote of the week:"BASIC programmers never die, they GOSUB and don't RETURN." -- UnknownWisdom of the ages:   I'd be unstoppable... if not for law enforcement and physics. Marriage, the number 1 cause of divorce. Don't steal... the government hates competition. Irish Government Motto: We’ve got what it takes to take what you’ve got. Birthdays are good for you. Statistics show that the people who have the most live the longest. Failure is not an option. It comes bundled with your Microsoft product.-- Ferenc Mantfeld If you learn from your mistakes, then why ain't I a genius?! -- Anonymous Remember, live every day as if it was your last day! one day you will be right. How is it one careless match can start a forest fire, but it takes a whole box to start a campfire? Sure my system is secure, it just locked up again. I haven't lost my mind; I have a tape back-up somewhere. ~Author Unknown
Spiff59 Posted April 19, 2010 Posted April 19, 2010 You ought to do something with that NumAssign() paragraph. It has to be painfully slow, and would probably be more evident in the Builder program. Maybe a predefined array like: Global $Ascii2Prime[123] = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, _ ; asc 0-47 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,1,1,1,1,1, _ ; asc 48-95 1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101] ; asc 96-122 And then: Func _NumASSIGN($Letter) $Output *= $Ascii2Prime[Asc($Letter)] EndFunc ;==>_NumASSIGN would be useful.
CarlD Posted September 30, 2021 Posted September 30, 2021 (edited) On 8/31/2021 at 4:29 PM, mrstarc said: edit: pretend "ar" is a real word It is a real word! It denotes the letter "R". You'll find it in many dictionaries -- including Scrabble dictionaries. Your question is very interesting -- I hope you find a solution! 🙂 And ... maybe you should start a new thread, to maximize your chances of getting an answer here? 😙 Edited October 1, 2021 by CarlD
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now