matchacci

ein altmodischer Triathlet

matchacci

ein altmodischer Triathlet

最近の記事

アルゴリズミックデザイン学習への拡大

最近はPython学習の方向が一気に分散し、まとまった進化はまだ見られないままなので、noteへの記録をつい怠っていた。 CheckiOは中断したままだ。 まず、参考書を新しくする度に、必ずCLASS絡みで躓いてその先へ行けなくなってしまう、という行き詰まり感があった。 この辺りが脳みその限界かもしれない。だが、このままでは埒が明かないので、言語学習はとりあえず脇に置き、別アプローチでのPython学習を模索することにした。 1. アルゴリズムの学習 模索と言うのは実は後

    • とあるミッション(意外な終結)。

      (前回からの続き) 今度こそきちんとした勝率が求められそうだ。プログラムを以下の式に書き換えよう。  P = w / (n^2 - d) ところが、書き換えようとして、書き換えられないことに気がつく。プログラム中の式はすでにそうなっているではないか…。 これは「考えその1」を式にしたものだった。 また振り出しに戻ってしまったか? ここで念のため、ミッション(英文)を読み返してみた。 するとどうやら、勝率の最も高いパターンを出せ、とはどこにも記されていない。僕が勝手に早合点

      • とあるミッション(三日目)。

        (前日からの続き) 勝率の算出方法が間違っているか。 対戦組み合わせをすべて調べ、勝った数を全組み合わせで割った値を勝率とした。ただし、引き分けの時は0.5を加えている。 この引き分けの扱いが間違っているか。実はルールでは、同じ目が出た場合勝負が決まるまでサイコロを振り続けるとある。引き分けという結果は実は存在してはいけない。 仮にサイコロの目が [1, 2, 3] と [1, 1, 1] 同士を対戦させた場合、後者が勝つことは100%ありえない。だが引き分けを0.5として計

        • とあるミッション(二日目)。

          自然数 (1~18) をn個足して、合計がsになる組み合わせを全て用意する。 これ意外と難しいな。 試しに検索してみたら、それに近い命題のプログラムを作成する試験問題のようなページが見つかった。 それを見て驚く。 制限時間1分。なぬー! 1分でこの問題を解けってか? 考える暇などないではないか。プログラマってそんなに頭の回転が速くないと務まらないのか? 違った、secondは分じゃなくて秒だった。制限時間1秒。解けるわけないだろ! つまりコンピュータが1秒以内に答えられる

          とあるミッション(一日目)。

          CheckiOのミッションへの取り組みを記録に残してみたらどうか、と思い立つ。 頭の中だけで考えていることを文章化して、考え方の流れを客観視してみる。解けるかどうか判らないから中途半端に終わるかもしれない企画。 ”Unfair Dice”というタイトルのミッションは以下のような感じ。正解すると20ポイント、そこそこ大きい。 1対1のサイコロ対決。サイコロを各々1回振り、大きい目のほうが勝ち。ただし、目の数を自由に設定した自前のサイコロで勝負する。ただし目の数の合計はお互い

          とあるミッション(一日目)。

          行列と初めて向き合う。

          高校の数学で嫌いだったのが、行列だ。 こじつけのようなルールに従って退屈な計算を繰り返すばかりで、何をしたいのかサッパリ判らない。まさに穴を掘って埋める的な拷問と思った。昔から僕は暗算が嫌いだ。遅いうえに必ず間違え、自分の注意力のなさに嫌気がさす。 だが、僕がPython習得でぼんやりと目指すAI・機械学習に、行列は欠かせないというではないか。 そんな折、CheckiOの課題で思いがけなく行列を使う場面に出会った。 僕が好きなゲーム"MYST"に出てきそうな、回転型からくり

          行列と初めて向き合う。

          数独を解く。

          CheckiOで数日暗礁に乗り上げている。ズバリ、数独を解くプログラム。 でもこれ初中級問題なんだよね。 数独は一頃よく遊んだからある程度は手慣れている。数独の難易度は3段階くらいあると思っていて、まず初級は、日曜日の新聞に載る程度で、空いたマスを理屈通りにジグソーパズルの如く埋めて徐々に解ける頭の体操レベル。中級は、マスの隅に候補を書き込んで、これがあれだからあれでこれで…と推理を働かせるレベル。 それ以上の難易度になると僕は解き方を知らない。どこかのマスを仮決定して進んで

          数独を解く。

          学んだことをメモ。

          すっかりご無沙汰してしまったのは、向上していない証拠。 自分の中で一つの天井に突き当たり、そこを打破できないでいる。 次第にやる気が無くなって別の勉強に逃げてしまう。 先日クリアした課題でいくつか新しいことを学んだので忘れずにメモしておこう。正しいかどうかより書き留めておくことを重視。 平方根(ルート)は ** 0.5 でできる 電卓にも標準でついている平方根 (sqrt) が、Pythonではmathモジュールをインポートしないと使えない。不便だなと思ったら、それはつ

          学んだことをメモ。

          学びのプロセス

          CheckiOを始めて2カ月と4日が経ってた。1カ月目では98だったミッションクリア数が今は160に。倍になってないのは、難易度が上がり1問にかかる時間が増えたため。レベルは15から19へ。予想通り、上がり方は鈍化しているが、他でもない自分自身が進化を感じていない。判らないジャンルがいまだ多く残ったままだ。クラス関連の問題は、とりあえずすっ飛ばすことにした。最近わりと前向きに向き合い、苦手意識を克服しつつあるのが、再帰処理かな。コツはまだまだ掴めていないが、何となくいじってい

          学びのプロセス

          運動も大事。

          CheckiOはゲームみたいにいつまでもやっていられる。というか、ゲーム欲を失ってすでに久しいので、喩えになってない。 だが、根詰めてやりすぎて身体が鈍るのが困りもの。人間、一時間座り続けると20分寿命が縮まるらしい。それを回避するためには30分に一度椅子から立ち上がることを奨励されているが、それすらろくに守れていない。いつのまにか日が暮れて、部屋が真っ暗になってたりする。 慌てて電気をつける。 昨日から、アルゴリズムが思いつかない問題にぶち当たり手が止まってしまった。コー

          運動も大事。

          割り算と商。

          昨日もおうちでCheckiO。初級クラスの問題だったがドツボにハマって一日潰してしまった。 書き上がったプログラムをチェックにかけると、最後のサンプルだけ値がずれて弾かれる。何がいけないのか? このミッションのテーマは分数の足し算と掛け算。小学生レベルだ。 分数の計算では、通分する過程で分母や分子が大きくなることがある。どうやらその巨大化した値がエラーに関わっているらしいと気づいたが、そのからくりが判らない。 Pythonには整数のint型と小数点数のfloat型がある。

          割り算と商。

          欲しい機能は自分で作る。

          文字列の中からお目当ての文字の位置を取得するメソッドとして、find()とindex()がある。 >>> "kakinotane".find("tane")6>>> "kakinotane".index("tane")6 find()は探しているものが含まれていないと-1を返し、index()はValueErrorになるが、その違いだけでなぜ二つ必要なのだろう? 融通の利かない神経質な奴とは付き合いたくないので、find()を使っているが、探す場所が文字列ではなくリストの

          欲しい機能は自分で作る。

          12:00pmとは昼なのか夜なのか。

          CheckiOでは自分の書いたプログラムを公開できる。 まあ、初心者の未熟なコードなど普通関心ないと思うが、それでも僕のコードにI like this soluthionとコメントをくれた奇特な方がこれまでに二人いた。 なぜかそれは同じタスクだった。何が彼らの関心を惹いたのだろう? 「24時制を12時制表記に切り替えよ」  例)15:45 → 3:45 pm 単純そうに思えるミッションだが、欧米の12時制の表記には一手間かかる。日本では午前0時、午後0時と表現するところを

          12:00pmとは昼なのか夜なのか。

          読むトレーニング

          プログラムというのは圧倒的に、書くことより読むことのほうが難しいと思う。 コードを打ち込む先から、書いたことがぼやけてくる。少し経ってから改めて眺めると、もはや自分が書いたことも信じられない気がしてくる。これほどまでに、自らが産み出しておきながら理解できないことがほかにあるだろうか。 それとも、読む練習が足りないってことか。 僕は、楽譜を見ながら演奏する音楽家を見る度に感心してしまう。あんな記号の羅列を曲のスピードに合わせて理解し、演奏へとタイムラグなく結びつける技術を有す

          読むトレーニング

          10分以上は論外。

          今日の気づき。 「1500mTTで最も速いタイムは?」 1500mのタイムトライアルを行った。5人の結果をリストに入れてある。 ["7:25", "6:30", "4:39", "5:28", "5:16"] 最も速かった or 遅かったタイムは? …のような、タイムの比較をするタスクが出た。 リストの最小や最大はmin()やmax()メソッドですぐ探し出せる。だがタイムは数値ではなく文字列になっている点が曲者だ。なーに、簡単だまかせとけ。分:秒表示を秒にまとめ数値

          10分以上は論外。

          if文をリストラ。

          CheckiOの住人から拝借したテクニックは備忘録的に記しておこうと思う。 つい先日知ったこのテクニックは目からうろこ。 二択の条件分岐で、それぞれなにかを割り当てるなどの場合(以下例)、 if a < b:    x = 1else:    x = 2 これがひとまとめに書ける。 x = [2, 1][a < b] 4行が1行になった! すばらしい! ブンダバー! これは、ブール型のTrueとFalseがそれぞれ1、0と等価であることを利用したもの。なので条件が真の

          if文をリストラ。