Beginner Division
Тут очень простое задание из серии фаллометрии 
Задача:
- Показать данные своего процессора (процессоров) в соответствии с рисунком
Решение:
Тут нам потребуется WMI класс Win32_Processor. И из него выберем нужные данные. При этом я проверю, что значения не равны $null или нулю. Если это так, то в это поле впишу текст N/A для читабельности. Вот что получилось:
$Host.UI.RawUI.BackgroundColor = "Black"
cls
$processor = gwmi win32_processor | Select AddressWidth, L2CacheSize, L2CacheSpeed, L3CacheSize,
L3CacheSpeed, MaxClockSpeed, Name, NumberOfCores, NumberOfLogicalProcessors
$processor | gm -MemberType NoteProperty | %{
if ($processor.$($_.name) -eq $null -or $processor.$($_.name) -eq 0) {$processor.$($_.name) = "N/A"}
}
Write-Host 'Strength evaluation for LocalHost' -ForegroundColor Green
Write-Host 'Speed ... ' $processor.MaxClockSpeed `
`n'L2 Cache Size:' $processor.L2CacheSize `
`n'L2 Cache Speed:' $processor.L2CacheSpeed `
`n'L3 Cache Size:' $processor.L3CacheSize `
`n'L3 Cache Speed:' $processor.L3CacheSpeed -ForegroundColor Yellow
Write-Host Strength ... `
`n'Number of Cores:' $processor.NumberOfCores `
`n'Number of Logical Processors:' $processor.NumberOfLogicalProcessors `
`n'Name: `t`t`t`t' $processor.Name -ForegroundColor Magenta
Write-Host Agility ... `
`n'Address Width:' $processor.AddressWidth -ForegroundColor Cyan
И вот вывод:
[↓] [vPodans] $processor = gwmi win32_processor | Select AddressWidth, L2CacheSize, L2CacheSpeed, L3CacheSize,
>> L3CacheSpeed, MaxClockSpeed, Name, NumberOfCores, NumberOfLogicalProcessors
>> $processor | gm -MemberType NoteProperty | %{
>> if ($processor.$($_.name) -eq $null -or $processor.$($_.name) -eq 0) {$processor.$($_.name) = "N/A"}
>> }
>> Write-Host 'Strength evaluation for LocalHost' -ForegroundColor Green
>> Write-Host 'Speed ... ' $processor.MaxClockSpeed `
>> `n'L2 Cache Size:' $processor.L2CacheSize `
>> `n'L2 Cache Speed:' $processor.L2CacheSpeed `
>> `n'L3 Cache Size:' $processor.L3CacheSize `
>> `n'L3 Cache Speed:' $processor.L3CacheSpeed -ForegroundColor Yellow
>> Write-Host Strength ... `
>> `n'Number of Cores:' $processor.NumberOfCores `
>> `n'Number of Logical Processors:' $processor.NumberOfLogicalProcessors `
>> `n'Name: $processor.Name -ForegroundColor Magenta
>> Write-Host Agility ... `
>> `n"Address Width: `t`t`t`t" $processor.AddressWidth -ForegroundColor Cyan
>>
Strength evaluation for LocalHost
Speed ... 2834
L2 Cache Size: 6144
L2 Cache Speed: 2000
L3 Cache Size: N/A
L3 Cache Speed: N/A
Strength ...
Number of Cores: 4
Number of Logical Processors: 4
Name: Intel(R) Core(TM)2 Quad CPU Q9550 @ 2.83GHz
Agility ...
Address Width: 64
[↓] [vPodans]
По всей видимости оно получилось как и требовалось.
Advanced Division
И тут нас снова ждут соревнования. Здесь нам потребуется файл LongJump_Adv2.xls из Competitors Pack. Файл содержит данные об участниках прыжков в длину и результаты их 3-х попыток.
Задача:
-
На основании результатов 3-х попыток в колонку Result записать лучший результат из 3-х попыток
-
На основании результатов третей попытки для каждого участника, выбрать лучший результат из них и вывести на экран
-
Сравнить лучший результат из 3-х попыток для каждого участника с их средним результатом в сезоне. Такой графы я не нашёл, есть только лучший результат в сезоне. Вот с ним я и сравнивал. Если прыгун превзошёл свой личный рекорд сезона, то в графу Exceed,Achieve,Under Perform вписать Exceed. Если повторил, то Achieve или Under Perform, если лучший результат сегодня был хуже результата по сезону.
-
Отсортировать всю таблицу по графе Exceed,Achieve,Under Perform именно в таком порядке. Т.е. сперва идут те, кто улучшил свой показатель, потом – кто повторил и в самом конце те, кто не смог повторить свой результат в сезоне. И сохранить в файл с таким же именем.
Решение:
Вася Гусев решил окончательно сломать всем мозг разбором XLS в CSV, обработать его и собрать обратно в CSV – тиснуть сюда. Когда я это увидел – стало как-то не очень хорошо. Я решил работать прямо с XLS. И вот что у меня получилось:
# массив, который будет содержать результаты последней попытки прыжков, на основании
# которых нужно вывести лучший результат
$lastattempt = @()
# создаём COM объект и прочую рутину.
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false
$excel.Workbooks.Open('C:\Users\vPodans\LongJump_Adv2.xls') | Out-Null
# у нас есть известное кол-во участников - 18. 19-я строка - это заголовки.
# поэтому я исходя из этого решил работать с колонкой Result (8-я по счёту). Т.к.
# некоторые попытки были провалены и в таблице стояли крестики. Чтобы вручную не парсить
# это всё, я в ячейку воткнул экселовскую формулу MAX, которая всё за меня сделает.
2..19 | %{$excel.Cells.Item($_,8).Value2 = "=max(e$_`:g$_)"
# заодно в $lastattempt запишем результат последней попытки для текущего прыгуна
$lastattempt += $excel.Cells.Item($_,7).Value2
# сравниваем лучший результат за сегодня с результатом за сезон
if ($excel.Cells.Item($_,8).Value2 -lt $excel.Cells.Item($_,4).Value2) {
# и в соответствующую графу пишем результат
$excel.Cells.Item($_,9).Value2 = "Under Perform"
# вот тут пришлось использовать читы. Я не очень силён в custom sort в экселе, поэтому
# рядышком я для каждого статуса Exceed/Achieve/.. я приписываю число. Вот по этому числу
# я потом буду сортировать таблицу
$excel.Cells.Item($_,10).Value2 = "3"
} elseif ($excel.Cells.Item($_,8).Value2 -eq $excel.Cells.Item($_,4).Value2) {
$excel.Cells.Item($_,9).Value2 = "Achieve"
$excel.Cells.Item($_,10).Value2 = "2"
} else {
$excel.Cells.Item($_,9).Value2 = "Exceed"
$excel.Cells.Item($_,10).Value2 = "1"
}
}
# выбираем из LastAttempt лучший результат, попутно заменяя крестики на нолики (лол) и выводя лучший результат
$lastattempt | %{if ($_ -eq "x") {$_ = 0};$_} | sort | select -last 1
# выбираем диапазон изменения таблицы при сортировке. Заголовки не трогаем, поэтому начинаем с 2
$selection = $excel.Range("a2:j19")
# указываем колонку, по которой будем сортировать
$range = $excel.Range("j2:j19")
# сортируем
[void]$selection.Sort($range,"1")
# удаляем читерские числа, которые использовались для сортировки.
2..19 | %{$excel.Cells.Item($_,10).Value2 = ""}
# готово.
$excel.Save()
$excel.Quit()
Не скажу, что получилось коротко и идеально, но задачу вполне решает.