« HHK Professional2 | main | 相手の意図を汲み取る方法 »

フィボナッチ数列(Perlにおける&&とand)

今日の夕飯は彼女と地元で。テーブルに案内されるとテーブルクロスの代わりに紙がしいてあり、何故か置いてあったクレヨンを掴んだウェイトレスが「本日このテーブルを担当させて頂きます○○と申します」などと言って自分の名前をテーブルに書くのだ。これはなかなかインパクトが強くておお、と思った。
しかし紙とクレヨンがあると、人間何か描いてしまうものである。あんぱんまんやらオバQやらを二人で落書きするのに飽きると、そこはやっぱりコードを書く事に。彼女曰く「1..100のフィボナッチ数列をプリントするコードを書け」


フィボナッチ数列はアルゴリズム系の授業を取ると真っ先にやらされると思う。まあとにかく描いてみようと言う事で、クレヨンでざっと書いたのはこんな感じ

map{print(($_<3)?$A[$_]=1&&$A[$_]:$A[$_]=$A[$_-1]+$A[$_-2]&&$A[$_])}(1..100)

んでちょこっといじって彼女が持っていたiBookで実行
$ perl -e 'map{print(($_<3)?$A[$_]=1&&"$A[$_]\n":$A[$_]=$A[$_-1]+$A[$_-2]&&"$A[$_]\n")}(1..100)'
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000$

がーん
なんか&&の手前が帰って来てしまっている気がするので、とりあえず普通にprintを外に追い出してみる
$ perl -e 'map{$A[$_]=($_<3)?1:$A[$_-1]+$A[$_-2] && print "$A[$_]\n"}(1..100)'


(中略)

$


なにも帰って来なくなっちゃったよ。。
&&をセミコロンに変えてみる
$ perl -e 'map{$A[$_]=($_<3)?1:$A[$_-1]+$A[$_-2] ; print "$A[$_]\n"}(1..100)'
1
1
2
3
5
8
13
(中略)
$

やっとできたーー。けどセミコロンはワンライナー的には反則だろ。そして二行書いて両方評価するのって&&じゃなかったっけ?
ふと思いついて&&をandに。
$ perl -e 'map{$A[$_]=($_<3)?1:$A[$_-1]+$A[$_-2] and print "$A[$_]\n"}(1..100)'
1
1
2
3
5
8
13
(中略)
$

ってことはー
$ perl -e 'map{print(($_<3)?$A[$_]=1 and "$A[$_]\n":$A[$_]=$A[$_-1]+$A[$_-2] and "$A[$_]\n")}(1..100)'
syntax error at -e line 1, near "1 and"
Execution of -e aborted due to compilation errors.
$

あれ?
$ perl -e 'map{print(($_<3)?($A[$_]=1 and "$A[$_]\n"):($A[$_]=$A[$_-1]+$A[$_-2] and "$A[$_]\n"))}(1..100)'
1
1
2
3
5
8
13
(中略)
$

こうか。
改行コード無しならこれで行ける
perl -e 'map{print $A[$_]=($_<3)?1:$A[$_-1]+$A[$_-2]}(1..100)'

てなことをやってるうちに彼女はテーブルクロスいっぱいに頭にチューリップの生えた女の子を書いていた。脳の具合は大丈夫か。てかごめん。

さて、大抵の参考書には"&&とandは同じものである"と書いてあり、ちょっと気の利いた参考書には"andは&&よりも優先順位の低い論理積演算子である"と書いてある。でも中盤の&&とandの振る舞いの違いはそれでは説明出来ないような。。
バッドノウハウとしては「ワンライナー使いたきゃandと()を多用しろ」だけれども、折角引っかかったんだからまともな知見を得たい。考察plz。

トラックバック

このエントリーのトラックバックURL:
http://polog.org/mt-tb.cgi/372

コメント (6)

p-man曰く
"
22:46
perl -e '$_[$_] = $_[$_-1]+$_[$_-2]||1, print "$_[$_]\n" for 2..101'
22:46
これじゃ
22:47
だめですか?w
22:47
カンマで
22:48
順次実行して
22:48
最後の文が返した
22:48
値が
22:48
その
22:48
行の
22:48
値という事を利用して
"
なるほどー
ある行の最後の文を返り値に使うならカンマがいいってことだね。勉強になりました。

演算子の優先順位ってたまにはまりますね.

そういえば今度見せたいものがあります.ふふふ

おおなになに?
WEBから見れる!?

これRubyだとマジでA=[]が必要なのか。
ruby -e 'A=[] and 1.upto(?d){|i|A[i]=(i<3)?1:A[i-1]+A[i-2]and puts A[i]}'
宣言が必要なのはやっぱ本当にアレだなー。多次元ハッシュ作る時とか面倒くさい。

近いうちにアップします−.
クックパッド使って朝飯作ってみました.いいっすねこれ.

おお!ありがと :D
最近のオススメはこれ
http://cookpad.com/spainlily/recipe/246705/
パルメンザンチーズとズッキーニ+味噌と言う意味の分からない組み合わせを電子レンジに放り込むだけ。
くそうまい。

コメントを投稿

Powered by
Movable Type 3.34