counting runs
Dick Kriesel
dick.kriesel at mail.com
Mon Oct 31 21:09:12 EST 2005
On 10/31/05 4:22 PM, "Jason Tangen" <j.tangen at unsw.edu.au> wrote:
> Hello,
>
> I'm trying to solve a seemingly simple problem and I could use some
> help. A coin flip will come out "Heads" or "Tails" and will produce,
> for example, the following series for 20 flips:
>
> T,T,H,T,T,H,H,H,T,T,H,T,H,H,H,T,H,T,H,T
>
> I need to count up the number events for a particular run. For example,
>
> Heads x 3 = 2
> Heads x 2 = 0
> Heads x 1 = 4
> Tails x 1 = 4
> Tails x 2 = 3
> Tails x 3 = 0
>
> I need to account for runs up to 60 (rather than 3 above) for
> hundreds of flips (rather than 20 above).
>
> I've been using a very clumsy multiple if-then solution to date, but
> this quickly becomes difficult with many runs.
>
> Can someone point me in the right direction?
>
> Cheers,
> Jason
Here's yet another solution. At the core, it uses an array like Alex's
solution, but with slightly fewer instructions. So all it really adds to
suggestions already posted is a technique for reporting results as the
original example suggests: runs of heads first sorted by descending run
length, followed by runs of tails sorted by ascending run length, with no
run lengths missing.
-- Dick
post script:
local sArray,sChar,sCount,sMax
on mouseUp
ask "enter a comma-delimited sequence of H's and T's" \
with "T,T,H,T,T,H,H,H,T,T,H,T,H,H,H,T,H,T,H,T"
recordFlips it
putResults
end mouseUp
on recordFlips pSequence
put "" into sArray
put char 1 of pSequence into sChar
put 0 into sCount
put 0 into sMax
repeat for each item tChar in pSequence
recordFlip tChar
end repeat
add 1 to sArray[sChar,sCount]
end recordFlips
on recordFlip pChar
if pChar = sChar then
add 1 to sCount
if sCount > sMax then
put sCount into sMax
end if
else
add 1 to sArray[sChar,sCount]
put pChar into sChar
put 1 into sCount
end if
end recordFlip
on putResults
-- note: fill in any missing runs
put the keys of sArray into tKeys
repeat with i = 1 to sMax
if sArray["H",i] is empty then put 0 into sArray["H",i]
if sArray["T",i] is empty then put 0 into sArray["T",i]
end repeat
-- note: sort runs of heads descending, then runs of tails ascending
put the keys of sArray into tKeys
sort tKeys numeric descending by sortKey(each)
-- note: put the results
put ""
repeat for each line tKey in tKeys
put item 1 of tKey && "x" && item 2 of tKey & ":" && sArray[tKey] & cr
after msg
end repeat
end putResults
function sortKey pKey
if item 1 of pKey is "H" then put item 2 of pKey into tSortKey
else put 0 - item 2 of pKey into tSortKey
return tSortKey
end sortKey
More information about the use-livecode
mailing list