题目位置: http://www.microsoft.com/technet/scriptcenter/funzone/games/games08/sdevent10.mspx
官方题解: http://www.microsoft.com/technet/scriptcenter/funzone/games/solutions08/sdsol10.mspx
这个题目应该是比较有意思的, 因为你可以不写任何脚本就能做出此题. 由于我不会VBScript, 也不是很熟悉Perl, 所以这题让我觉得很有难度. 我们需要从 .CSRIIEHRRTOENSWWPOCTIHPT-T 中找出3个命令, 它们要完成同样的功能. 三个命令分别来自三种语言. 一上来我完全没有头绪, 于是我想先看看究竟都有哪些字符:
PS C
:/
Users
/
Eden
>
'
.CSRIIEHRRTOENSWWPOCTIHPT-T
'
.
GetEnumerator()
|
%
{
$h
=
@{}} {
$h
[
$_
]
++
} {
$h
}
Name Value
----
-----
N
1
W
2
P
2
I
3
R
3
.
1
-
1
T
4
O
2
H
2
C
2
S
2
E
2
利用哈希表, 我发现, 出现的字符个数不是很多, 但是由于对VBscript和Perl不熟悉, 我还是没有任何思路. 既然字符种类很少, 那么PowerShell中cmdlet能匹配的数量应该不会很多, 1.0中有129个命令, 我可以试试...根据这个思路, 我执行了下面的命令:
PS C
:/
Users
/
Eden
>
Get
-
Command
|
?
{
$_
-
match
"
^[$($h.Keys | sort)]+`$
"
}
|
fl name
Name
:
Set
-
Content
Name
:
Stop
-
Process
Name
:
Write
-
Error
Name
:
Write
-
Host
对于哈希表中Keys进行排序, 然后放在正则表达式中, 只选取那些使用Keys的命令. 现在只有4条命令入围...看起来问题很简单了, 我的第一反应就是Write-Host, 因为看起来它是最普通的cmdlet. 现在我需要从$hash表中删除这些用过的字符:
PS C
:
Users
Eden
>
'
WRITE-HOST
'
.
GetEnumerator()
|
%
{
$h
[
$_
]
--
}
PS C
:
Users
Eden
>
$h
.
GetEnumerator()
|
?
{
$_
.
Value
-
gt
0
}
Name Value
----
-----
N
1
W
1
P
2
I
2
R
2
.
1
T
2
O
1
H
1
C
2
S
1
E
1
锁定Write-Host之后, 我想到Perl中最普通的输出就是print命令, 再继续试试:
PS C:Users/Eden
>
'
PRINT
'
.GetEnumerator()
|
%
...
{ $h[$_]-- }

PS C:/Users/Eden
>
$h.GetEnumerator()
|
?
...
{ $_.Value -gt 0 }

Name Value
----
-----
W
1
P
1
I
1
R
1
.
1
T
1
O
1
H
1
C
2
S
1
E
1
ok, 现在看起来快到最后了, 可是我完全不会VBscript, 这些东西我还是不知道是什么. 我回忆起有个WScript的东西, 再一次排除后, 我发现原来是单词Echo. 已经解完了, 当我准备发送E-Mail的时候, 发现E-mail示例正是使用Wscript.Echo的例子...我觉得自己好笨...呵呵
通过PowerShell、Perl和VBScript三种语言解析乱序字符串,找到能够实现相同功能的三个命令。利用哈希表统计字符频率,并筛选匹配的命令。
1161

被折叠的 条评论
为什么被折叠?



