話題らしい5つの問題をPowerShellで解く

これ
http://www.softantenna.com/wp/software/5-programming-problems/

問題1

$list = @(10, 20, 30, 40, 50)

for ($i = 0; $i -lt $list.length; $i++)
{
    $total1 += $list[$i]
}
Write-Host "for: $total1"

$i = 0
while ($i -lt $list.length)
{
    $total2 += $list[$i++]
}
Write-Host "while: $total2"

function Get-Total
{
    param(
        $i = 0,
        $total = 0
    )
    $total += $list[$i]
    if ($list[$i + 1])
    {
        $total = Get-Total ($i + 1) $total
    }
    return $total
}
Write-Host "recurse: $(Get-Total)"

ふたつ目はwhile ($list[$i])でもいいよな

問題2

面倒なので即時関数で書く

$newlist = &{
    param(
        $list1,
        $list2
    )
    $result = @()
    $i = 0
    while ($list1[$i] -and $list2[$i])
    {
        $result += $list1[$i]
        $result += $list2[$i]
        $i++
    }
    return $result
} @(1, 2, 3) @('a', 'b', 'c')
Write-Host $newlist

問題3

$Fibonacci = &{
    $result = @(0, 1)
    while ($result.length -lt 100)
    {
        $result += [bigint] ($result[$result.length - 2] + $result[$result.length - 1])
    }
    return $result
}
Write-Host $Fibonacci

問題4

$biggestNumber = &{
    param($list)
    $result = ''
    $list | %{
        $tmp = [string] $_
        return $tmp.PadRight(10, 'a')
    } | sort -Descending | % {
        Write-Verbose $_
        $result += $_.trim("a")
    }
    return $result
} @(512, 511, 51, 5)
Write-Host $biggestNumber

最初は単純に文字列にして逆順ソートだけしてた、問題で例として出てた配列はそれで十分だった
解答例のページ見たらそれだと全然ダメそうだったのとpaddingという単語が何度も目に入ったのでちょっと小細工した
合ってるかどうかは知らん

問題5

$GetExpression = {
    param($expression, $index=0, $operator='')
    if ($index -lt $expression.length)
    {
        $newExpression = $expression.Insert($index, $operator)
        '+', '-', '' | % {
            &$GetExpression $newExpression ($index + $operator.length + 1) $_
        }
        if ($(iex $newExpression) -eq 100)
        {
            return "$newExpression = $(iex $newExpression)"
        }
    }
}
&$GetExpression '123456789' | select -unique

とりあえず適当に書いて総当りさえ出来てれば確実に答えにたどり着けるはずだよね、くらいの気持ちだった
解答例見たら11個だって書いてあって、これだとなんか重複出るけどselect -uniqueしちゃえば11個になったのでまぁ良しとした
文字列に+-突っ込んでeval的なことをするじゃあくなコードだ

仕事の合間合間にやってみたけど1時間以内に出来たかどうかは微妙
問題4が一番時間かかったか
問題5はとりあえず書いたらなんとなくうまく行ったので割と早かった

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中