Language detail: PowerShell
Coverage: 18.78%
|
number of '+' ratings |
contribution for coverage |
Unsolved challenges
- 文字列で+を表示する (Nested Flatten)
- 年賀はがきの当せん番号 (Nested Flatten)
- 箱詰めパズルの判定 (Nested Flatten)
- 関数やメソッドのソースの平均行数 (Nested Flatten)
- コレクションの実装 (Nested Flatten)
codes
リストを逆順に表示
(Nested
Flatten)
非破壊(?)です
1 2 3 4 | $given_list = 1..5
function reverse([array]$t){ $t[($t.Length-1)..0] }
reverse $given_list
|
自分自身のファイル名を知る方法
(Nested
Flatten)
1行目にファイル名、2行目にフルパス、3行目にスクリプトのあるディレクトリのパスが出力されます。スクリプトの置いてあるフォルダ以下のファイル群に対して処理を行いたいということがあったので調べました。
1 2 3 | echo $MyInvocation.MyCommand.Name
echo $MyInvocation.MyCommand.Path
echo (Split-Path -Parent $MyInvocation.MyCommand.Path)
|
小町算
(Nested
Flatten)
はい、ごめんなさい。空白の場合を忘れていました。というわけで投稿し直します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | function komachi([int] $i, [string] $expr)
{
if ($i -gt 10)
{
$sum = Invoke-Expression $expr
if ($sum -eq 100)
{
Write-Output ("$expr = $sum")
}
}
else
{
komachi ($i + 1) ($expr + " + $i")
komachi ($i + 1) ($expr + " - $i")
komachi ($i + 1) ($expr + " * $i")
komachi ($i + 1) ($expr + " / $i")
komachi ($i + 1) ($expr + [string]$i)
}
}
komachi 2 '1'
|
初めてのPowerShellスクリプト。というわけでなんの工夫もありません、ごめんなさい。括弧とか対応していません。なお、Invoke-Expressionはいわゆるevalです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | function komachi([int] $i, [string] $expr)
{
if ($i -gt 10)
{
$sum = Invoke-Expression $expr
if ($sum -eq 100)
{
Write-Output ("$expr = $sum")
}
}
else
{
komachi ($i + 1) ($expr + " + $i")
komachi ($i + 1) ($expr + " - $i")
komachi ($i + 1) ($expr + " * $i")
komachi ($i + 1) ($expr + " / $i")
}
}
komachi 2 '1'
|
環境変数の取得
(Nested
Flatten)
env: ドライブを ls します。 ls は Get-ChildItem のエイリアスですので Get-ChildItem と書くほうがよいですね。 キーを指定する場合には env: ドライブのキーの項目を Get-Item します。
1 2 3 | Get-ChildItem env:
Get-Item env:HOME
|
Hello, world!その2
(Nested
Flatten)
$ofsのoを大文字にすれば逃げられるのでは?
1 | "$($Ofs=`"`")$(`"Helo, wrd!`"[0,1,2,2,3,4,5,6,3,7,2,8,9,10])"
|
n人中m人が当選するくじ
(Nested
Flatten)
とりあえず。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | function lot($n, $m) {
if ($n -ge $m) {
$randomgenerator = New-Object Random
$source = 1 .. $n
$limit = $n
$result = @()
foreach ($i in 1 .. $m) {
$limit -= 1
$ii = $randomgenerator.Next($limit + 1)
$result += $source[$ii]
if ($ii -gt 0) {
$srclow = $source[0 .. ($ii - 1)]
} else {
$srclow = @()
}
if ($ii -lt $limit) {
$srchi = $source[($ii + 1) .. $limit]
} else {
$srchi = @()
}
$source = $srclow + $srchi
}
}
return $result | sort
}
|
音声合成でHello, world!
(Nested
Flatten)
Windows では COM 経由で SAPI を使うといいようですね。
1 2 3 4 | function say($msg) {
$speaker = new-object -com Sapi.SpVoice
$speaker.Speak($msg, 1)
}
|
Hello, world!その2
(Nested
Flatten)
やっちゃった。$ofsの値が悪さしてました $ofsは配列を文字列にするときに個々の値の間に挟まれる文字列で、デフォルトはスペースになっています。 PS C:\> $ofs=" " PS C:\> [string](1,2,3) 1 2 3 PS C:\> $ofs="" PS C:\> [string](1,2,3) 123 なので初めのコードだと H e l l o , w o r l d ! と出てしまっていました。 ちゃんと新しいシェル出して動作確認しないと駄目ですね。
1 | "$($ofs=`"`")$(`"Helo, wrd!`"[0,1,2,2,3,4,5,6,3,7,2,8,9,10])"
|
長方形の交差判定
(Nested
Flatten)
1 2 3 4 | [void][reflection.assembly]::loadwithpartialname("system.drawing")
$r1 = new-object system.drawing.rectangle(0,0,100,100)
$r2 = new-object system.drawing.rectangle(100,0,100,100)
$r1.intersectsWith($r2)
|
実行時間の測定
(Nested
Flatten)
$argsが展開されて渡されてしまうのでとりあえず引数は無しで。綺麗に渡す方法無いかなー。
PS C:\> function func{sleep 3}
PS C:\> profile
Days : 0
Hours : 0
Minutes : 0
Seconds : 2
Milliseconds : 997
Ticks : 29977106
TotalDays : 3.4695724537037E-05
TotalHours : 0.000832697388888889
TotalMinutes : 0.0499618433333333
TotalSeconds : 2.9977106
TotalMilliseconds : 2997.7106
1 | function profile{measure-command{func}}
|
Hello, world!その2
(Nested
Flatten)
配列スライスして文字列展開しています。 PS C:\> "$(`"Helo, wrd!`"[0,1,2,2,3,4,5,6,3,7,2,8,9,10])" Hello, world!
1 | "$(`"Helo, wrd!`"[0,1,2,2,3,4,5,6,3,7,2,8,9,10])"
|
アルファベットの繰り上がり
(Nested
Flatten)
他の基数も対応 $table = [char[]]"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" print-excel-header 1000 $table $table = [char[]]"いろはにほへと" print-excel-header 100 $table
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | function print-excel-header($count, $table)
{
$radix = $table.length
foreach ($i in 0..($count -1)) {
$s = ""
$p = $i
do {
$q = $p % $radix
$p = [math]::truncate($p / $radix) - 1
$s = $table[$q] + $s
} while ($p -ne -1)
$s
}
}
$table = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
print-excel-header 100 $table
|
議席数をドント方式で
(Nested
Flatten)
48 1 21 30
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | function create-party($id,$votes)
{
$p = add-member -in $id --passthru NoteProperty votes $votes
add-member -in $p NoteProperty level 1
add-member -in $p ScriptMethod rate { $this.votes / $this.level; $this.level++}
$p
}
filter max {
begin{$m = 0; $i = 0; $r = 0}
process{if($m -lt $_) {$m=$_; $r=$i} $i++}
end{$r}
}
$const = 100
$votes = 123, 4, 56, 78
$parties = $votes | %{$i=0}{create-party $i $_; $i++}
$result = 1..$const
$rates = $parties | %{$_.rate()}
for ($i = 0; $i -lt $const; ++$i) {
$id = $rates | max
$result[$i] = $id
$rates[$id] = $parties[$id].rate()
}
foreach ($id in $parties) {@($result | where-object {$_ -eq $id}).length}
|
n日後を返す関数を返す関数
(Nested
Flatten)
next >>
コマンド間違えてた。ただ値を返すだけでした PS C:\> $f = n_days_later(3) PS C:\> &$f 2007年9月6日 20:02:27 PS C:\> $f (get-date).addDays(3) PS C:\> $f = n_days_later(1) PS C:\> $f (get-date).addDays(1) PS C:\> &$f 2007年9月4日 20:03:04
1 | function n_days_later($n){$ExecutionContext.InvokeCommand.NewScriptBlock("(get-date).addDays($n)")}
|






margarite #9518() [ PowerShell ] Rating0/0=0.00
Perlの方々の回答を参考にしました
function is_super_dec( [array] $super_array ) { $total = 0 foreach( $x in reverse $super_array ) { if( $x -le $total ){ return 0 } $total += $x } return 1 } is_super_dec @( 512,256,128,64,32,16,8,4,2,1 )Rating0/0=0.00-0+
[ reply ]