2013/01/20

PowerShellでFizzBuzz問題をいかに短く書くかというのは、人類にとっての太古からの命題であり、色々な方がチャレンジしています。

以下は国内でのチャレンジを、 日時、チャレンジャー名、コード文字数(半角スペース消去後)、初出アドレス で時系列にまとめたものです。

2007/11/06 牟田口 89文字 リンク
2007/11/07 囚人さん 86文字 リンク
2007/11/07 よこけんさん 75文字 リンク
2007/11/13 よこけんさん 57文字 リンク
2013/01/19 guitarrapcさん 57文字 リンク

私の現在の最短コードはこれです。PowerShell 3.0でしか動きませんが、51文字です。

1..100|%{($t="fizz"*!($_%3)+"buzz"*!($_%5))+$_[$t]}

PowerShell 2.0でも動くバージョンは以下。54文字です。

1..100|%{($t="fizz"*!($_%3)+"buzz"*!($_%5))+@($_)[$t]}

きっと解説は不要だと思いますが蛇足を承知で少しばかり。

$_%3 は、剰余を求める演算子%を使っているので、$_が3の倍数のとき0を返します。

!(0)とすると、0はboolに型変換され$falseとなり、その論理否定なので!(0)は$trueになります。

”fizz”*$true とすると右辺はintに型変換されるので”fizz”*1が評価され、”fizz”を返します。PowerShellでは「文字列*整数値」で文字列を整数値回繰り返した文字列を返すことを利用しています。

同じことを”buzz”に対しても行い、結果を+で連結します。このとき、”fizz”か”buzz”か”fizzbuzz”か””(空の文字列)のいずれかを返します。得られた値を@とします。

($t=@) とすると$tに@の値を入れつつ、@の値を返します。

@($_)[$t] とすると、$tが””(空の文字列)の場合は型変換され@($_)[0]が評価されます。よって、$tが””のときは@($_)の0番目の要素、$_、すなわち元の数値が取り出されます。最後に””と元の数値を+で連結したものが出力されるので、結果として数値のみが出力されます。

$tが”fizz”か”buzz”か”fizzbuzz”の場合は@($_)[$t]は配列の範囲外なので$nullを返します。よって$t+$null、すなわち$tの文字列がそのまま出力されます。

PowerShell 3.0だと非配列変数でも[]演算子を使用することができます。よって$_[0]は$_と等しく、$_[文字列]は$nullです。これによって@($_)のように配列化する必要がなく、3文字短縮できたわけです。

2007/11/06

FizzBuzz問題をちょっとひねくれて解くとこんな感じでしょうか

1..100|%{$t="";if($_ % 3 -eq 0){$t+="Fizz"};if($_ % 5 -eq 0){$t+="Buzz"};if($t -eq ""){$_}else{$t}}

3と5の倍数のとき、3の倍数と5の倍数の両方の結果をつなげて書けばいいということで、3と5の倍数の場合、という条件文を書かなくていいというのがFizzBuzzのポイントだと勝手に思ってます(もちろん素直に場合分けしてやってもよいです)。そこでそれを考慮しなければならないFizzBuzzDozz問題を出した、というのが出題意図だったんですね、実は。以下、解答例。

1..100|%{$t="";if($_ % 3 -eq 0){$t="Fizz"};if($_ % 5 -eq 0){$t="Buzz"};if($_ % 15 -eq 0){$t="Dozz"};if($t -eq ""){$_}else{$t}}

これを解くには素直に3の倍数、5の倍数、3と5の倍数を条件分けしないといけません。$_ % 15 -eq 0は最小公倍数という数学の概念を知っていないと出てこない解ですが、素直に$_ % 3 -eq 0 -and $_ % 5 -eq 0でも無論OKですが、少し冗長という気もします。ですが3と5の倍数は15の倍数だ、という「解釈」を人間がやるかコンピュータがやるか、どちらがいいかは議論の分かれるところだと思います。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2007/11/06/106291.aspx

2007/11/05

体調が悪くてブログ更新とかWeb連載記事が止まっていてすみません。ほかの仕事もあまりできてませんし、オフラインイベントにも出てないですねー。

左半身(手足、顔など)がしびれたり震えたりしておかしいんです。あと胃腸の調子が悪くて…。

12/8は名古屋で、1月には大阪でスピーカーをやらせていただくので、それまでには治しておきたいところです。とりあえず検査中なのです。勉強会へのご参加お待ちしてます。

12/8と1月の講演はどちらも同じ内容でPowerShellがお題ですが、基礎編はちゃちゃっと流して少し「コマンドレットの組み合わせ」をテーマに応用に入ります。演題は「Windows PowerShell ステップアップ講座」にします。>中さんよろしくです

基礎編は大阪#5大阪#4などで復習しておいていただけると嬉しいです。

1月大阪は二コマいただいてまして、もう一コマで、「初音ミク」をテーマに少ししゃべろうかなと思ってます。初音ミクと作曲のイロハのイをやろうと思います。現在、検証中&調整中です。初音ミクは購入したんですが体験版が入手できなくてデモができるかどうか微妙なんですよ。でもデモできないと面白くない(というか意味があまりない)のでなんとか調整しますね。

作曲は自己流なので、講演もかなり偏ると思いますが、DTM(デスクトップミュージック)のここ10年の歴史をMIDIという単語をキーワードに少し語ったあと、素人でも、しかもお金をかけずともフィーリングで作曲できるということを示したいと思っています。そのあと、自作曲に乗せてミクさんに歌ってもらうという流れ。あ、どうしましょ、デモ用の曲を作らないと(汗

実は、すでにこんな曲を作ったりしていますがw
やまにょん氏と、謎の歌手largeさんsmallさんと組んで作った「まい☆びす」と「Happy! Lucky! Scripting!!」という電波ソングです。二つとも私が作詞、前者はやまにょん氏作曲、後者は私作曲です。

さて話はぜんぜんかわりますが、FizzBuzz問題(えぴさんとこにリンク)が解けて安心した人には、FizzBuzzDozz問題を解いてもらいます。私が今考えました。

【問題】
1から100までの数を表示するプログラムを書け。
ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、
3と5両方の倍数の場合には「Dozz」とプリントすること。

FizzBuzz問題は実は数学を知らなくてもできますが、この問題を美しく解くには数学の知識が必要かもしれません。個人的には、FizzBuzzで素質を調べ、FizzBuzzDozzで発展性を調べるという感じですね。これができないと将来的にはつらくなってくると思います。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2007/11/05/105917.aspx

2007/08/05

今日まっちゃ139勉強会でインスパイアされてPowerShellでは再帰呼び出しが何回できるのか?ということを調べたら100回でした。どっかに説明があった気もする…。以下、2分で書いた検証コード。(2分もかけるなって?w)

$b=1;function a(){$b++;$b;a};a

実行結果

2
3
4
5
6
7
8
9
略
94
95
96
97
98
99
呼び出しの深さのオーバーフローのため、スクリプトが失敗しました。呼び出しの深さ
が 101 に達しましたが、最大値は 100 です。

ちなみにVBScriptやJScriptは環境依存しますがメモリ容量が足りないというエラーで最後は終了しますがだいたい1000〜2000階層くらいまでいけるっぽいです。あれ、再帰呼び出ししてるときにスタック領域が不足しましたってエラーを見ることがあるんだけどどうやったら出るんだっけ?

b=1
a
Sub a()
	b=1+b
	wscript.stdout.writeline b
	call a()
End Sub
var b=1;
a();
function a(){
	b++;
	WScript.StdOut.WriteLine(b);
	c=a();
}

おまけ。やはりインスパイアされてfizz buzz問題をPowerShellで書いてみた。これ5分くらいかかったので私はだめかもしれません。変数1個でいいですね、よく考えると。てんぱってるとだめみたいです。

1..100|%{$a="";$b=$false;if($_ % 3 -eq 0){$a+="fizz";$b=$true};if($_ % 5 -eq 0){$a+="buzz";$b=$true};if(!$b){$_}else{$a}}
元記事:http://blogs.wankuma.com/mutaguchi/archive/2007/08/05/88870.aspx

Copyright © 2005-2016 Daisuke Mutaguchi All rights reserved

mailto: mutaguchi at roy.hi-ho.ne.jp

Awards

Books

Twitter