cametan_42さんのブログをしばしば、時々読んでます。其の中の課題です。エラーチェック、出力なしです。次回にもう少し直してみます。
ワーニングが一個、wが値が決まらないうちに使っているとか?、使ってない変数もありました。suitsはワーニングでないようです。
cametan_42さんのブログをしばしば、時々読んでます。其の中の課題です。エラーチェック、出力なしです。次回にもう少し直してみます。
ワーニングが一個、wが値が決まらないうちに使っているとか?、使ってない変数もありました。suitsはワーニングでないようです。
「三山崩しゲーム」のネタ本は、林晴比古さんの「C言語による実用アルゴリズム入門」です。cametan_42さんが「石取りゲーム」をjavaで書いてたのを見て、前にもやったかもしれませんが、VBで一度書いてみて、それをScalaに直せるか?やってみたくなりました。出来ればcametan_42さんが言うところのREPLですか?でなければ、単に移植でも。
上はサンプルの実行とは違いますが、サンプルでも同じ結果だったので、一応良いと思います。もしかしたら、これではコンピュータが必ず勝つに思いますが。
追記)
コードをWPに貼り付けてみました。
今は、我が地区にあった小学校と中学校、もう閉校になって数年が経ちますが、自分の子供が小学生の頃だったと思います。先生ではなかったので、事務員だったと思います。笹野さんという方が、日本一だと言ってました。その後、一度フラッシュ暗算の日本一でテレビに出たのを見たことがあります。
Cametan42さんのブログに、フラッシュ暗算の事があったので思い出しました。
フラッシュ暗算のモデルみたいのを書いてみました。VBです。
警告が一個、意味わかりません。現在は、1から10迄の和が答えです。これを乱数を使ったり、表示時間を短くしたり、考えられますね。
笹野さんのことを探してみたら、10年以上前ですが、少しありました。
インデックスは使わない、方がベターらしい。
このような例は、Scratchには向いていないかもしれません。視覚に訴えるのが、適しているように思います。このままバンザイでも、面白くないので、VBでやってみました。
Button1は足し算で、Button2は引き算。チェックはしていません。
0時5分から12時までは、11時間55分。この例はあってるようです。Scratchは、それに適した例もありそうですので、参考書を買うことにしたので、それに従ってみます。
cametan_42さんのブログにローマ数字のことが載ってましたが、見当がつかないので、日本式をやってみました。途中です。書いてある場所が思い出せないので、あとから探してみます。見つかったので、リンクを訂正しました。
零は最後以外は、零千とか入らないでしょう。
訂正しました。
配列を使った方法では、制限が付きそうです。前回は数字から文字に変換でした。その点は今回も同じです。QueueとStackを使うのでループは一回です。関数型はループも駄目なようです。(涙)
QueueとStackなら配列のような制限は無いでしょう。VBでも学習することはありそうですが(LINQ)、F#で関数型プログラミングもやってみたいし、どっちも中途半端なりそうです。(笑)
前に書いたものよりかは、分かりやすい。ハマらなかった。8行目Int()を付けないと、計算がおかしくなった。切り捨てで無いようです。
関数型プログラミングでは、駄目なんでしょうね。変数を使って、値を変えているので。例えば、これが大きなプログラムの一部だとして、バグの入る可能性は有るんでしょうか?
パスカルの三角形の出し方については、配列を使っての方法では、答えを出したつもりです。でも、なんか自分の方法は、違うんではと思う書き込みがありました。いつものcametan_42さんの書き込みです。数学的表現に全くついていけないので、馬の耳に念仏、状態の自分です。(笑)
パスカルの三角形にならって、簡単なものをと思って、やってみたのですが、ハマってしまいました。偶数行で同じ数値が2個並ぶとこで、おかしくなって、試行錯誤しました。その結果がコメントで残してます。
あとから気づいたのですが、もっと簡単な方法が有ると思いました。一行での出力で、奇数なら無いが、偶数なら上の図のように、最後の行で5,5となっているように、なる。妙にw += 2を入れたのが、間違いだった。まだやってみてませんが。
そろそれF#に戻らないと、思い出せなくなるので、Tourに戻ろうと思います。
速度を単純に比較してみました。時間計測は、DOBON.NETから拝借。
実行時間は、かなり違いますね。10万分の1ですか?もし、これが仕事で毎日やるのだったら、末尾再帰を使いたくなりますね。スタックの使用状況は分かりませんが、もしかしたらスタックで処理できない分は、遠いところにおいているのかもしれません。もしかしたら、人間でいうと暗算できなくて、紙に書いて計算している?
結果の出力を見ると、数字がきれいに並んでます。cametan_42さん(ブログはこちら)によれば、関数型のプログラミングではデータをひとまとまりに考えるということです。この場合はどうかというと、何行で多少違いますが、行さえ決まれば、数字の列が作れそうに思えます。それはこれから考えます。つまり行数と項目順をパラメータとした一般解を求めるということになりませんか?
VBでは配列を作ったときに、初期化されます。確か?なので0をセットするのはやめます。ついでに出力もしません。
追記)配列を使う方法以外は、難しかったので、置いときます。(涙)
再帰とか末尾再帰に関しては、理解途中です。ただ、普通の書き方をすると、スタックが消費されるし、無駄が多い、それはなんとなくわかります。同じ計算を何回もしているし、例えば5回再帰の呼ぶとすると、最後のリターンが行われないと計算が終われない。それを回避するのが、末尾再帰だと思います。
理解途中でやってみたのが、上です。VBでもそれらしくは書けます。1から10迄の和とフィボナッチ数列の10番目が共に55です。(笑)単なる偶然でしょう。ここららはもしかしたらですが、末尾再帰では最後のリターン(上だとaccとかa)が答えになっていると思いますが、確かめていないので、推測です。
末尾再帰の説明のコメントを頂きました。< cametan_42さん
普通の再帰と末尾再帰をじっくり見てみましょう。これからですが。(笑)結果は正しいので、VBでも末尾再帰はしてるんでしょう。出来れば、Stackの使用状況が分かれば納得なんでしょうが、やり方が分かりませんし、先ずは使えることです。
cametan_42さんのブログはSchemeの回答だと思いますが、手続き的な思考(それにどうしてもなってしまいます)で、二重ループで解けるようです。
追記)
再帰でもできそうですので、やってみました。結果は配列に入れてますが、やっぱり配列に保存ですかね。
いつもadvancedなコメントをくれます、cametan_42さん(ブログ)、有難うございます。最大公約数を求めるC言語のコードを示してくれました。これならVBでも出来そうと、recを宣言しない、VBでやってみました。関数型とは書く人の思想なのかもしれませんね。勿論、適している言語とそうでない言語はあるでしょう。関数型は変数という言葉を使わない。適した言語は、”束縛”という言葉を使う。再帰も使うのかもしれません。手続き型とは結構深い溝がありそうです。
tupleはデータのタイプではないようです。データのタイプならDim atuple = new Tupleとか、書かないと行けないんでは?でも、newは無いけど、形式には有っているか?Integerなどはnewで宣言しなくてもいいはず。Dim aint As integer = 100と書けるはず。でも、型の類推があれば、Dim aint = 100とも書けるはず。()の項目は、Itemに1から始まる数値をつけて、アクセスできるようです。
Visual Basic では、tupleとは、()で括られた、2個以上アイテムが有るデータのセットかな?
tupleを配列にしてみました。