Scripting Games: Advanced PowerShell — Event 3

sg3

В этой задачке пришлось расчитывать результаты «Instant runoff» выборов. Решение опять далеко не красивое, хоть и работает 🙂

 

sg3-Votes.ps1

# Помещаем содержимое файла в массив $Votes $Votes = Get-Content "c:scriptsvotes.txt" # Начинаем цикл и продолжаем до тех пор пока не определится победитель. # См. while. do { $Results = $Votes | # Каждую строчку из $Votes... foreach { # Разделяем в массив по запятым $_ -split "," | # Выбираем первый элемент этого массива (первый столбец) select -First 1 } | # Группируем... group | # Выбирем из каждой группы столбцы с названием группы (именем кандидата) и # count (количество элементов в группе. select name, count | # Сортируем по количеству элементов, в обратном порядке. sort count -desc # Вычисляем проигравшего ($Looser) взяв последний элемент массива $Results $Looser = $Results[-1].Name # Убираем из переменной $Votes все упоминания о проигравшем - в дальнейших # этапах выборов он уже не участвует. $Votes = $Votes -replace "$Looser," -replace ",$Looser$" # Проверяем набрал ли победитель больше 50% и если не набрал - проводим # очередной этап. } while ($Results[0].count -le ($Results[1..($Results.count-1)] | Measure-Object count -sum).sum) # Присваиваем переменной $Winner имя победителя. $Winner = $Results[0].name # Вычисляем итоговый результат победителя. $Score = $Results[0].Count / (($Results[0].Count + $Results[1].Count) / 100) # Пишем на экран. Write-Host "The winner is $Winner with $Score% of the vote."

И другие варианты: Mow (красота… 🙂 ), Per ØstergaardScripting Guys, Don Jones.

PS: А еще сегодня, в 19 по Москве, будет очень интересный вебкаст Using Virtual Machine Manager and Windows PowerShell to Deploy HP Windows Server 2008 Academy Labs (Level 300).

PPS: Сорри за дезу, вебкаст завтра… 🙂

Реклама
Опубликовано в Learn, PowerShell, Scripting, Scripting Games. Комментарии к записи Scripting Games: Advanced PowerShell — Event 3 отключены

Вебкаст про изменения в стеке TCP/IP в Windows 2008

Буквально через час (с копейками 🙂 ) начнётся вебкаст Андрея Бешкова про нововведения в стеке TCP/IP в Windows Server 2008. Очень рекомендую послушать, изменений там множество — стек был практически полностью переписан. Кроме того сам Андрей — весьма авторитетная личность: в своё время он написал множество статей по BSD, которая как известно славится своими сетевыми возможностями. Вопросы докладчику приветствуются 🙂

Опубликовано в Vista, Windows 2008. Комментарии к записи Вебкаст про изменения в стеке TCP/IP в Windows 2008 отключены

Scripting Games: Advanced PowerShell — Event 2

Очередной скрипт с Scripting Games. Задачка Skating on Thin Ice:

 

# Читаем содержимое файла skaters.txt $Table = Get-Content "c:scriptsskaters.txt" | # Для каждой строки... foreach { # ... создаем массив $Arr из строчки разделив её по запятым $Arr = $_ -split "," # Имя скейтера (первый элемент массива) помещаем в переменную $Name $Name = $Arr[0] # Очки (элементы массива начиная со второго) помещаем в переменную $Scores # предварительно отсортировав. $Scores = $Arr[1..($Arr.Count-1)] | Sort # Теперь убираем самый низки и самый высокий результаты (просто оставив в # массиве $Scores элементы начиная со второго по предпоследний $Scores = $Scores[1..($Scores.count-2)] # Вычисляем средний результат поделив сумму элементов на их количество. $FinalScore = ($Scores | Measure-Object -sum).Sum / $Scores.Count # Создаем новый объект $obj = New-Object "PSObject" # Добавляем к нему свойства Name и Score $obj | Add-Member -MemberType "NoteProperty" -Name "Name" -Value $Name $obj | Add-Member -MemberType "NoteProperty" -Name "Score" -Value $FinalScore # Отправляем объект дальше по конвейеру $obj # Сортируем полученный массив объектов по свойству Score в обратном порядке } | Sort-Object Score -Descending # В результате все объекты помещаются в переменную $Table (см. первую строчку) # Создаем массив медалей $Medals="Gold medal", "Silver medal", "Bronze medal" # Объявляем глобальную переменную $i (глобальную потому что будем её изменять # внутри других скриптблоков. Не очень красиво, но в момент написания скрипта # придумалось именно так 🙂 $global:i=0 # Берем первые 3 элемента массива... $Table[0..2]| # Добавляем новое свойство Medal и оставляем уже имеющиеся Name и Score select @{n="Medal";e={$global:i++;$medals[$i-1]}}, Name, Score | # Показываем результат... Out-GridView

Скрипт получился очень некрасивым, особенно вторая часть 🙂 Всё от того что Out-GridView я решил приделать в последний момент 🙂 Кстати, командлет Out-GridView и операторы -Split и -Join, которые встречаются во многих моих скриптах для Scripting Games, это прелести PowerShell 2.0 🙂

PS: Постараюсь выкладывать минимум по одному скрипту с SG в рабочий день, или чаще если получится 🙂

UPD: Забыл дописать другие решения: Mow, Per Østergaard, Scripting Guys и Ben Pearce. Очень рекомендую посмотреть решение Mow‘а 🙂