2008脚本大赛PowerShell高级组Event 4解题及分析

来源:互联网 发布:jquery遍历数组 编辑:程序博客网 时间:2024/05/27 19:25

中文题目位置: http://www.microsoft.com/technet/scriptcenter/funzone/games/games08/chs/aevent4.mspx

英文解题位置: http://www.microsoft.com/technet/scriptcenter/funzone/games/solutions08/apssol04.mspx

这道题, 比较考验大家对格式处理的能力. 通过分析, 我们可以知道2008. 3月需要6行才能完整显示结果. 而 2009年2月, 只需要4行就能显示完整结果. 因此, 我使用42个元素字符串数组, 也就是7 * 6行. 7代表一周7天, 最多需要6行. 将这些数组元素初始化为3个空格. 这样就可以满足Sun等星期的对齐要求. 计算出需要显示月份的起点, 在数组中的偏移就是星期对应的int值. 数值也要按照3个字符的宽度进行打印. 最后把6行结果全部输出就好了, 利用双引号连接数组, 我使用五个空格作为分隔符. 显示的结果可以说和官方的要求很像了. 看起来也还算舒服. 代码如下

$inMonth = Read-Host "Please enter a month"
[void] (
$inMonth -match "^(?<m>/d+)/(?<y>/d+)$")
$titles = "Sun","Mon","Tue","Wed","Thu","Fri","Sat"
$m = $matches.m
$y = $matches.y
$d = 1
$width = 3
$ofs = ' ' * 5
$targetMonth = Get-Date -Year $y -Month $m -Day $d
$a = New-Object -TypeName 'String[]' -ArgumentList 42
for($i = 0$i -lt $a.Length$i++) { $a[$i= " " * $width }
$daysInMonth = [datetime]::DaysInMonth($y, $m)
$startDay = [int]($targetMonth.DayOfWeek)
while ($daysInMonth--) {$a[$startDay++= "{0,${width}:D}" -$d++ }
"{0:Y}" -$targetMonth;
""
"$titles"
"$($a[0..6])"
"$($a[7..13])"
"$($a[14..20])"
"$($a[21..27])"
"$($a[28..34])"
"$($a[35..41])"