Re: The Case of the Missing Case Statement
Re: The Case of the Missing Case Statement
- Subject: Re: The Case of the Missing Case Statement
- From: email@hidden
- Date: Sun, 05 Apr 2015 07:44:25 +0200
Jon Pugh is of course totally right. My first attempt was to make the code readable, then if you have anything special for your “segments” of use-cases, then you just comment the segments, within the nested if test.
-- More like a case, since now, omitting an exit repat will
-- work like omitting a break, allowing you to adjust the value,
-- so you can jump through more conditions, like a case statement works in most
-- languages, except for java I believe
on jumpTableFor1by13(n)
repeat
if n = 1 then
return 1
else if n = 2 then
return 2
else if n = 3 then
return 3
else if n = 4 then
say "OMG"
set n to 5
else if n = 5 then
return 5
else if n = 6 then
return 6
else if n = 7 then
return 7
else if n = 8 then
return 8
else if n = 9 then
return 9
else if n = 10 then
return 10
else if n = 11 then
return 11
else if n = 12 then
return 12
else if n = 13 then
return 13
else
return -1
end if
end repeat
end jumpTableFor1by13
5. apr. 2015 kl. 07:34 skrev email@hidden:
> on jumpTableFor1by13(n)
> if n = 1 then
> return 1
> else if n = 2 then
> return 2
> else if n = 3 then
> return 3
> else if n = 4 then
> return 4
> else if n = 5 then
> return 5
> else if n = 6 then
> return 6
> else if n = 7 then
> return 7
> else if n = 8 then
> return 8
> else if n = 9 then
> return 9
> else if n = 10 then
> return 10
> else if n = 11 then
> return 11
> else if n = 12 then
> return 12
> else if n = 13 then
> return 13
> else
> return -1
> end if
> end jumpTableFor1by13
> 5. apr. 2015 kl. 00:15 skrev S. J. Cunningham <email@hidden>:
>
>> I have a need to compare n different things and take a different branch for each one. A great application for the imaginary Applescript "case" statement :) Does anyone have a clever way to do this other than a brute force bunch of if-then statements?
>>
>> I figured that, on the average, I would be executing n/2 if-then tests for each iteration. In my case n is currently 13 so figure 6.5 tests. I decided to get clever and speed things up by doing the equivalent of a binary search, ie dividing the cases in half at each branch, thus reducing the number of tests to log base 2 of n, in my case, log base 2 of 13 or about 3.7. I expected this to perform significantly faster: 3.7 tests on average rather than 6.5.
>>
>> I wrote the attached script to test out my theory and was surprised by the results:
>>
>> Case Statement Test Results for 80,000 Tests
>> (in Seconds)
>>
>> straight IF If-ElseTree Binary Search IF
>> Run 1 37 49 58
>> Run 2 51 47 40
>> Run 3 39 40 44
>> Run 4 44 44 43
>> Run 5 44 42 41
>> Average 43.0 44.4 45.2
>>
>> Not only was there not much difference but the Binary Search did marginally worse.
>>
>> I would be curious to hear any explanations as to why this might be so.
>>
>> ------------- Attached Script --------------------------
>>
>> set nTests to 80000
>> set nRuns to 5
>> set savetoFile to true
>> set displayResults to true
>> set saveResultsFileName to "Case Statement Test Results.txt"
>> set resultsText to "Case Statement Test Results for " & nTests & " Tests" & return & " (in Seconds)" & ¬
>> return & return & tab & "straightIF" & tab & "IfElseTree" & tab & "BinarySearchIF" & return
>> set straightIFtimes to {}
>> set IfElseTreetimes to {}
>> set BinarySearchIFtimes to {}
>> set fatTab to " "
>>
>>
>> repeat with nRun from 1 to nRuns
>>
>> set startTime to current date
>> repeat nTests times
>> set theResult to StraightIF(random number from 1 to 13)
>> (*
>> if theResult > 0 then
>> display dialog "Case " & theResult
>> else
>> display dialog "Error. " & (n as text) & " is out of range"
>> end if
>> *)
>> end repeat
>> set endTime to current date
>> set straightIFtime to endTime - startTime
>> -- display dialog "StraightIF time for " & nTests & " tests" & tab & straightIFtime & " seconds"
>> set the end of straightIFtimes to straightIFtime
>>
>>
>> set startTime to current date
>> repeat nTests times
>> set theResult to IfElseTree(random number from 1 to 13)
>> (*
>> if theResult > 0 then
>> display dialog "Case " & theResult
>> else
>> display dialog "Error. " & (n as text) & " is out of range"
>> end if
>> *)
>> end repeat
>> set endTime to current date
>> set IfElseTreetime to endTime - startTime
>> -- display dialog "IfElseTree time for " & nTests & " tests" & tab & IfElseTreetime & " seconds"
>> set the end of IfElseTreetimes to IfElseTreetime
>>
>>
>> set startTime to current date
>> repeat nTests times
>> set theResult to BinarySearchIF(random number from 1 to 13)
>> (*
>> if theResult > 0 then
>> display dialog "Case " & theResult
>> else
>> display dialog "Error. " & (n as text) & " is out of range"
>> end if
>> *)
>> end repeat
>> set endTime to current date
>> set BinarySearchIFtime to endTime - startTime
>> -- display dialog "BinarySearchIF time for " & nTests & " tests" & tab & BinarySearchIFtime & " seconds"
>> set the end of BinarySearchIFtimes to BinarySearchIFtime
>>
>> (*
>> display dialog "Times for " & nTests & " tests:" & return & return & ¬
>> "StraightIF" & tab & straightIFtime & " seconds" & return & ¬
>> "IfElseTree" & tab & IfElseTreetime & " seconds" & return & ¬
>> "BinarySearchIF" & tab & BinarySearchIFtime & " seconds" & return
>> *)
>>
>> set resultsText to resultsText & "Run " & nRun & fatTab & straightIFtime & fatTab & fatTab & IfElseTreetime & fatTab & fatTab & BinarySearchIFtime & return
>> end repeat
>>
>> set StraightIFAverage to averageOf(straightIFtimes)
>> set IfElseTreeAverage to averageOf(IfElseTreetimes)
>> set BinarySearchIFAverage to averageOf(BinarySearchIFtimes)
>> set resultsText to resultsText & "Average " & fatTab & StraightIFAverage & fatTab & fatTab & IfElseTreeAverage & fatTab & fatTab & BinarySearchIFAverage
>>
>> if displayResults then
>> display dialog resultsText
>> end if
>>
>> if savetoFile then
>> tell application "Finder"
>> set hfsParentFolderPath to get container of (path to me)
>> set myFolderPath to (contents of hfsParentFolderPath) as text
>> end tell
>> set fID to open for access myFolderPath & saveResultsFileName with write permission
>> write resultsText to fID
>> close access fID
>> end if
>>
>>
>>
>>
>> on averageOf(aList)
>> set theSum to 0
>> repeat with n in aList
>> set theSum to theSum + n
>> end repeat
>> set theAverage to theSum / (count of aList)
>> return theAverage
>> end averageOf
>>
>>
>> on IfElseTree(n)
>> if n = 1 then
>> return 1
>> else
>> if n = 2 then
>> return 2
>> else
>> if n = 3 then
>> return 3
>> else
>> if n = 4 then
>> return 4
>> else
>> if n = 5 then
>> return 5
>> else
>> if n = 6 then
>> return 6
>> else
>> if n = 7 then
>> return 7
>> else
>> if n = 8 then
>> return 8
>> else
>> if n = 9 then
>> return 9
>> else
>> if n = 10 then
>> return 10
>> else
>> if n = 11 then
>> return 11
>> else
>> if n = 12 then
>> return 12
>> else
>> if n = 13 then
>> return 13
>> else
>> return -1
>> end if
>> end if
>> end if
>> end if
>> end if
>> end if
>> end if
>> end if
>> end if
>> end if
>> end if
>> end if
>> end if
>> end IfElseTree
>>
>> on StraightIF(n)
>> if n = 1 then return 1
>> if n = 2 then return 2
>> if n = 3 then return 3
>> if n = 4 then return 4
>> if n = 5 then return 5
>> if n = 6 then return 6
>> if n = 7 then return 7
>> if n = 8 then return 8
>> if n = 9 then return 9
>> if n = 10 then return 10
>> if n = 11 then return 11
>> if n = 12 then return 12
>> if n = 13 then return 13
>> if n > 13 then return -1
>> end StraightIF
>>
>>
>> on BinarySearchIF(n)
>> if n < 6 then -- 1-6
>> if n < 4 then -- 1-3
>> if n = 1 then
>> return 1
>> else
>> if n = 2 then
>> return 2
>> else
>> return 3
>> end if
>> end if
>> else -- 4-6
>> if n = 4 then
>> return 4
>> else
>> if n = 5 then
>> return 5
>> else
>> return 6
>> end if
>> end if
>> end if
>> else -- 7-13
>> if n < 10 then -- 7-9
>> if n = 7 then
>> return 7
>> else
>> if n = 8 then
>> return 8
>> else
>> return 9
>> end if
>> end if
>> else -- 10-13
>> if n < 12 then --10 or 11
>> if n = 10 then
>> return 10
>> else
>> return 11
>> end if
>> else -- 12 or 13
>> if n = 12 then
>> return 12
>> else
>> if n = 13 then
>> return 13
>> else
>> return -1
>> end if
>> end if
>> end if
>> end if
>> end if
>> end BinarySearchIF
>> _______________________________________________
>> Do not post admin requests to the list. They will be ignored.
>> AppleScript-Users mailing list (email@hidden)
>> Help/Unsubscribe/Update your Subscription:
>> Archives: http://lists.apple.com/archives/applescript-users
>>
>> This email sent to email@hidden
>
_______________________________________________
Do not post admin requests to the list. They will be ignored.
AppleScript-Users mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
Archives: http://lists.apple.com/archives/applescript-users
This email sent to email@hidden