143 lines
3.5 KiB
Plaintext
143 lines
3.5 KiB
Plaintext
function Get-Ranking
|
|
{
|
|
[CmdletBinding(DefaultParameterSetName="Standard")]
|
|
[OutputType([PSCustomObject])]
|
|
Param
|
|
(
|
|
[Parameter(Mandatory=$true,
|
|
ValueFromPipeline=$true,
|
|
ValueFromPipelineByPropertyName=$true,
|
|
Position=0)]
|
|
[string]
|
|
$InputObject,
|
|
|
|
[Parameter(Mandatory=$false,
|
|
ParameterSetName="Standard")]
|
|
[switch]
|
|
$Standard,
|
|
|
|
[Parameter(Mandatory=$false,
|
|
ParameterSetName="Modified")]
|
|
[switch]
|
|
$Modified,
|
|
|
|
[Parameter(Mandatory=$false,
|
|
ParameterSetName="Dense")]
|
|
[switch]
|
|
$Dense,
|
|
|
|
[Parameter(Mandatory=$false,
|
|
ParameterSetName="Ordinal")]
|
|
[switch]
|
|
$Ordinal,
|
|
|
|
[Parameter(Mandatory=$false,
|
|
ParameterSetName="Fractional")]
|
|
[switch]
|
|
$Fractional
|
|
)
|
|
|
|
Begin
|
|
{
|
|
function Get-OrdinalRank ([PSCustomObject[]]$Values)
|
|
{
|
|
for ($i = 0; $i -lt $Values.Count; $i++)
|
|
{
|
|
$Values[$i].Rank = $i + 1
|
|
}
|
|
|
|
$Values
|
|
}
|
|
|
|
function Get-Rank ([PSCustomObject[]]$Scores)
|
|
{
|
|
foreach ($score in $Scores)
|
|
{
|
|
$score.Group | ForEach-Object {$_.Rank = $score.Rank}
|
|
}
|
|
|
|
$Scores.Group
|
|
}
|
|
|
|
function New-Competitor ([string]$Name, [int]$Score, [int]$Rank = 0)
|
|
{
|
|
[PSCustomObject]@{
|
|
Name = $Name
|
|
Score = $Score
|
|
Rank = $Rank
|
|
}
|
|
}
|
|
|
|
$competitors = @()
|
|
$scores = @()
|
|
}
|
|
Process
|
|
{
|
|
@($input) | ForEach-Object {$competitors += New-Competitor -Name $_.Split()[1] -Score $_.Split()[0]}
|
|
}
|
|
End
|
|
{
|
|
$scores = $competitors |
|
|
Sort-Object -Property Score -Descending |
|
|
Group-Object -Property Score |
|
|
Select-Object -Property @{Name="Score"; Expression={[int]$_.Name}}, @{Name="Rank"; Expression={0}}, Count, Group
|
|
|
|
switch ($PSCmdlet.ParameterSetName)
|
|
{
|
|
"Standard"
|
|
{
|
|
$rank = 1
|
|
|
|
for ($i = 0; $i -lt $scores.Count; $i++)
|
|
{
|
|
$scores[$i].Rank = $rank
|
|
$rank += $scores[$i].Count
|
|
}
|
|
|
|
Get-Rank $scores
|
|
}
|
|
"Modified"
|
|
{
|
|
$rank = 0
|
|
|
|
foreach ($score in $scores)
|
|
{
|
|
$rank = $score.Count + $rank
|
|
$score.Rank = $rank
|
|
}
|
|
|
|
Get-Rank $scores
|
|
}
|
|
"Dense"
|
|
{
|
|
for ($i = 0; $i -lt $scores.Count; $i++)
|
|
{
|
|
$scores[$i].Rank = $i + 1
|
|
}
|
|
|
|
Get-Rank $scores
|
|
}
|
|
"Ordinal"
|
|
{
|
|
Get-OrdinalRank $competitors
|
|
}
|
|
"Fractional"
|
|
{
|
|
Get-OrdinalRank $competitors | Group-Object -Property Score | ForEach-Object {
|
|
if ($_.Count -gt 1)
|
|
{
|
|
$rank = ($_.Group.Rank | Measure-Object -Average).Average
|
|
|
|
foreach ($competitor in $_.Group)
|
|
{
|
|
$competitor.Rank = $rank
|
|
}
|
|
}
|
|
}
|
|
|
|
$competitors
|
|
}
|
|
}
|
|
}
|
|
}
|