Scripting Games 2007, Event 3

Закончились Scripting Games 2007. Я в них попробовал поучаствовать в категории PowerShell Advanced.

Первые 2 задания я просто пропустил, на третьем сделал дурацкую ошибку из за того что невнимательно прочитал задание… Но зато на остальных собрался, и далее ни одного промаха🙂 Учитывая моё позднее начало, задачей максимум для меня было — получить сертификат of achievement, выдающийся любому набравшему 60 очков. Я набрал 75🙂 Помоему неплохо🙂
И к сожалению я был единственным представителем России (была правда еще пара россиян в конкурсе по VBS)… Надеюсь в следующем году нас будет больше.

Впрочем победа в любом случае определялась не очками, и не призами. Самым интересным было участие🙂 В играх были не очень сложные (по крайней мере для PoSH;)), но интересные задачки. Попробую рассказать о некоторых тут. Начну со 3го задания (первые 2 я не решал, потом попробую вернуться).

Задача: Надо было расчитать сдачу с $50 бумажки, и разложить её по банкнотам и монетам.
Например если на сдачу надо выдать $30.65 то необходимо показать следующее:
3 $10 bills — $30.00
2 quarters — $0.50
1 dime — $0.10
1 nickel — $0.05
Скрипт должен запрашивать значение от 0.01 до 50, и выводить сдачу с него. Я забыл вычесть значение из 50, и разбирал введенное число сразу😦 Но тем неменее вот моё решение:

#инициализируем хеш таблицу с названиями штатовских номиналов монет и банкнот и их значениями в центах
$types=@{"Pennys"=1;"Nickels"=5;"Dimes"=10;"Quarters"=25;"Ones"=100;"Fives"=500;"Tens"=1000}

#сортируем по значениям
$types=$types.GetEnumerator()|sort value -desc

#инициализируем хеш с результатами
$result = @{}

#спрашиваем у пользователя значение и умножаем его на 100 чтоб получить количество центов (считать проще в них). 
#Тут же я бы и вычел их из $50, будь я повнимательнее ;) Ну да черт с ним, главное что я знаю что могу это решить ;)
$change=100*(read-host "Enter change value")

#выводим количество сдачи
write-host "Change returned: $($change/100)"

#хитрый one-liner для подсчета результатов :) Попробую разобрать по частям :)
#Пока выдали не всю сдачу...
#while ($change -ne 0) {
#Для каждого элемента $types...
#$types.getenumerator()|%{
#пока сдача больше номинала текущей монеты/банкноты ($_ - в нашем случае элемент $types)
#while($change -ge $_.value){
#добавляем в соответствующее монете/банкноте значение $result еденичку, вычитаем номинал из $change
#$result[$_.name]++;$change-=$_.value}}}
while ($change -ne 0) {$types.getenumerator()|%{while($change -ge $_.value){$result[$_.name]++;$change-=$_.value}}}

#Ну и выводим результаты :)
"Tens","Fives","Ones","Quarters","Dimes","Nickels","Pennys"|%{write-host "$($_): $($result[$_])"}
Опубликовано в PowerShell. Комментарии к записи Scripting Games 2007, Event 3 отключены
%d такие блоггеры, как: