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

中文题目位置: 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]) "

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值