• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: The Case of the Missing Case Statement
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


  • Follow-Ups:
    • Re: The Case of the Missing Case Statement
      • From: "S. J. Cunningham" <email@hidden>
References: 
 >The Case of the Missing Case Statement (From: "S. J. Cunningham" <email@hidden>)
 >Re: The Case of the Missing Case Statement (From: email@hidden)

  • Prev by Date: Re: The Case of the Missing Case Statement
  • Next by Date: Re: The Case of the Missing Case Statement
  • Previous by thread: Re: The Case of the Missing Case Statement
  • Next by thread: Re: The Case of the Missing Case Statement
  • Index(es):
    • Date
    • Thread