Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
127
Task/Ranking-methods/AppleScript/ranking-methods-1.applescript
Normal file
127
Task/Ranking-methods/AppleScript/ranking-methods-1.applescript
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
use AppleScript version "2.3.1" -- Mac OS 10.9 (Mavericks) or later.
|
||||
use sorter : script ¬
|
||||
"Custom Iterative Ternary Merge Sort" -- <www.macscripter.net/t/timsort-and-nigsort/71383/3>
|
||||
|
||||
(* The ranking methods are implemented as script objects sharing inherited code. *)
|
||||
script standardRanking
|
||||
-- Properties and handlers inherited or overridden by the other script objects.
|
||||
-- The 'reference' is to a value that won't exist until 'results' is set to a list.
|
||||
-- 'me' and 'my' pertain to the script object using the code at the time.
|
||||
property results : missing value
|
||||
property startIndex : 1
|
||||
property endIndex : a reference to my results's length
|
||||
property step : 1
|
||||
property currentRank : missing value
|
||||
property currentScore : missing value
|
||||
|
||||
-- Main handler.
|
||||
on resultsFrom(theScores)
|
||||
copy theScores to my results
|
||||
tell sorter to sort(my results, my startIndex, my endIndex, {comparer:me})
|
||||
set my currentScore to my results's item (my startIndex)'s score
|
||||
set my currentRank to my startIndex's contents
|
||||
repeat with i from (my startIndex) to (my endIndex) by (my step)
|
||||
my rankResult(i)
|
||||
end repeat
|
||||
set r to my results
|
||||
set my results to missing value
|
||||
return r
|
||||
end resultsFrom
|
||||
|
||||
-- Comparison handler used by the sort.
|
||||
on isGreater(a, b)
|
||||
if (a's score < b's score) then return true
|
||||
return ((a's score = b's score) and (a's competitor comes after b's competitor))
|
||||
end isGreater
|
||||
|
||||
-- Ranking handler. Inherited by the modifiedRanking script; overridden by the others.
|
||||
on rankResult(i)
|
||||
set thisResult to my results's item i
|
||||
set thisScore to thisResult's score
|
||||
if (thisScore is not currentScore) then
|
||||
set my currentRank to i
|
||||
set my currentScore to thisScore
|
||||
end if
|
||||
set my results's item i to thisResult & {rank:my currentRank}
|
||||
end rankResult
|
||||
end script
|
||||
|
||||
script modifiedRanking
|
||||
property parent : standardRanking
|
||||
property startIndex : a reference to my results's length
|
||||
property endIndex : 1
|
||||
property step : -1
|
||||
end script
|
||||
|
||||
script denseRanking
|
||||
property parent : standardRanking
|
||||
|
||||
on rankResult(i)
|
||||
set thisResult to my results's item i
|
||||
set thisScore to thisResult's score
|
||||
if (thisScore is not my currentScore) then
|
||||
set my currentRank to (my currentRank) + 1
|
||||
set my currentScore to thisScore
|
||||
end if
|
||||
set my results's item i to thisResult & {rank:my currentRank}
|
||||
end rankResult
|
||||
end script
|
||||
|
||||
script ordinalRanking
|
||||
property parent : standardRanking
|
||||
|
||||
on rankResult(i)
|
||||
set my results's item i to (my results's item i) & {rank:i}
|
||||
end rankResult
|
||||
end script
|
||||
|
||||
script fractionalRanking
|
||||
property parent : standardRanking
|
||||
|
||||
on rankResult(i)
|
||||
set thisResult to my results's item i
|
||||
set thisScore to thisResult's score
|
||||
if (thisScore is not my currentScore) then
|
||||
-- The average of any run of consecutive integers is that of the first and last.
|
||||
set average to (i - 1 + (my currentRank)) / 2
|
||||
repeat with j from (my currentRank) to (i - 1)
|
||||
set my results's item j's rank to average
|
||||
end repeat
|
||||
set my currentRank to i
|
||||
set my currentScore to thisScore
|
||||
end if
|
||||
set my results's item i to thisResult & {rank:i as real}
|
||||
end rankResult
|
||||
end script
|
||||
|
||||
-- Task code:
|
||||
on formatRankings(type, theResults)
|
||||
set rankings to {type}
|
||||
repeat with thisResult in theResults
|
||||
set end of rankings to (thisResult's rank as text) & tab & ¬
|
||||
thisResult's competitor & " (" & thisResult's score & ")"
|
||||
end repeat
|
||||
|
||||
return join(rankings, linefeed)
|
||||
end formatRankings
|
||||
|
||||
on join(lst, delim)
|
||||
set astid to AppleScript's text item delimiters
|
||||
set AppleScript's text item delimiters to delim
|
||||
set txt to lst as text
|
||||
set AppleScript's text item delimiters to astid
|
||||
return txt
|
||||
end join
|
||||
|
||||
local theScores, output
|
||||
set theScores to {{score:44, competitor:"Solomon"}, {score:42, competitor:"Jason"}, ¬
|
||||
{score:42, competitor:"Errol"}, {score:41, competitor:"Garry"}, {score:41, competitor:"Bernard"}, ¬
|
||||
{score:41, competitor:"Barry"}, {score:39, competitor:"Stephen"}}
|
||||
set output to {¬
|
||||
formatRankings("Standard ranking:", standardRanking's resultsFrom(theScores)), ¬
|
||||
formatRankings("Modified ranking:", modifiedRanking's resultsFrom(theScores)), ¬
|
||||
formatRankings("Dense ranking:", denseRanking's resultsFrom(theScores)), ¬
|
||||
formatRankings("Ordinal ranking:", ordinalRanking's resultsFrom(theScores)), ¬
|
||||
formatRankings("Fractional ranking:", fractionalRanking's resultsFrom(theScores)) ¬
|
||||
}
|
||||
return join(output, linefeed & linefeed)
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
"Standard ranking:
|
||||
1 Solomon (44)
|
||||
2 Errol (42)
|
||||
2 Jason (42)
|
||||
4 Barry (41)
|
||||
4 Bernard (41)
|
||||
4 Garry (41)
|
||||
7 Stephen (39)
|
||||
|
||||
Modified ranking:
|
||||
1 Solomon (44)
|
||||
3 Errol (42)
|
||||
3 Jason (42)
|
||||
6 Barry (41)
|
||||
6 Bernard (41)
|
||||
6 Garry (41)
|
||||
7 Stephen (39)
|
||||
|
||||
Dense ranking:
|
||||
1 Solomon (44)
|
||||
2 Errol (42)
|
||||
2 Jason (42)
|
||||
3 Barry (41)
|
||||
3 Bernard (41)
|
||||
3 Garry (41)
|
||||
4 Stephen (39)
|
||||
|
||||
Ordinal ranking:
|
||||
1 Solomon (44)
|
||||
2 Errol (42)
|
||||
3 Jason (42)
|
||||
4 Barry (41)
|
||||
5 Bernard (41)
|
||||
6 Garry (41)
|
||||
7 Stephen (39)
|
||||
|
||||
Fractional ranking:
|
||||
1.0 Solomon (44)
|
||||
2.5 Errol (42)
|
||||
2.5 Jason (42)
|
||||
5.0 Barry (41)
|
||||
5.0 Bernard (41)
|
||||
5.0 Garry (41)
|
||||
7.0 Stephen (39)"
|
||||
Loading…
Add table
Add a link
Reference in a new issue