PowerShell и другие скрипты

19.3.2008

Scripting Games: Sudden Death Challenge - Event 3

Рубрика: Learn, PowerShell, Scripting, Scripting Games — Xaegr @ 11:09

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

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

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

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

 

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 посвященная обсуждению вчерашнего события и сопутствующим темам. Приходите! ;)

17.3.2008

Scripting Games: Sudden Death Challenge - Event 2

Рубрика: Learn, PowerShell, Scripting, Scripting Games — Xaegr @ 9:14

Так как в первой задаче Sudden Death правильный ответ мог быть только один - ничего интересного в моем варианте нет, и писать я про него соответственно не буду :) А начну я сразу с Event 2, в котором требовалось из составить одну строчку текста из нескольких столбцов.

 

T Sg hWc eirG nia 2tpm 0ete 0ris 8 n!

Вобщем ничего сложного:

 

SD2.Ps1
# Загружаем содержимое файла vertical.txt Командлет Get-Content возвращает # массив строк. $v = Get-Content "c:\scripts\vertical.txt" # Переменная $Cols будет содержать количество колонок которое мы получим из # длины первой строки. $cols = $v[0].length # А $Rows соответственно количество элементов в массиве $v. $rows = $v.count # С помощью двух for перебираем все символы: сначала первый символ всех # столбцов, потом второй, и так далее. for ($c = 0; $c -lt $cols; $c++) { for ($r = 0; $r -lt $rows; $r++) { # Выводим текущий символ текущей строки. Write-Host ($v[$r][$c]) -NoNewline } } # Делаем финальный перевод строки для красоты. Write-Host ""

Вот ответ от Scripting Guys и вариант MoW в почти в одну строчку ;)

14.3.2008

Scripting Games: Advanced PowerShell - Event 10

Рубрика: Learn, PowerShell, Scripting, Scripting Games — Xaegr @ 12:31

cards

В последней задачке подразделения Advanced мы писали симулятор игры Black Jack, или по-русски “Очко” :) Честно говоря когда я читал задание первый раз, после того как легко расщелкал все предыдущие, я подумал - “вот и засада с пушным зверьком…” ;) Но всё оказалось куда проще чем казалось в начале :)

(далее&hellip ;)

13.3.2008

Scripting Games: Advanced PowerShell - Event 9

Рубрика: Learn, PowerShell, Scripting, Scripting Games — Xaegr @ 9:12

Совсем простая задачка, надо было взять все слова из текстовика, и записать буквы каждого слова в обратном порядке, не меняя общего порядка слов.

 

SG9-Reverse.ps1
# Получаем содержимое файла alice.txt, разделяем его на слова по пробелам, и # передаем их в конвейер. ((Get-Content "c:\scripts\alice.txt") -split " " | # Для каждого слова ($_)... foreach { # ... берем все его символы начиная с последнего и заканчивая нулевым и # объединяем их снова в слово. $_[($_.length-1)..0] -join "" } # Соединяем получившийся массив слов с помощью пробелов. ) -join " "

Либо тоже самое, но в одну строчку :)

((gc c:\scripts\alice.txt)-split" "|%{$_[($_.length-1)..0]-join""})-join" "

Почти тоже самое от MoW ;) (но всё же короче! :) ) и от Per Østergaard с применением функционала .Net. Ну и Scripting Guys (блин, я тоже хочу научиться писать скрипты как они - по слогам :) )

12.3.2008

Scripting Games: Advanced PowerShell - Event 8

Рубрика: Learn, PowerShell, Scripting, Scripting Games — Xaegr @ 10:17

Выполняем работу iTunes ;) Помнится в нём была подобная функциональность - набить айпод произвольной музыкой из библиотеки под завязку. Впрочем тут условия чуть сложнее :)

 

SG8-SongList.ps1
# Загружаем содержимое файла songlist.csv. Import-Csv использовать не получится, # так как он берет заголовки из первой строки, а в этом файле заголовков нет, и # в первой строке находятся данные. $Songs = Get-Content "c:\scripts\songlist.csv" | # Отбираем только строки попадающие под регулярное выражение, заодно # разбирая на группы. where {$_ -match "^(.+),(.+),(.+)$"} | foreach { # Создаем новый, пустой объект. $obj = New-Object "PSObject" # Добавляем к нему свойства со значениями полученными из регулярного # выражения ($Matches). $obj | Add-Member "noteproperty" -Name "Artist" -Value $matches[1] $obj | Add-Member "noteproperty" -Name "Song" -Value $matches[2] # Добавляя свойство Time, преобразовываем значение в тип [TimeSpan] # (отрезок времени). $obj | Add-Member "noteproperty" -Name "Time" -Value ([TimeSpan]("0:"+$matches[3])) # Выводим полученный объект на конвейер. $obj } # В результате в переменной $Songs у нас содержится массив объектов со # свойствами Artist, Song, Time. # Создаем массив $Burnlist, это список песен для записи. $Burnlist = @() # Создаем объект класса Random для генерации произвольных чисел. $r = New-Object random # Запускаем бесконечный цикл. while ($true) { # Получаем произвольную песню из списка. $song = $Songs[$r.next($Songs.length)] # Если в списке $BurnList содержится не более одной песни от $Song.Artist и # в списке еще нет конкретно этой песни... if ((($burnlist | where {$_.artist -eq $song.artist}).count -le 1) ` -and (!($burnlist | where {$_.song -eq $song.song}))) { # Добавляем к списку записи $Song $Burnlist += $song # Считаем какова общая продолжительность песен в $Burnlist: # Создаем переменную $n класса [TimeSpan] [timespan]$n=0 # Добавляем к $n время всех треков из $BurnList $burnlist |%{$n+=$_.time} # Если суммарное время превышает 80 минут, то обнуляем $Burnlist, и он # будет заполняться заново. Не самый оптимальный алгоритм, но... :) if ($n -gt [timespan]::FromMinutes(80)){$Burnlist = @()} # Если суммарное время удовлетворяет условиям задачи (Больше 75 минут и # меньше 80)... if ($n -lt [timespan]::FromMinutes(80) -and $n -gt [timespan]::FromMinutes(75)) { # Cортируем список по исполнителю. $Burnlist | Sort artist | # Выбираем свойства Artist и Song, а свойство Time заменяем # текстовым (вместо [TimeSpan]) с временем в формате который # предпочитают Scripting Guys :) Select Artist, Song, @{n="Time";e={$_.Time -replace "^00:"}} | # Выводим объекты на GridView Out-GridView # Пишем сколько всего времени заняли треки на диске. Write-Host "Total music time: $([int]$n.totalminutes):$($n.seconds)" # Завершаем работу скрипта. Exit } } }

Опять далеко не идеал ;) Другие варианты: Mow, Per Østergaard, Scripting Guys, Macro Shaw.

PS: Срочно в номер :) Через полтора-два часа (12 MSK) начнется очень интересный вебкаст, рекомендую записаться и посмотреть ;)

« Newer PostsOlder Posts »

Заведите блог на WordPress.com.