Jump to content

Recommended Posts

Posted (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.html

Brief 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. BAT

B=3
A=2
T=71

BAT=3*2*71=426

This will have the same numerical value as the word, TAB

T=71
A=2
B=3

TAB=71*2*3=426

Therefore, 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.50

I 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.

SO

Here 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 WELL

THIS IS THE ANAGRAM SOLVER

#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   ;==>_Exit

If 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 BUILDER

#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_MinIndex

OK, so the dictionary files are too big to attach :S

Here is a .zip file, CONTENTS:

Wordlist.txt ;SIZE=2259KB
Numlist.txt ;SIZE=3018KB
AnagramSOLVER.au3 ;SIZE=7KB
LibraryBUILDER.au3 ;SIZE=4KB

http://FastFreeFileHosting.com/file/35445/Anagram-zip.html

If 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 dictionaries

Although 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 by furrycow
Instant Lockerz Invite - www.instantlockerzinvite.co.uk
Posted

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]

Posted

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
  • 3 weeks later...
Posted

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 it

The earthquakes: It comes back with (among other combinations) = That queer shake

Debit card: It comes back with (among other combinations) = Bad credit

Slot machines: It comes back with (among other combinations) = Cash lost in ‘em

School master: It comes back with (among other combinations) = The classroom

Dormitory: It comes back with (among other combinations) = Dirty room

Desperation: It comes back with (among other combinations) = A rope ends it

The Morse code: It comes back with (among other combinations) = Here come dots

and here are some more:

A decimal point: I’m a dot in place

Fir cones: Conifers

The eyes: They see

Conversation: Voices rant on

Election results: Lies – let’s recount

Schoolmaster: The classroom

Listen: Silent

The Country Side: No City Dust Here

Evangelist: Evil’s Agent

Astronomers: No more stars

The eyes: They see

The Cockroach: Cook, Catch Her

Desperation: A Rope Ends It

The Morse Code: Here Come Dots

Slot Machines: Cash Lost in’em

Conversation: Voices Rant On

Funeral: Real Fun

The Hilton: Hint: Hotel

Vacation Times: I’m Not as Active

The Detectives: Detect Thieves

Semolina: Is No Meal

Christmas tree: Search, Set, Trim

Presbyterian: Best In Prayer

Statue of Liberty: Built to Stay Free

Source 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
Posted

@furrycow

Hi, 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 it

The 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?" :D

i.e. given input something like:

Calamity: It comes back with (among other combinations) = ay calm it

The 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.:(B)

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
Posted

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.

  • 11 years later...
Posted (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 by CarlD

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...