Phaser Posted July 31, 2013 Share Posted July 31, 2013 Hi Everyone It's been a while since I last posted as I haven't hit any problems for a while but now I have, I am redeveloping parts of my data entry software and need to find certain sets within an array and get the array slots each side or inbetween what I am looking for and send those values to a new array. Currently I have an array[20]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] As the data gets added I change the zero to a one, after 20 entries I now examine the array for the following possible combinations 101 (here I would like the array slot of the zero returned) 0110 (again I would want the zeros) Working example after 20 entries 0,0,1,1,0,1,0,0,0,1,0,1,0,0,0,0,1,1,0,0 My new array should look like 1,4,10,15,18 The first part above looks like 0,0,1,1,0,1 This has both combinations I am after, hope this makes sense to someone, I am struggling to understand how to do it properly. Thanks to all for looking and hopefully helping. Link to comment Share on other sites More sharing options...
Edano Posted July 31, 2013 Share Posted July 31, 2013 have been doing such things often. one way is to turn the array into a string and let stringinstr do it, or you turn it into a binary, which needs a bit more knowledge about bit operations. E. [color=rgb(255,0,0);][font="'comic sans ms', cursive;"]FukuLeaks[/color][/font] Link to comment Share on other sites More sharing options...
BrewManNH Posted July 31, 2013 Share Posted July 31, 2013 You could loop through your array and search for the 1s and 0s and where they are in the array and use that to determine which 0s you need to keep track of. If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays. - ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script. - Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label. - _FileGetProperty - Retrieve the properties of a file - SciTE Toolbar - A toolbar demo for use with the SciTE editor - GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI. - Latin Square password generator Link to comment Share on other sites More sharing options...
Edano Posted July 31, 2013 Share Posted July 31, 2013 (edited) sorry, needed some time for a sample . Global $array[20]=[0,0,1,1,0,1,0,0,0,1,0,1,0,0,0,0,1,1,0,0] $string="" For $i=0 To 19 $string&=$array[$i] Next $j=1 Do $x=StringInStr($string,"101",0,$j) If $x>0 Then MsgBox(0,"",$x) $y=StringInStr($string,"0110",0,$j) If $y>0 Then MsgBox(0,$y-1,$y+2) $j+=1 Until $x=0 And $y=0 . i leave it up to you to put it in an array again E. Edit or this: . Global $array[20]=[0,0,1,1,0,1,0,0,0,1,0,1,0,0,0,0,1,1,0,0] $string="" For $i=0 To 19 $string&=$array[$i] Next For $i=1 To StringLen($string) $x=StringInStr(StringMid($string,$i,3),"101") If $x>0 Then MsgBox(0,"",$i) $y=StringInStr(StringMid($string,$i,4),"0110") If $y>0 Then MsgBox(0,$i-1,$i+2) Next . this one gets the sequence right. Edited July 31, 2013 by Edano [color=rgb(255,0,0);][font="'comic sans ms', cursive;"]FukuLeaks[/color][/font] Link to comment Share on other sites More sharing options...
Edano Posted July 31, 2013 Share Posted July 31, 2013 #include <Array.au3> Global $array[20]=[0,0,1,1,0,1,0,0,0,1,0,1,0,0,0,0,1,1,0,0] $string="" $newstring="," For $i=0 To 19 $string&=$array[$i] Next For $i=1 To StringLen($string) $x=StringInStr(StringMid($string,$i,3),"101") If $x>0 And StringInStr($newstring,","&$i&",")=0 Then $newstring&=$i&",";MsgBox(0,"",$i) $y=StringInStr(StringMid($string,$i,4),"0110") If $y>0 Then If StringInStr($newstring,","&$i-1&",")=0 Then $newstring&=$i-1&"," If StringInStr($newstring,","&$i+2&",")=0 Then $newstring&=$i+2&"," EndIf;MsgBox(0,$i-1,$i+2) Next $newarray=StringSplit(StringTrimLeft(StringTrimRight($newstring,1),1),",") _ArrayDisplay($newarray) [color=rgb(255,0,0);][font="'comic sans ms', cursive;"]FukuLeaks[/color][/font] Link to comment Share on other sites More sharing options...
Phaser Posted July 31, 2013 Author Share Posted July 31, 2013 Thanks for the speedy replies, Edano, I will study what you have suggested, many thanks for your help. Link to comment Share on other sites More sharing options...
Edano Posted July 31, 2013 Share Posted July 31, 2013 Thanks for the speedy replies, Edano, I will study what you have suggested, many thanks for your help. . if you consider to use my solutions, it would be easier to use a (I/0) string rather than an array from the beginning. [color=rgb(255,0,0);][font="'comic sans ms', cursive;"]FukuLeaks[/color][/font] Link to comment Share on other sites More sharing options...
Phaser Posted August 1, 2013 Author Share Posted August 1, 2013 Hi again I have the code working perfect but have one little problem, as $newarray is created on the fly how do I empty it so it can be re used, currently it is just growing each time, hope that makes sense. After I get to my 20 additions of data I look for the 101 or 0110 get my results with Edanos' script then I want to add the next 20 sets of data and do it all again Link to comment Share on other sites More sharing options...
Edano Posted August 1, 2013 Share Posted August 1, 2013 (edited) #include <Array.au3> Global $array[20]=[0,0,1,1,0,1,0,0,0,1,0,1,0,0,0,0,1,1,0,0] While 1 $string="" $newstring="," For $i=0 To 19 $string&=$array[$i] Next For $i=1 To StringLen($string) $x=StringInStr(StringMid($string,$i,3),"101") If $x>0 And StringInStr($newstring,","&$i&",")=0 Then $newstring&=$i&",";MsgBox(0,"",$i) $y=StringInStr(StringMid($string,$i,4),"0110") If $y>0 Then If StringInStr($newstring,","&$i-1&",")=0 Then $newstring&=$i-1&"," If StringInStr($newstring,","&$i+2&",")=0 Then $newstring&=$i+2&"," EndIf;MsgBox(0,$i-1,$i+2) Next $newarray=StringSplit(StringTrimLeft(StringTrimRight($newstring,1),1),",") _ArrayDisplay($newarray) WEnd . ? or use it in a function . #include <Array.au3> Global $Garray[20]=[0,0,1,1,0,1,0,0,0,1,0,1,0,0,0,0,1,1,0,0] _ArrayDisplay(_Func($Garray)) Func _Func($array) Local $string="" Local $newstring="," For $i=0 To 19 $string&=$array[$i] Next For $i=1 To StringLen($string) Local $x=StringInStr(StringMid($string,$i,3),"101") If $x>0 And StringInStr($newstring,","&$i&",")=0 Then $newstring&=$i&",";MsgBox(0,"",$i) Local $y=StringInStr(StringMid($string,$i,4),"0110") If $y>0 Then If StringInStr($newstring,","&$i-1&",")=0 Then $newstring&=$i-1&"," If StringInStr($newstring,","&$i+2&",")=0 Then $newstring&=$i+2&"," EndIf;MsgBox(0,$i-1,$i+2) Next Return StringSplit(StringTrimLeft(StringTrimRight($newstring,1),1),",") EndFunc Edited August 1, 2013 by Edano [color=rgb(255,0,0);][font="'comic sans ms', cursive;"]FukuLeaks[/color][/font] Link to comment Share on other sites More sharing options...
Phaser Posted August 1, 2013 Author Share Posted August 1, 2013 Yes using that code, after my first set if data I do this Global $array[20]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] Then start adding the next set of data, I then end up with a different set of values within the array so the 101 or 0110's will be in different locations, using your code the $newarray just keeps growing as it still holds the previous set of results. I can't ReDim it as I don't know the size it will be for the next set of data, any ideas Link to comment Share on other sites More sharing options...
Edano Posted August 1, 2013 Share Posted August 1, 2013 Yes using that code, after my first set if data I do this Global $array[20]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] Then start adding the next set of data, I then end up with a different set of values within the array so the 101 or 0110's will be in different locations, using your code the $newarray just keeps growing as it still holds the previous set of results. I can't ReDim it as I don't know the size it will be for the next set of data, any ideas . no, it cannot grow. it is newly created every time by stringsplit(). maybe you should post your code. [color=rgb(255,0,0);][font="'comic sans ms', cursive;"]FukuLeaks[/color][/font] Link to comment Share on other sites More sharing options...
Edano Posted August 1, 2013 Share Posted August 1, 2013 (edited) ah, maybe you forgot to reset $newstring $newstring="," that is the only explanation i can imagine and $string="" as well Edited August 1, 2013 by Edano [color=rgb(255,0,0);][font="'comic sans ms', cursive;"]FukuLeaks[/color][/font] Link to comment Share on other sites More sharing options...
Phaser Posted August 1, 2013 Author Share Posted August 1, 2013 Thanks, I had forgotten to reset $string, so that was getting longer each time, thanks for your help Link to comment Share on other sites More sharing options...
kylomas Posted August 1, 2013 Share Posted August 1, 2013 @Edano The func does not run as posted. Slightly optimized/corrected version. #include <Array.au3> Global $Garray[20]=[0,0,1,1,0,1,0,0,0,1,0,1,0,0,0,0,1,1,0,0] local $aRET = _Func($Garray) _ArrayDisplay($aRET) Func _Func($array) Local $string=_arraytostring($array,'') ; eliminates for loop and length dependency Local $newstring="", $x, $y ; does not need to be initialized with a comma, don't declare vars in a loop For $i=1 To StringLen($string) $x=StringInStr(StringMid($string,$i,3),"101") If $x>0 And StringInStr($newstring,","&$i&",")=0 Then $newstring&=$i&",";MsgBox(0,"",$i) $y=StringInStr(StringMid($string,$i,4),"0110") If $y>0 Then If StringInStr($newstring,","&$i-1&",")=0 Then $newstring&=$i-1&"," If StringInStr($newstring,","&$i+2&",")=0 Then $newstring&=$i+2&"," EndIf;MsgBox(0,$i-1,$i+2) Next Return StringSplit(StringTrimRight($newstring,1),",",2) ; removed stringtrimleft and return with no count at offset 0 EndFunc FWIW - 1 based version expandcollapse popup#include <array.au3> local $tstr = '00110100010100001100' local $aRET = _ret_zero_pos(stringsplit($tstr,'',3)) _arraydisplay($aRET,'Zero Positions') func _ret_zero_pos($array) local $ostr, $idx = 0, $str = _arraytostring($array,'') while stringlen($str) > 2 switch True case stringregexp($str,'0110') stringregexp($str,'0110',1) if @extended > 0 then $idx += @extended $ostr &= $idx - 4 & ',' & $idx - 1 & ',' $str = stringtrimleft($str,@extended) continuecase endif case stringregexp($str,'101') stringregexp($str,'101',1) if @extended > 0 then $idx += @extended $ostr &= $idx - 2 & ',' $str = stringtrimleft($str,@extended) endif case Else ConsoleWrite('string not found' & @LF) exit endswitch wend return stringsplit(stringtrimright($ostr,1),',',3) endfunc @Phaser - I agree with Edano, unless there is some dependency we are unaware of I would have used strings also. kylomas Forum Rules Procedure for posting code "I like pigs. Dogs look up to us. Cats look down on us. Pigs treat us as equals." - Sir Winston Churchill Link to comment Share on other sites More sharing options...
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