Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-01-02

お題: コラッツ・角谷の問題 等々

| 22:46 | お題: コラッツ・角谷の問題 等々 - わだばLisperになる を含むブックマーク はてなブックマーク - お題: コラッツ・角谷の問題 等々 - わだばLisperになる

(120)お題: コラッツ・角谷の問題(Common Lisp)

お題の名前からして、久々に数学的で複雑な問題だー、と思って無理だと思い放置して風呂に入って寝ようと思っていましたが、どうにも気になって眠れなかったので、どういう仕組になるのかだけ簡単にさらってみることにしてみたら、そんなに嫌がる程の問題でもなかった様子。

別名3n+1問題ともいわれる有名な問題らしいです。

ひたすらCPUをぶん回すだけのコードでしたが、とりあえずできたので投稿してみました。Common Lisp部門2着。

他の方々は、賢くメモ化とかして高速化をはかっていました。そうなのか! メモ化とかするもんなのか!

投稿してから自分も真似して自作のものをメモ化などをして高速化をはかってみましたが、ハッシュでのメモ化による高速化具合と、数字を全部fixnumで宣言し2の割り算を左シフトしてコンパイラの頑張り任せにする馬鹿バージョンを計測したところ、どういうわけか割り算をシフトにした方が速かったので、まあ、これでも良いや、ということにしました。

fixnum宣言+左シフトは、SBCLそのままの割り算に比べて8倍位速くなるんですよね。どういう理屈かは知りませんが…。

3の掛け算も右シフト+Nにした方が若干速くなるし、fixnum宣言とシフト命令って相性が良いんでしょうか。まあ、fixnumの範囲を越えるとまずいですが、今回は範囲内なのでOKです。

(27)お題: リストを逆順に表示 (Lisp 1.5)

Common Lispに加えて、馬鹿っぽくLisp 1.5でも挑戦してみることにしました。

標準でREVERSEはあるっぽいんですが、自分が使ってるキットにはないので自作。まあ、次回からREVERSEの定義は省略ということで。

(16)お題: アレイのuniq (Lisp 1.5)

MEMBERも標準で付いてくるっぽいけどないので自作。マニュアルで確認しないといけないのが若干面倒なのでLisp 1.5関数一覧とか作ろうと思ったり。

(49)お題: 隣り合う二項の差 (Lisp 1.5)

一応再帰でも書けるので、再帰で書いてみた。

(120)お題: コラッツ・角谷の問題(Lisp 1.5)

Common Lispの内容をLisp 1.5で。7時間回して一応正しい答えだったので投稿。

  THE TIME ( 0/ 0  000.0) HAS COME, THE WALRUS SAID, TO TALK OF MANY THI
NGS .....   -LEWIS CARROLL-
 END OF EVALQUOTE OPERATOR
             FIN      END OF LISP RUN

それはさておき、Lisp 1.5では、実行が終わるとこのように表示されるんだけれども、この時間のところに実行時間とか入って欲しいなと。

どうするんだろう…。エミュレータじゃ無理なのだろうか。