「1から100の整数を出力してください。NoteHomeQiitaTwitterGitHub「1から100の整数を出力してください。Diverに行ってきました。ShigeoLT枠の「forやめろ」なんですが、「1から100までの整数を出力してください。5つの異なる方法を用いて」というお題が出てきます。これが今になって気になってきたのでPHPで解いてみようと思います。趣旨的に、最適解とかじゃなくて、いろんな書き方をした方が得点高そう。forとインクリメントforやめろって言われてるのですが、とりあえずforです。Deviceとかで展開しない限りは、これが最速解になると思われます。(100個ぐらいなら違いはないだろうけど。PHP_EOL;}やってることが出力だけなので、もう少し縮められますね。PHP_EOL);echoはforの()の中に書けませんが、printは戻り値があるので式として書くことができます。whileで書きなおしても回答としてつまらないので、単純なfor系はこれぐらいにしておきます。range()1..10みたいな演算子はPHPにはありませんが、range関数で連続する値を持つ配列を作ることはできます。これ系の引数はよく悩みますが、rangeは「始まりの値」「終わりの値」を指定します。PHP_EOL;}こっちはforと違って最初に大きな配列をメモリ上に作るため、富豪的です。100程度なら大したことはないでしょうけど。PHP_EOL;});逐一出力しろとは書いてないので、連結してから出力することもできますね。100));これが思いつく限り一番短いかな。0-9を2つ組み合わせる(直積演算)ここまで、だいたい普通の書き方だったので、無理やり感のあるのをいくつか考えてみます。forというか、「1-100の整数」の定義って何だろう?みたいな方向で考えます。お題で出力しろと言われているのは1から100までですが、別に見た目が数字であればよくて、文字列で組み立てても大丈夫でしょう。JOIN的なやつ)をすると、00-99を作ることができます。これに1を足せば1-100が出来上がります。}}「文字列として結合して1を足す」って書き方は弱い型付けならではで、かなり気持ち悪いですね。SQLだと「おー集合演算っぽい」ってなるんですが、手続型で書くと、単にループを2重にしただけの普通の見た目になってしまいました。reduceで数え上げる部屋に何人いるかとか、箱の中のケーキの個数とか、何か数える時は、「ひとつ、ふたつ...」と指折り数えるものではないでしょうか。この様子をそのままプログラムに落とし込むのはどうでしょう。100個の1を含む集合を用意します。これを順番に足していき、中間報告をさせてやれば、1-100の出力ができそうです。$current;});reduceで副作用のある命令を書くのはどうなんだ、って気もしますが、一応動作します。漸化式と制限演算1-100ということは、自然数の最初の100個ってことです。自然数って、ある値に1を足したら次の値が求まるので、漸化式で書くとこんな感じでしょうか。1これをそのままプログラムに落とし込むと、「自然数全体」を表す仮想的な集合を作ることができます。これに制限を加えて最初の100個だけを取り出すと、1-100の整数が出来上がります。(冷静に考えると、めっちゃ遠回りしてるだけなんですが...)PHPで仮想的な集合と言うと、要するにイテレータかジェネレータのことになります。PHP_EOL;}NaturalNumberIteratorだけだと、1から無限に数字を作っていってしまいます。(実際はPHPのinteger型は無限精度ではないので、PHP_INT_MAXを超えるとfloatに変わって動きがおかしくなります)LimitIteratorはイテレータのうち任意の指定した区間を取り出してくれます。こっちはrangeと違って「読み飛ばす個数」「取り出す個数」が第2第3引数です。「ある性質を持つ集合」を定義して、「制限演算」を作用させて、目的のものを得る。見た目はあんまりイケてないですが、ちょっと宣言型っぽくなりました。ちなみにジェネレータだとこうなります。こっちの方がやっぱり読みやすいですね。PHP_EOL;}飽きてきたのでまとめぶっちゃけ1-100を出力するぐらいならforかrangeでいいし、それ以外の書き方をしていたらコードレビューで文句言われると思います。イテレータとかジェネレータは抽象度が高いので、ループ構文の中にごちゃっと書くより、きれいに書ける可能性があります。使い方を覚えておけばプログラマとして幅が広がるんじゃないでしょうか。QiitaあとはGinqとかUnderscore.phpでも書けそうかなー。NAKANOSeesaaブログ×この広告は180日以上新しい記事の投稿がないブログに表示されております。