Language detail: PowerShell

Coverage: 18.78%
number of '+' ratings
contribution for coverage

Unsolved challenges

codes

Feed

Used modules

next >>

急勾配の判定 (Nested Flatten)

Perlの方々の回答を参考にしました

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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 )
アレイのuniq (Nested Flatten)

コマンドレットで

1
3,1,4,1,5,9,2,6,5,3,5,8,9,7,9 | Select-Object -Unique
シードを固定した乱数 (Nested Flatten)

コマンドレットだけで

1
Get-Random -SetSeed 10
リストを逆順に表示 (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)
1
(dir filepath).length
環境変数の取得 (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)
1
Write-Output "Hello, world!"
音声合成で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)
コマンド間違えてた。ただ値を返すだけでした

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)")}
next >>

Index

Feed

Other

Link

Pathtraq

loading...