Scripting Games 2009 – Готовьтесь! ;)

eventsВ этом году Scripting Games пройдут немного позже обычного: 15-26 июня. Кроме того они будут организованы совместно с PowerShellCommunity.org и PoshCode.org, с использованием их технологий для размещения сценариев.

Если вы думаете что это мероприятие только для каких нибудь “зубров PowerShell’а”, то вы сильно заблуждаетесь 🙂 Во-первых существует два уровня сложности – Beginner Division и Advanced Division. Во-вторых, участие можно принимать не только на PowerShell, но и на VB Script! 🙂 Так что добро пожаловать — попытка не пытка, и стартовых взносов за участие нет 🙂

Ах да, там еще будут всякие призы, но не это главное 🙂 Главное это то чему мы сможем научиться в процессе 🙂

Чтобы поучаствовать, заходите сюда, 15го июня. А сейчас по этой ссылке можно посмотреть задания (и варианты решений) предыдущих игр.

Опубликовано в News, Scripting Games, Scripting Games 2009. Метки: . Комментарии к записи Scripting Games 2009 – Готовьтесь! ;) отключены

Scripting Games: Sudden Death Challenge — Events 8 & 9

Эти два задания явно слишком просты для отдельных постов, поэтому я опишу их в одном 🙂

В Event 8 требовалось найти соответствия имен параметров в LDAP, таковым в консоли Active Directory Users and Computers. Задачка не сложная, и решить её можно просто задав параметры пользователю, и посмотрев на него в консоли adsiedit.msc. Но можно еще проще:

[PS <72> C:\Root] Get-QADUser gusev | Format-List *

objectClass                     : {top, person, organizationalPerson, user}
sn                              : Гусев
telephoneNumber                 : 120
givenName                       : Василий
... неинтересные параметры поскипаны ...

Единственная проблема была со страной, так как она задается в 2х параметрах: c и cn. Но указание в ответе обоих — прокатило 🙂 Подробнее у MoW (он кстати использовал родной функционал PowerShell, полезно посмотреть).

Ну и в Event 9 было вообще смешное задание: убрать из строки все «мусорные» символы, оставив одну фразу:

T#$h!e ()200$~``8 W,\i|n<:;>t.?e&^%-r S#=_cri??{}p()-t@@@i|[[ng G!@!am=_+e^%s/.,

Применяем оператор -replace с простеньким регулярным выражением (все символы кроме букв a-z, пробелов и цифр):

(gc "C:\scripts\symbols.txt") -replace "[^a-z \d]"

И получаем «The 2008 Winter Scripting Games». Всё 🙂

Опубликовано в Learn, PowerShell, Scripting, Scripting Games. Комментарии к записи Scripting Games: Sudden Death Challenge — Events 8 & 9 отключены

Scripting Games: Sudden Death Challenge — Event 7

sd7

Sudden Death 7. Тут я понаписал много лишнего кода 🙂

#Считаем и выводим результат на консоль. $result = "{0:n2}" -f ([math]::Sqrt([math]::Pow([math]::Floor(100*2/30),5)*4)/45) Write-Host $result # Создаем объект Speech Agent'а $agent = New-Object -com Agent.Control.2 # Не знаю зачем, тупо содрал откуда то 🙂 Может и не нужно вообще 🙂 $agent.Connected = 1 # Подгружаем персонажа. $agent.Characters.Load("Merlin") | Out-Null # Помещаем его в переменную. $merlin = $agent.Characters.Character("Merlin") # Показываем на экране. $merlin.Show() | Out-Null # Говорим 🙂 $merlin.Speak("Result of equation is $result.") | Out-Null

Для сравнения стоит посмотреть как решил MoW. Ну и конечно официальное решение.

Scripting Games: Sudden Death Challenge — Event 6

Тоже достаточно простая задачка

SD6.ps1

# Преобразуем содержимое файла в массив символов, и потом снова в строки, # разрубив таким образом на строки по одному символу. Можно было сделать -split "" 🙂 # Ну и эта последовательность строчек идет в switch с аргументами проверки по # регулярным выражениям, и чувствительности к регистру символов. $(switch -regex -casesensitive ([string[]][char[]](gc "c:\scripts\lettercase.txt")) { # Если строчная буква, то переводим в верхний регистр... "^[a-z]$" {$_.toUpper()} # ... и наоборот. "^[A-Z]$" {$_.toLower()} # Если цифра, то преобразовываем в число ([int]) и прибавляем единицу. "^\d$" {[int]$_ - 1} # Иначе - передаем без изменений. default {$_} # Объединяем в строку. }) -join ""

Ну и смотрим вариант MoW (почти 1 в 1 с моим 😉 ) и официальный.

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

Scripting Games: Sudden Death Challenge — Event 5

sd5

Решая эту задачку я совсем забыл про [wmiclass] и использовал вместо него system.management.managementClass…

 

SD5.ps1

# Объявляем хэш-таблицу. $h = @{} # Получаем список WMI объектов. Get-WmiObject -List | # отбираем только начинающиеся на win32_ и заодно проверяем не заполнена ли уже # хэш-таблица. Where-Object {$_.Name -like "win32_*" -and $h.count -ne 25}| # Для каждого отобранного объекта... ForEach-Object { # ... помещаем имя класса в переменную $Class. $Class=$_.name; # Создаем .net объект System.Management.ManagementClass для текущего класса... (New-Object system.management.managementClass($Class)).psbase.properties | # ...и отбираем из всех его свойств поле Name, которое передаем дальше по # конвейеру. ForEach-Object {$_.Name} }| # Для каждого полученного по конвейеру свойства... foreach { #... если оно начинается с нужных букв (^ - обозначает начало строки, а [a-y] # любой символ от a до y. Скобки в регулярном выражении помещают первый # символ слова в $Matches[1]). if ($_ -match "^([a-y])") { # Если в хэш-таблице еще нет указанной буквы... if (!$h[$matches[1]]) { # Помещаем текущее свойство в переменную $Prop $prop = $_ # Создаем новый объект со свойствами Letter, Property и Class, # который помещаем в хэш-таблицу под соответствующей буквой. $h[$matches[1]]=0|select @{n="Letter";e={$matches[1]}}, @{n="Property";e={$prop}}, @{n="Class";e={$class}} } # Пишем в заголовке текущий сколько уже нашли свойств и текущий класс. $host.ui.rawui.windowtitle = "$($h.count)/25 - $Class.$_" } } # Красиво выводим результаты. $h.values | Sort-Object letter | Format-Table -AutoSize

Обязательно посмотреть оба варианта MoW.

Опубликовано в Learn, PowerShell, Scripting, Scripting Games. 1 Comment »

Scripting Games: Sudden Death Challenge — Event 4

Задача — получить из 6882463283678273808479 строку «DR. SCRIPTO». Ерунда 😉

 

SD4.ps1

$(foreach($c in([char[]](gc C:\scripts\numbers.txt))){[char][int]"$c$($foreach.movenext()|out-null;$foreach.current)"})-join''

Но вот разобрать и прокомментировать этот ужас куда сложнее… И поэтому я просто переписал ту же логику заново, но более понятно 🙂

 

SD4_easy.ps1

# Инициализируем переменную $Result для хранения итоговой строки. $Result = "" # Получаем содержимое файла в переменную. $stringNumbers = Get-Content "C:\scripts\numbers.txt" # Преобразуем строку в массив символов $charNumbers = [char[]]$stringNumbers # Для каждого символа в массиве... foreach ($FirstNumber in $charNumbers) { # Сдвигаем перебор на одну итерацию вперед с помощью метода MoveNext() # специального объекта $ForEach (который доступен только внутри цикла foreach. $Foreach.MoveNext() | Out-Null # Помещаем следующий символ в переменную $SecondNumber. $SecondNumber = $Foreach.Current # Объединяем оба номера в число, которое и является кодом символа. [int]$CharCode = $FirstNumber+$SecondNumber # Преобразовываем число в символ, и добавляем к $Result. $Result += [char]$CharCode } # Выводим результат. $Result

Кстати у MoW получилось еще короче и красивее.

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

Scripting Games: Sudden Death Challenge — Event 3

Вопросы про американских президентов 🙂

У какого президента самое длинное имя?

Какие буквы не встречаются в инициалах президентов?

Сколько гласных во всех именах президентов?

 

SD3.ps1

# Загружаем список президентов в переменную. $Presidents = Get-Content "c:\scripts\presidents.txt" # Объявляем переменную содержащую гласные буквы. $Vowels = "aeiou" # Выводим строчку "Longest first name: " без перехода на новую строку. Write-Host "Longest first name: " -NoNewline ($Presidents | # Сортируем президентов по имени. (оператор -replace тут удаляет текст до # пробела и сам пробел. Дальше используем свойство .length чтобы получить # длину оставшейся строки. Получившийся скриптблок {} передаем как аргумент # командлету Sort-Object, в качестве критерия для сортировки. sort {($_ -replace "^.+, ").length} | # Выбираем один последний результат, и опять с помощью оператора -replace # меняем имя и фамилию местами. select -last 1) -replace '^(.+), (.+)$','$2 $1' # Создаем переменную которая будет содержать все буквы алфавита от A до Z. $Alphabet = ([char]"A"..[char]"Z"|foreach{[char]$_}) -join "" # В переменную $Used помещаем буквы которые используются как инициалы. # Чтоб получить все инициалы просто удаляем все маленькие буквы, и разделяем из # массива строк, на массив символов с помощью -split ''. $Used = ($Presidents -creplace "[a-z, ]" -split '' | # Выбираем только уникальные буквы (нам не нужны повторные) и объединяем в # строчку. select -unique) -join '' Write-Host "Letters are not used as initials: " -NoNewline # Удаляем из $Alpabet все буквы которые были использованы. Результат будет # передан на вывод. $Alphabet -replace "[$Used]" Write-Host "Total vowels used: " -NoNewline # Удаляем из списка президентов все согласные (не гласные :)) и считаем # получившееся количество гласных. ($Presidents -replace "[^$vowels]" | Measure-Object -Character).characters

Решение от MoW и Scripting Guys.

PS: Напоминаю, что сегодня будет встреча в Live Meeting посвященная обсуждению вчерашнего события и сопутствующим темам. Приходите! 😉

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