忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/11/23 09:47 |
PHP5.3 カッコつけないPHP
物凄い今更ですが、↓こちらで括弧の数勝負というのをやっていたのを発見しました。
http://e-arrows.sakura.ne.jp/2010/08/is-lisp-really-has-too-many-parenthesis.html
残念ながら我らがPHPのコードがありませんので、底辺ぺちぱーの端くれとして挑戦してみましょう。

プログラムの仕様は以下の通り。

・指定数までの階乗(factorial)を表示するプログラム
・指定数はコマンドライン引数で指定できる
・20を指定したときの表示は以下
・引数が指定されなかったときは1の階乗
・括弧として(){}[]をカウント

ん?「指定数はコマンドライン引数で指定できる」?
大丈夫!PHPだってコマンドラインで実行できるんです!
まあ普通そんなの使うくらいならPerlやシェルスクリプトで書きますけどね。

まずは素直に書いてみる。
	//引数
	if(isset($argv[1])){
		$count = (int)$argv[1];
	}else{
		$count = 1;
	}
	
	//階乗
	$factorial = 1;
	for($loop=1; $loop<=$count; $loop++){
		$factorial = $factorial * $loop;
		print($loop . "! = " . $factorial . "\n");
	}
簡単ですね。
括弧の数は20個となりました。
では実行。

> C:\xampp\php\php.exe ./factorial.php 20
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 3.55687428096E+14
18! = 6.402373705728E+15
19! = 1.2164510040883E+17
20! = 2.4329020081766E+18

はう!32ビット整数値の上限を超えてしまった!
いやー64ビットOSだったらこれで動くはずなんだけどなー
まあGMPとか使っての検証はまた今度ということで、とりあえずこのまま進めてみます。

表記上不要な要素とかを減らしてみます。
	//引数
		$count = empty($argv[1]) ? 1 : (int)$argv[1];
	
	//階乗
	$factorial = 1;
	for($loop=1; $loop<=$count; $loop++):
		$factorial = $factorial * $loop;
		print $loop . "! = " . $factorial . "\n";
	endfor;
括弧は半分の10個まで減りました。
これがエラーの発生しない最低限の書き方だと思います。

ではエラーとか気にせずとりあえず動けばいいやレベルの書き方で。
	//引数
		$count = $argv[1] ? $argv[1] : 1;
	
	//階乗
	$factorial = 1;
	for($loop=1; $loop<=$count; $loop++)
		print $loop . "! = " . $factorial = $factorial * $loop . "\n";
引数が無い場合Undefined offsetのNoticeが発生しますがとりあえず動きます。

括弧の数は…6個か、あまり減ってないな。
PHPは使い方が平易って部分を追求してるので、括弧の定義変更みたいな裏技チックな書き方があんまりできないんですよね。
まあ、できるけど私が知らないだけって可能性もありますが。

引数のデフォルト1ってのが厄介で、このせいでどうしても括弧二つでは足りないんですよねえ。
どうしてもデフォルトが0になってしまうので。

ん、ではこういうのはどうだろう。
	$factorial = 1;
	print "1! = 1\n";
	for($loop=2; $loop<=$argv[1]; $loop++)
		print $loop . "! = " . $factorial = $factorial * $loop . "\n";
括弧が4つまで減ったよ!
なに?なんか卑怯?
まあそんな気がしないでもない。


これ以上減らすのはさすがにPHPの言語仕様上無理なんじゃないかなあと思います。
とか言ってさっくり減らされたりしたら恥ずかしいですが。
PR


2011/06/01 22:49 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<Dojo1.6.1 dojo Dojo道場01 dojox.charting.Chart2D | HOME | Dojo1.6.1 dojo djConfig="parseOnLoad:true">>
忍者ブログ[PR]