LoginSignup
2
0

More than 5 years have passed since last update.

PowerShellでFizzBuzzクイズ

Posted at

ネタ元

実装

FizzBuzzQuiz.ps1
function FizzBuzzQuiz ([string] $ConvertTo, [scriptblock] $ScriptBlock, [string] $Property = '#From')
{
    New-Module -ReturnResult -ArgumentList ($ConvertTo, $ScriptBlock, $Property) -ScriptBlock {
        Param ([string] $ConvertTo, [scriptblock] $ScriptBlock, [string] $Property)

        {Process {convert $_}}

        function convert ($x)
        {
            $n, $str = get $x

            if ($n | ForEach-Object $ScriptBlock)
                {$str | Add-Member -PassThru -MemberType NoteProperty $Property $n}
            else
                {$x}
        }

        function get ($x)
        {
            if ($x -is [int])
                {return $x, "${ConvertTo}"}

            if (converted $x)
                {return $x.$Property, "${x}${ConvertTo}"}

            throw "入力「${x}」は、整数および変換済文字列ではありません。"
        }

        function converted ($x)
        {
            $x -is [string] -and
            ($x | Get-Member -MemberType NoteProperty $Property) -ne $null
        }
    }
}

$function:fizz = FizzBuzzQuiz Fizz {$_ % 3 -eq 0}
$function:buzz = FizzBuzzQuiz Buzz {$_ % 5 -eq 0}
$function:pezz = FizzBuzzQuiz Pezz {$_ % 7 -eq 0}
$function:hozz = FizzBuzzQuiz Aho  {"${_}".Contains('3')}

実行例

FizzBuzzQuiz_test.ps1
 1 | fizz        #=> 1
 3 | fizz        #=> Fizz
 1 | buzz        #=> 1
 5 | buzz        #=> Buzz
 1 | fizz | buzz #=> 1
 3 | fizz | buzz #=> Fizz
 5 | fizz | buzz #=> Buzz
15 | fizz | buzz #=> FizzBuzz
15 | buzz | fizz #=> BuzzFizz


  7 | fizz | buzz | pezz #=> Pezz
 21 | fizz | buzz | pezz #=> FizzPezz
 35 | fizz | buzz | pezz #=> BuzzPezz
105 | fizz | buzz | pezz #=> FizzBuzzPezz
105 | fizz | pezz | buzz #=> FizzPezzBuzz
105 | pezz | buzz | fizz #=> PezzBuzzFizz

  1 | fizz | buzz | pezz #=> 1
  3 | fizz | buzz | pezz #=> Fizz
  5 | fizz | buzz | pezz #=> Buzz
 15 | fizz | buzz | pezz #=> FizzBuzz
 15 | buzz | fizz | pezz #=> BuzzFizz
104 | fizz | buzz | pezz #=> 104


13 | fizz | buzz | hozz #=> Aho
 3 | fizz | buzz | hozz #=> FizzAho
35 | fizz | buzz | hozz #=> BuzzAho
30 | fizz | buzz | hozz #=> FizzBuzzAho
30 | hozz | buzz | fizz #=> AhoBuzzFizz


10..20 | fizz | buzz
# Buzz
# 11
# Fizz
# 13
# 14
# FizzBuzz
# 16
# 17
# Fizz
# 19
# Buzz
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0