2013年12月18日水曜日

ぷよぷよクエストあーけーど。

ぷよぷよクエストアーケードにはまってしまった。
LispとProjectEulerはお休みしています。

思ったよりもぷよぷよである。パズドラそっくりの移動で、でも連鎖システムがぷよぷよである。

録画してダメージ計算式を調査してみている。などと自己紹介してみる。思ったよりこの解析面白いです。

2013年11月24日日曜日

Lispにおける小数の精度に関して

Lispにおける小数の精度

ProjectEuler を回答中に、要求される小数の精度が12桁ある問題があって、、、具体的には問題267のことなのだが、LispCabinet の SBCL にて回答を入力、さて実行したら、桁数が足りない。どう見ても10桁ない。というわけで調べた。

数値としての表記は共通で
(仮数部)*10^(指数部) の値をあらわす
[+|-] 数字 小数点 数字 指数マーカ [+|-] 数字
仮数部 + 指数マーカ + 指数

Lispでの浮動小数型には4種類あるそうな。
  • short-float : 小精度 : 指数マーカ s, S 
  • single-float :単精度:指数マーカ f, F
  • double-float : 倍精度 : 指数マーカ d,D
  • long-float : 長精度 : 指数マーカ l,L
指定しない場合は:*read-default-float-format*シンボルに指定された型が選ばれる。また、指数マーカe,E もある。これもデフォルト型ということのようで。

REPL上の表記としては 1.3590813e9 のようになる。

実際の挙動に関して

LispCabinet : SBCL における動作
  • s,f はe とみなされる様子
  • d,l はl とみなされる様子
  • 表示される仮数の桁数は、e => 7桁、d => 17桁
    • d のとき18桁の場合もあった
    • 結果の仮数値で後ろ(?)に0しか続かない場合、0省略される
      ※後ろとは:小数の位数が大きな側のことを言いたい
  • コード上の定数にd, l を指定した数はその後の計算も小数として扱われる
基本的に整数のみで割り算・掛け算していると自動的に有理数として扱われるのがLispシステムである。どこかに小数を割り込ませるとその後の計算がすべて小数となる

参考:

Wikipedia:浮動小数点数
数と算術演算(M. Hiroi's Home Page)
CommonLispのお勉強 (S_Nayakama 氏)

注意書き

※仕様は確認していません。
※SBCL (on LispCabinet) 以外の挙動についても確認していません。
※確認するほどの元気もやる気も責任感もないのです
※適当です

一言

整数の計算は基本的に無限桁数なのに比べると、小数側のサポートはIEEEの仕様を超えることはない様子というのが不思議といえば不思議。
と思っているだけで、実際扱う方法もあるんだろうなーなどと夢想したり。
そもそも目的である問題267はアプローチが正しくなかったようで正答が出ていないので精度は問題ではなくなってしまった。

2013年11月16日土曜日

mapcar と計算で突破する Project Euler

Lisp の勉強にと思ってはじめた ProjectEulerが面白すぎる

有名な「プログラミング問題サイト」は、多くがLispに対応していない。
  • ×:PKU Judge System -> C, C++, Java だっけ
  • ×:AOJ Judge System -> C, C++, Java,, だっけ???
  • ×:Top Coder -> Java, C++, C# は知っている
  • ○:shinichiro_h さんのゴルフ場 -> 言語のたまり場状態
  • ×:Code Golf 本家 -> たしかダメ, Perl, Python, Ruby だっけ?
有名、は有名だろう、考えてみたら自分があんまりサイトを知らないだけのような気がしてきたがまあいいや

ProjectEuler の特殊で面白い点は
  • 目的は「結果」であって「過程」は各回答者の自由
    • 公式にも「WEB探して答えを見つけちゃうこともあるだろうけど、
      でも、あなたはそれでいいの?」と書いてある。
      スタンスがわかる文書である。
  • 問題がよく作りこまれている
    • 主観ではあるが。
  • 回答は「答えの数字」であって「プログラム」でも「実行結果」でもない
  • 正答者のみが閲覧可能な回答スレッドでは、コードの公開がされているが
    簡単な問題でも思いもよらない方法があったり、もっときれいなコードにあったりと
    勉強になる
    • 答えだけならいくつかぐぐれば見つかることは確認済みだけれども。
一口に言って、プログラミング自体を勉強したいなら、圧倒的にTopCoderが選択肢ではある。本番環境だし、言語も今はやっているものだし。競争相手も多いし、問題も良く練られていると聞いているし、なにより「Challange」システムがコードの向上につながるだろうし。
けれど「解けるとわかっているものをあの手この手で解く行為」を楽しめるという点にはまった。自分にはわからないけど、確かに解ける方法がある、でもわからない!わくわく感がある。

問題はすべて英語なので、その点ハードルは高いかもしれないが、、、有志の日本語訳ページもあるので、どうしてもという場合はどうぞ。あと、エキサイト翻訳やGoogle翻訳でも多くの問題は大丈夫と思うぞ。一番問題なのは、翻訳ではなくて問題自体の難しさだし。

ああ、面白い。

最後に、雑感。
  • 多く使われている(使っていると主張されている)言語が統計で見られる
    • Mathematicaは知っていたが、PARI/GP , Sage, APL/J/K、、現代はすごいな!
    • Spread Sheet  vs Pencil/Peper :回答力では SpreadSheetが勝る様子
    • Lisp !!!
  • 今のところ「使った」アイデアは
    • バックトラック
    • どうしても解けなくて遺伝的アルゴリズム => でも解けない orz
  • 言語の導入にも面白そうだ
    • 簡単な問題であれば「答えさえわかればよい」ので。
      簡単な計算がプログラミングできますか?ということ。
      これがやってみると難しいものです。
    • ただし、多倍長整数への親和性はなるたけほしいかも。
      • その点Lispは「組み込みで対応」なのが壁の低さにつながった
      • C/C++だとライブラリないし自作必須だからなあ、、、。

2013年10月20日日曜日

Lisp のわからんところ

さすがに我ながらひどい文章を書いたので、記事ごと修正。原文は残しておく。反省。

わからないのは確かなんだ。一番決定的な違いとして認識したのは「データ構造」。変数があって、配列があって、構造体があって、という慣れ親しんだ構造が利かないこと。

ああ、一度勉強したことがあるので、それ以外のデータ構造があるのは知っているけれど、、、少なくとも、「実用CommonLisp」の2章までは出番がない。それに、どこまでいっても”リスト”とは切っても切れない縁になるという感覚はある。壁なんだろうな。”リストを処理する”感覚に慣れることが。

ループではなく再帰 を多用する(loop 構文があることは知っている)
if は分岐だが、処理の分岐というよりは終了条件の検出用

慣れるのには時間がかかりそうです。試すしかないですね。

さじ、なげかけました。まあ、私は私がさじ投げても不思議じゃないんですのでいざとなったら投げますがね。




以下原文

原題:Lisp、、まあ、、、してるんですけど、、、

早速飽き始めた。我ながら早いものだと思う。なんでって、なんか、難しいんだって。
思った以上に、考え方の転換の度合いが強いんだって。

現状、第二章まで読み進めている。第三章にLispの言語概略があるため、実際問題この本のHelloWorldを抜けていないぐらいなのだが。ええ、なんか、難しいというか難しく考えてしまうというか。ちょっとわからないのです。わからなくなっている感がヤバイ。

C,C++,C#といった「手続き型」の言語をずっと勉強してきたわけだ。「まず、変数を準備して、それを足して、割って、引いて、、、」「繰り返しはfor, while」「分岐はif」「結果はprintfで」

でも、今のところ出てきているLispのそれは
「シンボル」「リスト」「ifは実行する式を選択する」「リストのいくつかを処理して、リストの残りを再帰処理する」「そもそもREPLが今のところのすべて」
おお、今までの考え方が受け入れられていない様子を覚える。カッコイイ様子には再帰が前提ですか。データ構造がリスト以外見えないですか。という先走りを、、だな。

、、、一度は勉強したんだけどなあー。


そんなことより何が一番困ったところかって、別途参照している問題集

L-99
ProjectEular

この両方ともについてアプローチする方法が(片方はLisp用なのに!)思いつかないというか、なんか、「これでいいのかな、、、」感が半端じゃないというか。

ああ、愚痴っぽいな。ここで失礼。

2013年10月5日土曜日

投資に関して、第02期最後の投稿

最後に感想だけ述べておこうかと。ちなみに「私はいまだに投資を開始していない」

NISAとの付き合い方を考えてみた

1.あせらないこと、すぐ始めないこと。
2.投資であることを意識すること。損すること、得することを考えること
3.5年後は普通の投資と変わらなくなることを忘れないこと
4.本気でやると意外と小額であるということ。勉強用に使うということ(自分の場合)

複利の力について考えてみた

1.皮算用に使わないこと
2.許容できる”損”をどれぐらい持つかを見るときに数字は重要であるということ
3.利率と実際の額を常に見比べること
4.特に影響するのは、インカムゲインの再投資と、手数料であるということ

投資について考えてみた

お金をただ寝かせておく、なんとなく以上ではない定期預金に預けるだけというのがイヤで投資してみたいと考えたのだった。今の定期預金、もし計算どおりなら年率1%行くんだけど、それより少したかければ、意味があったとたぶん思うのだろうと

そのうちはじめよう。すぐあせって始めるものでも無いし、大体NISAも1月から本番だし。


第02期の自己集計

第02期開始:2013/07/02
第02期終了:2013/10/05
期間長さ:95日

(NOTE:第03期開始も本日:2013/10/05とする)

もっとも読まれた記事:
NISAについて今のところ

反省:
1ヶ月以上あけたことだけは真摯に反省すべきと思う。原動力が”失われている”のを無視したのだから。宣言しますと言っておいてこれだよ!適当に、とか言っておいて適当にやらないのが悪いのだ。まったく。

OK,投資の勉強は飽きた。第02期終了のお知らせだ。第03期開始のお知らせだ。

うん。飽きたんだ。というかたぶんなんとなく続けてなんとなくやる感じになってきたから終わることにしたんだ。スタートダッシュは(自分の中では)終わった。スタートラインにたつ前に。

スタートラインにまた連絡しますね。誰にかは知らないが。

少なくとも、このブログを「あー、投資の勉強もうしないわー、投稿することないわー、投資のことやらないとなー」なんて思いながら何もしないよりずっといいかなということで。

次に最後の投稿をして、僕は第02期の終了を宣言する。



と同時に、第03期の開始を宣言したいと思う。

今は「Lispに夢中」だ。夢中は言い過ぎた。たぶんまたすぐ飽きます。

あー。うん。「実用CommonLisp」という積読本を取り出したら思ったより面白かったのでやってみることにした。今までなんとなく名前は聞いていた「PAIR」本の日本語訳だそうな。

何気にLispに興味を持ったのは結構前だ。大学4年ぐらいのときか。初めてのLispも実践CommonLispも、OnLispも、LOLも買った。目を通して、すぐ積んだ。Shibuya.Lispの開始時に名前だけ入れてもらった人の一人だったりする。あの時は何もわからなかったし、今も何もわからない。勢いだけの情熱も無くなったけど、まあ、面白そうだし。俺は俺のためにLispを学ぶのである。

さて、後ひとつ。個人名(とハンドル)は挙げないが、Shibuya.lispが生まれた当時に知った方が、いまでもLisperとして活躍(暗躍?)しておられることもひとつまたやってみるかという原動力になった。その当時引きこもりしてます、とか言っておられたようなそうでもないような。私はあなたの影をこっそり追いかけています。ええ。