中文题目位置: 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} " - f $d ++ }
" {0:Y} " - f $targetMonth ;
""
" $titles "
" $($a[0..6]) "
" $($a[7..13]) "
" $($a[14..20]) "
" $($a[21..27]) "
" $($a[28..34]) "
" $($a[35..41]) "
[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} " - f $d ++ }
" {0:Y} " - f $targetMonth ;
""
" $titles "
" $($a[0..6]) "
" $($a[7..13]) "
" $($a[14..20]) "
" $($a[21..27]) "
" $($a[28..34]) "
" $($a[35..41]) "