星田オステオパシー

プログラミング学習日記 2022/08/15〜

2022/09/11
話題1 Sony ReaderでR7Rsを読み始めました
 やっとかい!いや、PDFファイルってKindleだと読みにくいんですよ・・MOBI形式とかだとテキストデータとしてレイアウト・フォント変更とか出来るんですけど。
 そこで1画面を4分割して別ページのごとく扱えるReaderの出番。これならなんとか読める。これだけのためにReaderは存在する!

話題2 プログラミングの基礎 クイックソート実装
教科書のOcaml版クイックソート、コメントだらけで意味不明だったのでFilterを使って出来そうじゃないか?と作ってみることに。

 なんかこういうイメージで作れそうじゃない?と思ったんですが・・駄目か・・

 検索したらWIKIにご丁寧にSchemeで書かれたクイックソートの例が。そうそう!こういうのが書きたかったの!
 興味深いのは(compose not func)ですかねぇ・・なるほどこれで「ではない手続き」を簡単に実現できる!あれ?なんか随分前にCametanさんの記事で教えてもらってた気がする・・まあ、忘れる生き物ということで。
 分かってなかったのは組み上げるというのは「ループで回したその後」の事だと思ってた事で、組み上げるところまでをループに入れても大丈夫(なように出来る)ってところですかねぇ


 とりあえず出来たってことで!


話題3 Cametanさんに教えてもらった記法で書き直す

 `記法で解決!なんですけど、逆に言うとコレ知らないと詰んでるって事なんだろうか?という疑問が湧きました。終了条件の  `(,n)の時は(list n)で行けたけど・・色々とListで囲って試したけど無理でした。
 後は・・そもそもこの比較してtemae_listに渡すってのがどういう意味w?と理解できてなかったのでじっくり追ったりとか。一応分かったかな・・・

 という訳で明日はPaiza新単語問題のCametanさんVerを追ってみる予定です


2022/09/10 かつて苦戦した(であろう)Paizaの問題にSchemeで挑戦
 最初、正規表現と条件分岐で楽勝じゃない?とか思ってたんだけど、正規表現でn番目までの頭とケツを比較して・・って出来るとしても面倒クサそう・・ということですぐさま路線変更(書き方を忘れてるのでそこから調べんといかんし(^_^;)


 被ってる部分をdropで落として合体させれば良いんだから、まずは1つめのケツと2つめの頭を(それぞれリストにして)食わせて比較して被ってる数をカウントして返す関数を作ったら楽勝でしょw とか考えて書く。1つめをreverseして・・ハッ!?間抜けにもココまで書いてケツと頭が鏡面の対象では無いことに気づくw。駄目じゃん!


 で、改良版。結局1つ目を頭からリストイート再帰で回して2つめの頭と同一文字が出たら1つめと2つめをCDR再帰でカウント増加、どちらかがnullになるまでに違う文字が出たらカウントリセット・・良いんじゃない!?


 そして本体「neword関数」、オメェの出番だ!newordて・・今回のお題にぴったりの関数名思いついちゃったプププ・・が、駄目!あ、そうか・・再帰にfirst合体部分が入ってるので・・うーん・・書き直すのが面倒なので


 君ちょっと芸名変えさせてもろてええかな?ということで最後の仕上げ役に面白ネームneword関数は譲渡され、メイン部分はlist-out君という何の面白みもない関数名となったのでした。

 明日はCametanさんに教えていただいた無限大と複数の引数をmatchのターゲットにする方法を使っての書き直しとクイックソートの復習をやります〜


2022/09/09 
話題1 プログラミングの基礎の続き
 こちら、Ocamlのお手本。うーん、嫌な予感がする。saitan_kyoriに#fを使ってるから(^_^;)

 しかしそれ以前の問題だったのだ。matchの・・何ていうのかな?対象として引数から持ってるところ、(p q)って・・これは引数が複数の場合の取り込みなんだけど・・これが謎。確か前にCametanさんの解説であったような気がするんだけどパターンマッチングでマッチングしなかったの(^_^;) こうなれば・・・


 全部Letで分解しますかw いや、matchのありがたみが分かりますねぇ・・。#fもバッチリ引っかかってしまったので、もうそこんところ適当で。#fの代わりに10000とか入れておけば大丈夫な気もするけど(判定のためだけに使われてるはずなので)。
 要はダイクストラ探索の理屈が分かれば良いので適当にアレンジしてやってくかな〜。


 教科書を持ってくるのを忘れてしまったので15-1のクイックソートの実装部分を覗き見する。ほうほう・・前に一度やってると思うけど、もう一度お手本無視の理屈だけを頼りにやってみるかなぁ?やらないかも。そろそろ夏も終わりだから例のゲームブックのRacket版を作り始めないといかんし

話題2 おっと!

 Cametanさんの新着記事で謎のタイトル。え・・懐かしい!と言うか完全に忘れてます。もう2年も前なのか!という訳で、↑部分まで読んでページをそっ閉じ、自分なりに挑戦してみることにするか!土曜日以降ね(これを読んだのが土曜日なので)。
 条件文と正規表現で行けるんじゃないかな?と軽く考えているのだが?

 Paizaと言えば魔法陣とか出来るだけ効率よく図形で埋めるとか・・クラスBだったけど全然手に負えなかったな・・いやそれよりも!シュタインズゲートコラボのお知らせで学習を再開する気になったのに全然やってないわ(対象にLisp系の言語がないためですが・・もうPython全部忘れた)


2022/09/07 Cametanさんの記事を拝見して振り返り
 おおっ!?要素の任意の場所をソートの対象に出来るのか・・carを使った指定もシンプルで素晴らしい!これがあるんだったらますますレコード型いらないような(^_^;)

 安定ソートって?と思ったけどいわゆるいつもファイル操作で使ってるソートだった。確かに不安定ソートって嫌だなあ(自分で作るのは安定版は面倒そうだけど)。


 式と文・・以前にも一度気になったことがあって調べたはずだけど、アタリマエのように忘れてる(もはや驚かないw)。


 こういう記述を発見したけど・・結局のところ言語によるということか・・Lisp系では全部が式ってのは潔くて分かりやすいし、何より

 この記述が可能ってのはすごく腑に落ちるのでコレで良し!



 挿入ソート関連でCametanさんのお手本と比較。まずinsertを・・と、ここで恐ろしいことに気づく。あ・・もしかしてだけど・・終了条件で今まで散々使ってきた()って・・ [a b c d e ()] コンスセルの最後のcdr部の()って事!?ワタクシ、てっきりリストが空になったってことで↑で言うところの [ ] の部分の事だと思ってたんですけど!


 ま、それはちょっと置いといてそのinsertを使ったins_sortの比較。僕のinsert(の終了条件)が変なのでこのins_sortもヘンテコに改変しないと動かなかったわけなので、そこらへんを探っていく。

 insert部分を僕のものに変えるとこのようにエラー。


 終了条件はこのように違ってる。これを少しずつ変えて実験


 バッククォート表記の部分、Listを使って書き換えるとこうなるんだろうけどこれでようやくちゃんと動く。

 insert単体で挿入する数値がリスト内の要素と比較して最大で「なければ」間違った終了条件でも動いてしまう(これがそもそもの問題・・だからテスト駆動開発をやれと・・)

 挿入数値が最大だった場合nが返らないので飛ばされてしまう。最大値でなくてもins_sortで空リストが返ってきてしまう。

 最大値でない場合はバッククォートにしなくてもオッケイ

 最大値だと駄目。
 問題は (n)  と `(,n) で最大値であった場合、つまり最後までリストを食ってしまった場合に、なんで差が出るのか?って事で・・エラーの表示からすると(n)だとリストが厳密には(9) だけど「`」を使うとリスト内にリストとして(?)展開されるから本当は(9 ())ってコンスセルになってるってことか・・つまりコンスセル形式になって無い式はコンス出来ない(と言うかコンスのケツになることが出来ない?)という事?一応自分の中ではこれで納得が行くのでひとまず置いておこう。


 続いてCompose関数。これが僕がひねり出した方だけど・・確かに改めて確認すると引数の数がおかしい

 Cametanさんバージョンを手打ちしてみる。うーん・・(define (h x)...) h ということでhの場所が変だ。内側のdefineからはみ出している。つまり最後は関数hを返り値として返してるってことで・・もしかしてこれが・・これがクロージャーってことなのか!?

 つまり最後の出力部分は(h 5)という・・?うおお、なるほどーっ!

 今日は色々と(自分の中では)スッキリしたのでありました。ありがとうございます!

 あ、間違ってたら一緒に笑いましょうワハハ







 


2022/08/30 プログラミングの基礎の続き(13章)

 合成関数「compose」を作れという。お手本だけど恐ろしくスッキリしてますなぁ。スッキリしすぎてよく分からん。まあ、どうせ*目的*しか見ないで作るわけだけど。



 関数gの結果を受け取るということはLambdaだな(と言うか例のアクター理論か)ということで・・結果を引数として受け取るんだから・・あれ?5・・そうか、引数が複数必要だからなぁ

 まあ、これだと動くけど汎用性が・・

 で、レシピ(のテスト部分)をちゃんとみたら受け取る手続きは引数一つで動くものでした。ですよねぇ・・ということでLambdaの書き方もちょっと慣れてきたかも知れん!

 明日は宿直なので夜は4時間ほど時間を取れるんだけど・・
 リクエストしていた本が一気に届いてしまった・・これを処理しないと。



2022/08/29 
話題1 プログラミングの基礎の続き(10章)
 舞台をまたPaizaに戻しまして(バッテリーが生きてるのがChromeBookだけなので)・・一応、Insertをもう一度作って動くか確認



 教科書では成績maxの生徒を返すというものだったけど面倒なので駅間データで1番長いのを返す、と。matchでありがたいのが終了条件で、carとかcdrを使うのに今まで散々悩まされた「pairじゃないんですけど?w」的なエラーを回避できるところですよね・・。
 最大値は2.7と分かってるわけですが、西葛西が2.7なのか?


 オッケイオッケイ。ところで今まで出張先に「プログラミングの基礎」の本を持ち込むのが面倒だったのでやってなかったのですが、サポートページのお手本は「レシピ形式」で書かれているので演習の内容が分かるんですよね。これだったら宿直先に持ち込んでとっとと進めることが出来るなぁ!


話題2 プログラミングの基礎のお手本がベタ移植だと動かない


 こちらがお手本のInsert

 で、こちらが挿入ソート(上のInsert使用)。これをこのままの形で移植すると

 insertはこんな感じでちゃんと動く

 次にIns_sortだけど、こっちはベタ移植だと動かない。終了条件がおかしいのは経験的に分かってるので(毎回ここで引っかかってるのでw)


 Car Cdr問題の解決法として最近身につけた最後のペアになった時点で終わるってのをやってみるが駄目

  Rakcetや今回の自作ソートを作った時に最後に深いところで渡されたlstを出すことで解決できたのでやってみると・・やっぱり出来る。結果、そういうものなのかも知れないけどOcamlとSchemeで何か根本の部分で違う部分があるのか・・あるいは(こちらの確率がすごく高いのだが)僕の理解が根本的に間違ってるかではないかと。

 振り返り
・matchの終了条件を自由に設定できるのがすごく良い!

 じゃあいよいよ探索の前提関数が揃ったのでダイクストラの部分に戻りますか!



2022/08/26 プログラミングの基礎の続き10章に戻って
 ほえぇ・・前に作ったinsertが「昇順に並んだリスト」に対して任意の数字を正しい位置に挿入するというものだったので、その「昇順に並べる」という事にinsertが使われるのが不思議な感じ。
 ただ、これInsertを使うと写経にもならない・・って感じなのと、insertをまた用意して・・というのが面倒だったので挿入ソートを自作してみるかと(また余計なことを)思いつく。

 今日は久々でRacketを使ってやってみる?ということで折角なのでRacket版のパターンマッチングも使って・・と、書き方がわからないのでCametanさんのブログで「パターンマッチング」で検索するとうまい具合にRacketの場合の書き方が出てきたので大助かり。Gooブログのブログ内全文検索、(ちゃんとした記事なら)役に立つじゃないか!
 でまあ、練習としてInsertを・・結局作るんかーい


 続きましてInsertを使わずに挿入ソートっぽい事をするものを・・うーん、変だw

 さっきよりはマシだけど変・・

 さっきよりひどくなってるw

 これかー! よしよし・・では更にテストをしよう



 あ、駄目だw そうか・・前に遡ってチェックしてないからソートが終わってしまった後に更に小さい数が出てきても対応できないんだ



 なんか手が無いかなぁ・・と(最初から作り直すのが面倒なのでw)考えてて、一回だけじゃなくて何回も重ねてかければ?とw

 じゃあ何回重ねがけするかだけど・・直感的に要素数と同じだけ重ねたら絶対に終わるだろう・・ということで・・出来たぜ超非効率ソートプログラムが!

今回の振り返り
・Racketでのパターンマッチング文法を知れた
・全く同じ関数を重ねがけする方法をひねり出せた

 インタプリタ言語で本当に良かった(^o^)



2022/08/24 プログラミングの基礎の続き8章に戻って

 お手本を拝見。とりあえずそのままGaucheで書くと

 あ、その前に||って?orか・・


 ふうむ・・とりあえずそのまま書くとこういう感じか・・(例によって)今更だけどmatchって便利じゃないですか!
 今日は以上です!東京から帰ってきてる知り合いが会おうと言ってまして・・あとダンジョンシージがね・・(^_^;)

2022/08/22 プログラミングの基礎の続き

 折角なのでパターンマッチングを使ってちゃんと翻訳したものを書いていこう、と。リストにレコード属性をつけて・・データが出来てるのを確認して


 血液型O型の人数をカウント。acc使ってしまうけど、初期値を入れたいだけだからオプショナル引数で(acc 0)にしたらエラー・・あれ?



 あ、Racketの機能だったか。直感的にもこれしかないって感じでRacket良いすねぇ


 で、お手本の方を確認してみると・・あ、そうか・・acc使わなくても返り値に足せば良いか・・これ毎回引っかかってるな


 じゃあこうか・・

 テキスト通りに共通部分を探して一般化してmapに持っていく流れで書き換えて行く。ふんふん


 person_t型のリストを受け取ったらname部分をリストで返す・・こうかな?


 お手本を見ると、まずはperson_t型を受け取ったら名前を返すってのを作って、それをmapするってのを求めていた模様。そりゃそうだ、だって高階関数の章なんだからw


 というわけでこういう感じか・・Lambdaって超便利じゃないスか!?(今更)



 テキストでいよいよダイクストラ方式での探索の準備が進んでいくわけだけど・・なんかテキストの日本語の意味がよく分からなかったので、先にお手本を拝見。ふーん・・get_ekikan_kyoriって何?と思ったら以前の章の演習で作っていた関数なのか・・となるとやっぱり戻らないとイカンか

 駅名リストとは別で駅間リストってのもデータで用意されていて、これにekikan_tの属性をつけていじるわけだな

 じゃあ以前の章に(結局)戻って演習を関数名、データ名もそのままでちゃんと作り直すことに決めた・・ところで時間切れ。


話題2 式

 パターンマッチングを調べていてふと見たページにあった「式」の定義。あ!そういうことか!評価して値が返るものが式・・今更だけど腑に落ちる定義だった・・


2022/08/19 
話題1 プログラミングの基礎、演習12の残り

 ちゃんとmatchを使って書いてみようということで、遡って演習をプレイ。今まで関数名・変数名をテキトーに変えてたので(^_^;) テキストに沿ったものに統一しました・・アタリマエだろw



 演習12−3、起点駅を指定するとリスト内のレコードを改変するshokika関数・・・の、失敗版w



 修正版。saitan_kyoriもちゃんと0になってたんでオッケイでしょう。比較的あっさり行けたけど、Cametanさんのお手本が無かったらと思ったらゾッとする・・`(,@k)も知らなかったら手に負えないし・・独学で、しかもネットが無かった時代のプログラミング学習って大変だっただろうなぁ・・

 明日はこのまま13章「高階関数」の演習問題をmatchを使ってちゃんとやりなおすか・・と言うか最初からやろかな?

話題2 数学関係
 例の本届きました(^o^) 期限もあるし、まずは早めに軽く当たってみるか〜

 Quoraで同様の質問を発見。ほうほう


話題3 データの型についての質問があったのでスクショ

 なるほどなるほど



2022/08/15 プログラミングの基礎、ソート

 やっとこさ腰を落ち着けて再開することが出来る。宿直も明日で一段落だし・・嘘!ドラクエ3DPとLinuxのUSB起動問題にハマってしまってました

 まずこのmatchの$が謎


 これを見るとパターンがレコードとかだと必要ということ?

 あ、確かにエラーになるなぁ


 代わりにStructでも良いと。レコードとか構造体とかの時には必要ということか。今までに出てきても良さそうだったけどMatch使ってなかったからなぁ・・覚えておこう。今後、絶対に引っかかってたなコレは


 これを既に昇順に並んだレコードのリストに対してmapするわけか・・

 もう一つ謎だったのが(apply string<? (map ekimei_t-kana `(,x ,y)))の部分。気になったので比較。なるほど、前のバージョンをapplyでイカした感じの書き方になったということか・・

 と、あっさりと書きましたが・・例によって勘違やらなんやらで相当ノロノロしてしまって今日はここまでです。まあ、言えないような勘違いしてました(^_^;)

  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事