ネタ元
実装
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