Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus / 2013-03

some number manipulation

5 messages · 3 people ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

appjaws

Hi all,
I have a series of results, for each day of the month I have 10 numbers ranging from 1 to 20. i.e.
Day1 1,3,4,5,7,9,12,16,17,20
Day2 3,4,5,6,8,9,15,17,18,19
etc.

Question 1 how can I find the number of 1's 2's 3's 4's etc. for the whole month series?

Question 2 How can I test for 3 or more consecutive numbers in each day?

Hope this is clear, any guidance will be most appreciated. Paul

---This message has been sent using Thunderbird on kubuntu---

Reply by email

Howard Page-Clark
to appjaws
appjaws wrote 11 lines
Hi all, I have a series of results, for each day of the month I have 10 numbers ranging from 1 to 20. i.e. Day1 1,3,4,5,7,9,12,16,17,20 Day2 3,4,5,6,8,9,15,17,18,19 etc. Question 1 how can I find the number of 1's 2's 3's 4's etc. for the whole month series? Question 2 How can I test for 3 or more consecutive numbers in each day?

Q1 for such a small dataset a brute force approach of iterating over all values and counting each occurrence of 1, 2, 3 etc. in 20 distinct counters seems best.

Q2 Your data is ordered by value, so a function along these lines ought to work:

type
   TNumber = 1..20;
   TDayData = array[1..10] of TNumber;
function ThreeOrMoreConsecutiveNos(dd: TDayData): boolean;
var i: integer=1;
begin
  Result:= False;
  while i <=8 do
   begin
     if ( dd[i]=Pred(dd[i+1]) )
      and ( dd[i+1]=Pred(dd[i+2]) )
     then Exit(True);
     Inc(i);
   end;
end;

Reply by email

appjaws
to Howard Page-Clark
Howard Page-Clark wrote 36 lines
On 09/03/13 11:12, appjaws wrote: > Hi all, > I have a series of results, for each day of the month I have 10 numbers > ranging from 1 to 20. i.e. > Day1 1,3,4,5,7,9,12,16,17,20 > Day2 3,4,5,6,8,9,15,17,18,19 > etc. > > Question 1 how can I find the number of 1's 2's 3's 4's etc. for the > whole month series? > > Question 2 How can I test for 3 or more consecutive numbers in each day? Q1 for such a small dataset a brute force approach of iterating over all values and counting each occurrence of 1, 2, 3 etc. in 20 distinct counters seems best. Q2 Your data is ordered by value, so a function along these lines ought to work: type TNumber = 1..20; TDayData = array[1..10] of TNumber; function ThreeOrMoreConsecutiveNos(dd: TDayData): boolean; var i: integer=1; begin Result:= False; while i <=8 do begin if ( dd[i]=Pred(dd[i+1]) ) and ( dd[i+1]=Pred(dd[i+2]) ) then Exit(True); Inc(i); end; end;

Thank you Howard,
I just realised that I need to sort the numbers because they are not like my example above. So where and how would I sort the array for each Day and then call ThreeOrMore?

I'm still learning and really appreciate your help Paul

---This message has been sent using Thunderbird on kubuntu---

Reply by email

Howard Page-Clark
to appjaws
appjaws wrote
>> I have a series of results, for each day of the month I have 10 numbers >> ranging from 1 to 20. i.e. >> Day1 1,3,4,5,7,9,12,16,17,20 >> Day2 3,4,5,6,8,9,15,17,18,19

...

I just realised that I need to sort the numbers because they are not like my example above. So where and how would I sort the array for each Day and then call ThreeOrMore?

If you have any programming books you'll almost certainly find they include a chapter on sorting algorithms (bubble sort, quicksort etc.). One FPC/Lazarus tutorial implementation is at
http://www.pp4s.co.uk/main/tu-ss-sort-quick-demo1a.html and Lazarus also has several integer quicksort implementations in its own code such as at ...\lazarus\lcl\grids.pas, line 2850

Howard

Reply by email

Curt Carpenter
to Howard Page-Clark

I would create a matrix A[i,j] with i = 1,2,3,...31 (31 rows) and j=1,2,3,...20 (20 columns).
Initialize the matrix to all zeroes.
Then for each day of the month, if the number "k" occurs in day j, then set A[j,k] := 1.
At the end of the month, the sum of the elements in row k will tell you how many times k occurred during the month.
Then scan each row of the matrix looking for three or more consecutive 1's (left as an exercise :-)

Howard Page-Clark wrote 28 lines
On 09/03/13 3:06, appjaws wrote: >>> I have a series of results, for each day of the month I have 10 >>> numbers >>> ranging from 1 to 20. i.e. >>> Day1 1,3,4,5,7,9,12,16,17,20 >>> Day2 3,4,5,6,8,9,15,17,18,19 ... > I just realised that I need to sort the numbers because they are not > like my example above. So where and how would I sort the array for each > Day and then call ThreeOrMore? If you have any programming books you'll almost certainly find they include a chapter on sorting algorithms (bubble sort, quicksort etc.). One FPC/Lazarus tutorial implementation is at http://www.pp4s.co.uk/main/tu-ss-sort-quick-demo1a.html and Lazarus also has several integer quicksort implementations in its own code such as at ...\lazarus\lcl\grids.pas, line 2850 Howard -- _______________________________________________ Lazarus mailing list http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply by email