-
Posts
7,103 -
Joined
-
Days Won
88
Content Type
Forums
Downloads
Forum Articles
Events
Everything posted by TheDcoder
-
Sorting a 2D array by version
TheDcoder replied to TheDcoder's topic in AutoIt General Help and Support
I needed a solution which fixes the version string after the sorting because those version numbers are displayed to the user and I do not want the user get confused! Albeit, it is a nice way if you want to sort the array internally -
Sorting a 2D array by version
TheDcoder replied to TheDcoder's topic in AutoIt General Help and Support
More RegEx magic. Thanks for the code @Malkey -
Sorting a 2D array by version
TheDcoder replied to TheDcoder's topic in AutoIt General Help and Support
Well said @czardas . -
Sorting a 2D array by version
TheDcoder replied to TheDcoder's topic in AutoIt General Help and Support
In the end, I decided to go with @wraithdu's _ArrayNaturalSort. Just what I needed! #include <Array.au3> #include <StringConstants.au3> #Region Include Functions ; #FUNCTION# ==================================================================================================================== ; Name ..........: _ArrayCustomSort ; Description ...: Sort a 1D or 2D array on a specific index using the quicksort/insertionsort algorithms, based on a custom sorting function. ; Syntax ........: _ArrayCustomSort(Byref $avArray, $sSortFunc[, $iDescending = 0[, $iStart = 0[, $iEnd = 0[, $iSubItem = 0]]]]) ; Parameters ....: $avArray - [in/out] Array to sort ; $sSortFunc - Name of custom sorting function. See Remarks for usage. ; $iDescending - [optional] If set to 1, sort descendingly ; $iStart - [optional] Index of array to start sorting at ; $iEnd - [optional] Index of array to stop sorting at ; $iSubItem - [optional] Sub-index to sort on in 2D arrays ; Return values .: Success - 1 ; Failure - 0, sets @error: ; |1 - $avArray is not an array ; |2 - $iStart is greater than $iEnd ; |3 - $iSubItem is greater than subitem count ; |4 - $avArray has too many dimensions ; |5 - Invalid sort function ; Author ........: Erik Pilsits ; Modified ......: Erik Pilsits - removed IsNumber testing, LazyCoder - added $iSubItem option, Tylo - implemented stable QuickSort algo, Jos van der Zande - changed logic to correctly Sort arrays with mixed Values and Strings, Ultima - major optimization, code cleanup, removed $i_Dim parameter ; Remarks .......: Sorting function is called with two array elements as arguments. The function should return ; 0 if they are equal, ; -1 if element one comes before element two, ; 1 if element one comes after element two. ; Related .......: ; Link ..........: ; Example .......: No ; =============================================================================================================================== Func _ArrayCustomSort(ByRef $avArray, $sSortFunc, $iDescending = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0) If Not IsArray($avArray) Then Return SetError(1, 0, 0) If Not IsString($sSortFunc) Then Return SetError(5, 0, 0) Local $iUBound = UBound($avArray) - 1 ; Bounds checking If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound If $iStart < 0 Then $iStart = 0 If $iStart > $iEnd Then Return SetError(2, 0, 0) ; Sort Switch UBound($avArray, 0) Case 1 __ArrayCustomQuickSort1D($avArray, $sSortFunc, $iStart, $iEnd) If $iDescending Then _ArrayReverse($avArray, $iStart, $iEnd) Case 2 Local $iSubMax = UBound($avArray, 2) - 1 If $iSubItem > $iSubMax Then Return SetError(3, 0, 0) If $iDescending Then $iDescending = -1 Else $iDescending = 1 EndIf __ArrayCustomQuickSort2D($avArray, $sSortFunc, $iDescending, $iStart, $iEnd, $iSubItem, $iSubMax) Case Else Return SetError(4, 0, 0) EndSwitch Return 1 EndFunc ;==>_ArrayCustomSort ; #INTERNAL_USE_ONLY#============================================================================================================ ; Name...........: __ArrayCustomQuickSort1D ; Description ...: Helper function for sorting 1D arrays ; Syntax.........: __ArrayCustomQuickSort1D(ByRef $avArray, ByRef $sSortFunc, ByRef $iStart, ByRef $iEnd) ; Parameters ....: $avArray - Array to sort ; $sSortFunc - Name of sorting function. ; $iStart - Index of array to start sorting at ; $iEnd - Index of array to stop sorting at ; Return values .: None ; Author ........: Jos van der Zande, LazyCoder, Tylo, Ultima ; Modified.......: Erik Pilsits - removed IsNumber testing ; Remarks .......: For Internal Use Only ; Related .......: ; Link ..........; ; Example .......; ; =============================================================================================================================== Func __ArrayCustomQuickSort1D(ByRef $avArray, ByRef $sSortFunc, ByRef $iStart, ByRef $iEnd) If $iEnd <= $iStart Then Return Local $vTmp ; InsertionSort (faster for smaller segments) If ($iEnd - $iStart) < 15 Then Local $i, $j For $i = $iStart + 1 To $iEnd $vTmp = $avArray[$i] For $j = $i - 1 To $iStart Step -1 If (Call($sSortFunc, $vTmp, $avArray[$j]) >= 0) Then ExitLoop $avArray[$j + 1] = $avArray[$j] Next $avArray[$j + 1] = $vTmp Next Return EndIf ; QuickSort Local $L = $iStart, $R = $iEnd, $vPivot = $avArray[Int(($iStart + $iEnd) / 2)] Do While (Call($sSortFunc, $avArray[$L], $vPivot) < 0) $L += 1 WEnd While (Call($sSortFunc, $avArray[$R], $vPivot) > 0) $R -= 1 WEnd ; Swap If $L <= $R Then $vTmp = $avArray[$L] $avArray[$L] = $avArray[$R] $avArray[$R] = $vTmp $L += 1 $R -= 1 EndIf Until $L > $R __ArrayCustomQuickSort1D($avArray, $sSortFunc, $iStart, $R) __ArrayCustomQuickSort1D($avArray, $sSortFunc, $L, $iEnd) EndFunc ;==>__ArrayCustomQuickSort1D ; #INTERNAL_USE_ONLY#============================================================================================================ ; Name...........: __ArrayCustomQuickSort2D ; Description ...: Helper function for sorting 2D arrays ; Syntax.........: __ArrayCustomQuickSort2D(ByRef $avArray, ByRef $sSortFunc, ByRef $iStep, ByRef $iStart, ByRef $iEnd, ByRef $iSubItem, ByRef $iSubMax) ; Parameters ....: $avArray - Array to sort ; $iStep - Step size (should be 1 to sort ascending, -1 to sort descending!) ; $iStart - Index of array to start sorting at ; $iEnd - Index of array to stop sorting at ; $iSubItem - Sub-index to sort on in 2D arrays ; $iSubMax - Maximum sub-index that array has ; Return values .: None ; Author ........: Jos van der Zande, LazyCoder, Tylo, Ultima ; Modified.......: Erik Pilsits - removed IsNumber testing ; Remarks .......: For Internal Use Only ; Related .......: ; Link ..........; ; Example .......; ; =============================================================================================================================== Func __ArrayCustomQuickSort2D(ByRef $avArray, ByRef $sSortFunc, ByRef $iStep, ByRef $iStart, ByRef $iEnd, ByRef $iSubItem, ByRef $iSubMax) If $iEnd <= $iStart Then Return ; QuickSort Local $i, $vTmp, $L = $iStart, $R = $iEnd, $vPivot = $avArray[Int(($iStart + $iEnd) / 2)][$iSubItem] Do While ($iStep * Call($sSortFunc, $avArray[$L][$iSubItem], $vPivot) < 0) $L += 1 WEnd While ($iStep * Call($sSortFunc, $avArray[$R][$iSubItem], $vPivot) > 0) $R -= 1 WEnd ; Swap If $L <= $R Then For $i = 0 To $iSubMax $vTmp = $avArray[$L][$i] $avArray[$L][$i] = $avArray[$R][$i] $avArray[$R][$i] = $vTmp Next $L += 1 $R -= 1 EndIf Until $L > $R __ArrayCustomQuickSort2D($avArray, $sSortFunc, $iStep, $iStart, $R, $iSubItem, $iSubMax) __ArrayCustomQuickSort2D($avArray, $sSortFunc, $iStep, $L, $iEnd, $iSubItem, $iSubMax) EndFunc ;==>__ArrayCustomQuickSort2D ; #FUNCTION# ==================================================================================================================== ; Name...........: _NaturalCompare ; Description ...: Compare two strings using Natural (Alphabetical) sorting. ; Syntax.........: _NaturalCompare($s1, $s2[, $iCase = 0]) ; Parameters ....: $s1, $s2 - Strings to compare ; $iCase - [Optional] Case sensitive or insensitive comparison ; |0 - Case insensitive (default) ; |1 - Case sensitive ; Return values .: Success - One of the following: ; |0 - Strings are equal ; |-1 - $s1 comes before $s2 ; |1 - $s1 goes after $s2 ; Failure - Returns -2 and Sets @Error: ; |1 - $s1 or $s2 is not a string ; |2 - $iCase is invalid ; Author ........: Erik Pilsits ; Modified.......: ; Remarks .......: Original algorithm by Dave Koelle ; Related .......: StringCompare ; Link ..........: http://www.davekoelle.com/alphanum.html ; Example .......: Yes ; =============================================================================================================================== Func _NaturalCompare($s1, $s2, $iCase = 0) ; check params If (Not IsString($s1)) Then $s1 = String($s1) If (Not IsString($s2)) Then $s2 = String($s2) ; check case, set default If $iCase <> 0 And $iCase <> 1 Then $iCase = 0 Local $n = 0 Local $s1chunk, $s2chunk Local $idx, $i1chunk, $i2chunk Local $s1temp, $s2temp While $n = 0 ; get next chunk ; STRING 1 $s1chunk = StringRegExp($s1, "^(\d+|\D+)", 1) If @error Then $s1chunk = "" Else $s1chunk = $s1chunk[0] EndIf ; STRING 2 $s2chunk = StringRegExp($s2, "^(\d+|\D+)", 1) If @error Then $s2chunk = "" Else $s2chunk = $s2chunk[0] EndIf ; ran out of chunks, strings are the same, return 0 If $s1chunk = "" And $s2chunk = "" Then Return 0 ; remove chunks from strings $s1 = StringMid($s1, StringLen($s1chunk) + 1) $s2 = StringMid($s2, StringLen($s2chunk) + 1) Select ; Case 1: both chunks contain letters Case (Not StringIsDigit($s1chunk)) And (Not StringIsDigit($s2chunk)) $n = StringCompare($s1chunk, $s2chunk, $iCase) ; Case 2: both chunks contain numbers Case StringIsDigit($s1chunk) And StringIsDigit($s2chunk) ; strip leading 0's $s1temp = $s1chunk $s2temp = $s2chunk $s1chunk = StringRegExpReplace($s1chunk, "^0*", "") $s2chunk = StringRegExpReplace($s2chunk, "^0*", "") ; record number of stripped 0's $s1temp = StringLen($s1temp) - StringLen($s1chunk) $s2temp = StringLen($s2temp) - StringLen($s2chunk) ; first check if one string is longer than the other, meaning a bigger number If StringLen($s1chunk) > StringLen($s2chunk) Then Return 1 ElseIf StringLen($s1chunk) < StringLen($s2chunk) Then Return -1 EndIf ; strings are equal length ; compare 8 digits at a time, starting from the left, to avoid overflow $idx = 1 While 1 $i1chunk = Int(StringMid($s1chunk, $idx, 8)) $i2chunk = Int(StringMid($s2chunk, $idx, 8)) ; check for end of string If $i1chunk = "" And $i2chunk = "" Then ; check number of leading 0's removed, if any - windows sorts more leading 0's above fewer leading 0's, ie 00001 < 0001 < 001 If $s1temp > $s2temp Then Return -1 ElseIf $s1temp < $s2temp Then Return 1 Else ; numbers are equal ExitLoop EndIf EndIf ; valid numbers, so compare If $i1chunk > $i2chunk Then Return 1 ElseIf $i1chunk < $i2chunk Then Return -1 EndIf ; chunks are equal, get next chunk of digits $idx += 8 WEnd ; Case 3: one chunk has letters, the other has numbers; or one is empty Case Else ; if we get here, this should be the last and deciding test, so return the result Return StringCompare($s1chunk, $s2chunk, $iCase) EndSelect WEnd Return $n EndFunc ; #FUNCTION# ==================================================================================================================== ; Name...........: _ArrayNaturalSort ; Description ...: Sort a 1D or 2D array on a specific index using the quicksort/insertionsort algorithms. ; Syntax.........: _ArrayNaturalSort(ByRef $avArray[, $iDescending = 0[, $iStart = 0[, $iEnd = 0[, $iSubItem = 0]]]]) ; Parameters ....: $avArray - Array to sort ; $iDescending - [optional] If set to 1, sort descendingly ; $iStart - [optional] Index of array to start sorting at ; $iEnd - [optional] Index of array to stop sorting at ; $iSubItem - [optional] Sub-index to sort on in 2D arrays ; Return values .: Success - 1 ; Failure - 0, sets @error: ; |1 - $avArray is not an array ; |2 - $iStart is greater than $iEnd ; |3 - $iSubItem is greater than subitem count ; |4 - $avArray has too many dimensions ; |5 - Invalid sort function ; Author ........: Erik Pilsits ; Modified.......: ; Remarks .......: ; Related .......: ; Link ..........: https://www.autoitscript.com/forum/topic/83626-natural-order-string-comparison/ ; Example .......: No ; =============================================================================================================================== Func _ArrayNaturalSort(ByRef $avArray, $iDescending = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0) Return _ArrayCustomSort($avArray, "_NaturalCompare", $iDescending, $iStart, $iEnd, $iSubItem) EndFunc ;==>_ArrayNaturalSort #EndRegion Local $aVersionsAndReleases[4][2] = [["0.2.8.9", "Release #1"], ["0.2.9.10", "Release #3"], ["0.2.9.11", "Release #4"], ["0.2.8.10", "Release #2"]] _ArrayNaturalSort($aVersionsAndReleases, 1) ConsoleWrite(_ArrayToString($aVersionsAndReleases, ' - ')) _ArrayDisplay($aVersionsAndReleases) -
Sorting a 2D array by version
TheDcoder replied to TheDcoder's topic in AutoIt General Help and Support
@czardas I have looked into natural sort but most of them only talk about a single number... not multiple digits in a single column! I will look into them anyway. Now I know what natural sort is . @Jos That's quick hack you have got there! . Never thought that it would be that simple @AspirinJunkie Your UDF looks very promising, I will give it a go . I will post back with the results which I finish playing around with the solutions. Thanks for post y'all! Much Appreciated! -
Hi, I have a 2D array with 2 columns, the 1st column contains a "version string" and the 2nd column contains a generic string. I want to sort it in the descending order so the latest version comes first. #include <Array.au3> Local $aVersionsAndReleases[4][2] = [["0.2.8.9", "Release #1"], ["0.2.9.10", "Release #3"], ["0.2.9.11", "Release #4"], ["0.2.8.10", "Release #2"]] _ArraySort($aVersionsAndReleases, 1) ConsoleWrite(_ArrayToString($aVersionsAndReleases, ' - ')) _ArrayDisplay($aVersionsAndReleases) Unfortunately, _ArraySort isn't working here . This is the output generated by the script: 0.2.9.11 - Release #4 0.2.9.10 - Release #3 0.2.8.9 - Release #1 0.2.8.10 - Release #2 The expected result should be: 0.2.9.11 - Release #4 0.2.9.10 - Release #3 0.2.8.10 - Release #2 0.2.8.9 - Release #1 I am looking to develop an function which does this... but I don't know where to start . Can someone help me get started? Thanks in Advance! - TD.
-
Please do not post scripts which help you pirate software. I also recommend using Free Download Manager which is FOSS and an great alternative to Internet Download Manager
- 2 replies
-
- khathisoft
- khathiatz
-
(and 2 more)
Tagged with:
-
Hi @taylansan! Thanks for considering a donation to AutoIt but as per my knowledge Turkey has blocked Paypal so Turkish people cannot use it now . I am afraid that you would have to choose alternative methods provided by the AutoIt Administration... if possible.
-
[SOLVED] Download file from github
TheDcoder replied to rootx's topic in AutoIt General Help and Support
This might be helpful: https://developer.github.com/v3/repos/releases/#get-the-latest-release -
Oh... Ok
-
Been using this for a while now...
-
You can upload your program to VirusTotal so that security experts can analyse your program, they may rarely fix the false positive in their Anti-Virus software.
-
Bingo, found the scripts and source code for the help file! You can download them from here: https://www.autoitscript.com/autoit3/files/beta/autoit/autoit-docs-v3.3.15.0-src.zip If you extract the zip and go to docs -> _build you can find the scripts used for building the help file
-
Yes, I also remember something like that in the source code for the help file I think, let me search for it.
-
@rcmaehl I think you can use custom CSS to make the formatting similar to AutoIt's Help File... albeit, it will only work for the HTML output. I wish I could give you some links but I am myself a little confused about how custom styles work, best consult the documentation.
-
LocalProxy-HostViewer and Generator for PAC
TheDcoder replied to ripdad's topic in AutoIt Example Scripts
Sorry, I was looking at this code: $sHost = StringRegExpReplace($sHeader, '(?is).*Host:\s(.*?)\r\n.*', '\1') $sHost = StringRegExpReplace($sHost, '(:.*)', '') I just realised that it is not parsing the JS . And sorry again, I will mind my own business from now on. -
I have tried to document stuff in HTML but it is a pain in the butt and not easy to maintain. I have switched to AsciiDoc which is far more easier to maintain and you can convert it to HTML, PDF, ePub etc . I use AsciiDoctor (implementation of AsciiDoctor in Ruby) to convert/compile my AsciiDoc document into a neat HTML file
-
LocalProxy-HostViewer and Generator for PAC
TheDcoder replied to ripdad's topic in AutoIt Example Scripts
Looks like you are using RegEx to interpret Javascript which is a very bad idea... I would use something like IE to interpret JS . By using RegEx you are limiting your script to be able to work with only PAC scripts with the same pattern as your example -
FileReadLine outputs gibberish
TheDcoder replied to virhonestum's topic in AutoIt General Help and Support
Global Const $NULL = Chr(0) -
Why am I getting these errors???!
TheDcoder replied to Dana86's topic in AutoIt General Help and Support
No, I don't think so... unless you copy and paste those hidden characters across 2 pages -
I will make sure to that check that out later .
-
I see no reason to not include tools like "SciTE Config", "Toggle Override Font" etc. in non-au3 files, aren't they supposed to be independent of the format of the file currently being edited?
-
One thing I can understand for sure now, the extra tools won't show up for non-au3 files... I see a bug/feature ticket coming up . Thanks everyone for their answers! I can confirm this by opening the tools menu in my au3 file: