Contents of this directory is archived and no longer updated.

Beginner Division

Summer Scripting Games 2009 Тут очень простое задание из серии фаллометрии :-)

Задача:

  • Показать данные своего процессора (процессоров) в соответствии с рисунком

Решение:

Тут нам потребуется 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 ``
L2 Cache Size:
 $processor.L2CacheSize ``
L2 Cache Speed:
 $processor.L2CacheSpeed ``
L3 Cache Size:
 $processor.L3CacheSize ``
L3 Cache Speed:
 $processor.L3CacheSpeed -ForegroundColor Yellow
Write-Host Strength ... ``
Number of Cores:
 $processor.NumberOfCores ``
Number of Logical Processors:
 $processor.NumberOfLogicalProcessors ``
Name: ````````````
 $processor.Name -ForegroundColor Magenta
Write-Host Agility ... ``
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()

Не скажу, что получилось коротко и идеально, но задачу вполне решает.


Share this article:

Comments:

Comments are closed.