Scripting Games 2009 еще не начались, но первые вопросы уже публикуются. Учитывая что на этот раз соревнования “кто решит раньше не подглядывая” нет, то можно публиковать и решения. Это сделано из за того основной смысл этих игр не победа, а участие
Ведь главное получить удовольствие и научиться чему то новому. И если вы позаимствуете красивый элемент у другого участника – это только к лучшему
Итак, мои решения первых задачек из категории Advanced
Первое задание на удивление простое… Даже неинтересно
Получаем содержимое файла, отбираем непустые строки, сортируем по длинне, показываем первые 3:
gc '.\Personal Information Cards_ADV1.txt' | where {$_.trim()} | sort length | select -first 3
Тут всё было гораздо сложнее… Так как в MS Office уже на протяжении многих версий существует досадная бага, сильно осложняющая использование Excel из скриптов, я решил поступить проще: сконвертировать .xls файл в csv, обработать данные, и сконвертировать результат обратно в xls. В процессе столкнулся еще с некоторыми проблемами, но успешно их преодолел
#Предполагается что файлы находятся в каталоге c:\scripts, и текущим каталогом PowerShell является он же. cd c:\scripts #Конвертируем xls в удобный csv $excel = New-Object -com excel.application $book = $excel.Workbooks.Open("c:\scripts\LongJump_Adv2.xls") $book.SaveAs("c:\scripts\LongJump_Adv2.csv",6) $excel.DisplayAlerts = $false $excel.quit() #Импортируем данные из csv $data = Import-Csv .\LongJump_Adv2.csv -delim ";" #Обрабатываем данные... foreach ($i in $data){ #Вычисляем лучший результат за последнюю встречу... #Так как в русской локали разделителем десятичных знаков служит точка, а в файле запятая - мне пришлось использовать -replace $i.result = $i."Jump 1",$i."Jump 2",$i."Jump 3" -replace 'x','0' -replace ',','.' | sort {[int]$_} | select -last 1 #Так как упомянутое в задании season average score в файле отсутствует, #я решил сравнить результат в стречи с Personal Best switch ([int]$i.result) { #Обратите внимание, в имени свойства 'Exceed/Achieve/Under Perform ' в конце затесался пробел... #Мне пришлось немало повозиться прежде чем я это заметил{$_ -eq ($i."Personal Best" -replace ',','.')} {$i.'Exceed/Achieve/Under Perform ' = "Achieve"} {$_ -lt ($i."Personal Best" -replace ',','.')} {$i.'Exceed/Achieve/Under Perform ' = "Under Perform"} {$_ -gt ($i."Personal Best" -replace ',','.')} {$i.'Exceed/Achieve/Under Perform ' = "Exceed"} } #Меняем точку на запятую, чтобы не отличалось от остальных столбцов в файле. $i.result = $i.result -replace '\.',',' } #Выводим лучшего участника по результатам последней встречи $data | sort lastmeetbest | select -last 1 #Сортируем по 'Exceed/Achieve/Under Perform ' $data = $data | sort 'Exceed/Achieve/Under Perform ' #и выводим результат в Csv файл. $data | Export-Csv "LongJump_Adv2_Final.csv" -Delimiter ';' -NoTypeInformation #Конвертируем csv в требуемый xls $excel = New-Object -com excel.application $book = $excel.WorkbookS.Open("c:\scripts\LongJump_Adv2_Final.csv") $book.SaveAs("c:\scripts\LongJump_Adv2_Final.xls",1) $excel.DisplayAlerts = $false $excel.quit()
Подозреваю что даже если бы я работал напрямую в Excel, используя workaround для этой баги, то всё равно получилось бы короче и красивее
Третья задачка была гораздо легче, и приятнее
С помощью моих любимых регулярных выражений, я решил её минут за 5
gc .\Wordlist_ADV3.txt | ?{$_ -replace '[^AEIOUWY]' -match '^(.)\1*$'}
Присоединяйтесь!
Узнать как постить свои скрипты на конкурс можно тут (правда механизм в настоящее время не работает, но ведутся работы над починкой
)









11.6.2009 в 8:57
[...] XLS в CSV, обработать его и собрать обратно в CSV – тиснуть сюда. Когда я это увидел – стало как-то не очень хорошо. Я [...]
11.6.2009 в 10:05
[...] XLS в CSV, обработать его и собрать обратно в CSV – тиснуть сюда. Когда я это увидел – стало как-то не очень хорошо. Я [...]
15.6.2009 в 10:46
[...] Drawing, Form, Image, Parsing, Regular Exspressions, Scripting Games 2009 — Xaegr @ 10:45 Продолжаю публиковать свои решения задачек Scripting Games из [...]