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‘а🙂

комментариев 6 to “Scripting Games: Advanced PowerShell — Event 2”

  1. komatozo Says:

    Что значит — человек умеет писать… у меня на 8 строк больше, не так элегантно и без всяких объявлений новых объектов… Но работает, а это уже не мало =)

  2. Xaegr Says:

    2 komatozo: Ха. У меня тоже далееееко не верх красоты🙂
    И кстати, не в строках счастье🙂 Вот еще бывает такая манера написания — http://www.microsoft.com/technet/scriptcenter/funzone/games/solutions08/expssol05.mspx🙂

  3. Xaegr Says:

    Вот, как надо — http://thepowershellguy.com/blogs/posh/archive/2008/02/20/advanced-windows-powershell-event-2.aspx🙂
    Кстати дописал в пост ссылки на другие решения.

  4. komatozo Says:

    Вот та манера написания — маньяк писало… а вот последний вариант очень даже да… Все-таки есть куда оптимизироваться… =)

  5. Mc'key Says:

    Мое решение:
    gc C:\Scripts\skaters.txt | % {$Temp=$_.Split(«,»);$Skaters[$Temp[0]]=($Temp[1..6] | Sort)[1..5]}
    $Skaters.GetEnumerator() | % {$Sum=0;$_.Value | % {$Sum+=$_};$Skaters[$_.Key]=$Sum/5}
    $MedalSkater = ($Skaters.GetEnumerator() | Sort Value -Descending)[0..2]
    «Gold medal: «+$MedalSkater[0].Name+», «+$MedalSkater[0].Value
    «Silver medal: «+$MedalSkater[1].Name+», «+$MedalSkater[1].Value
    «Bronze medal: «+$MedalSkater[2].Name+», «+$MedalSkater[2].Value

    Про такие селекты как у MOW-а, я если честно не знал (теперь буду)… и про measure-object тоже…
    В моем решение мне не нравиться .GetEnumerator() — в нем он выглядит как-будто не из той оперы…

  6. Xaegr Says:

    Ну почему же, GetEnumerator постоянно приходится с хэш массивами использовать. Это нормальный .Net метод🙂

    ЗЫ: Вот же у меня ужасный скрипт получился по сравнению с красивыми🙂 Лень было возиться — работает и черт с ним🙂


Обсуждение закрыто.

%d такие блоггеры, как: