星田オステオパシー

プログラミング学習日記 2022/09/29〜

2022/10/13 プログラミングの基礎の続き

 メトロ検索プログラムも大詰め・・なんだけど、なんかよく分かってないんですよね、理屈が。だいたいkoushinって何をしてるのか?引数を増やして駅間リストからデータを取れるようにした16章版のkoushinを演習で作ったので実験。基本通りに起点をeki3にしてみると・・。後楽園まで1.8kmなので無事に更新されているな。一方、池袋は更新されてないが・・これはダイクストラの出来上がった時に対象になるということか・・?(間に新大塚を挟んでいるので?)

 ちなみに駅間はこういう感じ。同じ路線状だけど起点と隣り合った部分だけ更新されると(今更w)

 で、いよいよ本丸のダイクストラ本体。もう最初からお手本見てますw
 とりあえず一通りやった後に復習も兼ねて、もう一度最初から自分で作るつもりなので!ザッとみると出たねlet-valuesが必要っぽい。

 とりあえずサンプルを入れてみて・・なんか()が多くない?

 でも減らすとエラー。どうも((a b) (values ...)) ((c d)(values ...))と、複数束縛出来るようになってるからか? ま、そういうもんだと覚えておこう

 saitan_wo_bunriで単発実験。あれ?

 どうも多値で返してない模様・・・。変数を単品にするとリストで入ってる。Ocamlだと多値として返されるのかな?


 じゃあcar cdrで分離して渡すしか無いな。もしかしてvaluesの引数として渡したらイケたりして? イケた!もう24時を回ってるので今日はここまで。let-valuesの良い勉強になったという充実感が出たところで気持ちよく眠るのであった




2022/10/12
話題1 プログラミングの基礎の続き
 アキュムレータを使ったReverse、からの・・・


 Fold-leftの自作。init部分をアキュムレータとして使うという話出てきました。バイト前の空き時間で無理やりだったのでここまで。あと飴玉を食べるJJIがうるさかったしな・・

話題2 RacketでAuto-completion
Racketでは出来ないのかと思っていた自作関数・変数の入力補完なんですが出来ました!プラグイン「drcomplete」を導入することで理想的な動作の補完機能が実現されているのでした
 昨夜、MX-Linuxで突如出来るようになってたのは前の時にターミナルでraco pkg install drcompleteを実行してたのを忘れてたのでした。
 Windows10だと環境変数でRacketの本体フォルダの場所をPathに通してやるとパワーシェルからracoコマンドが認識されるようになり、ネットにつないだ状態で上のコマンド→インストールされるという仕組み・・・メチャクチャ便利だ!
 これで今後はクソ長い関数名・変数名も楽々だ〜(^o^) ただ、カラーをカスタマイズしてるからだと思うけど候補のパレットがすごく見づらい配色(^_^;)

話題3 Racket版ナウシカゲームブック
 おかげさまで制作快調。まさか週に2度の宿直バイトの日がこんなにも待ち遠しくなるとは・・・。
 プログラミングの基礎もそろそろ終盤なので中途半端で止まってるRealm of Rakcetを次には最後までやって・・SICPにリベンジしようかな、と。その後はCommon Lispも行ってみっか!

 今日、たまたま聞いた岡田斗司夫さんのyoutubeで「(おもちゃでも旅行でも)10年やるか300万円使ってようやく初段」って話があったので、なるほど焦らずに行こう!と思いました。



2022/10/11
話題1 プログラミングの基礎の続き 16章突入

 アキュムレータを使って再帰の中でデータの蓄積をする学習。とりあえず普通の書き方で書いてみる。

 関数内にACCを仕込んだ別関数を作って初期値を隠すタイプ・・と。え〜今日はこんだけです。バイトがね・・

話題2 スクラッチの本を借りて動画を見る
 バイトのついでで寝屋川市の図書館に寄る。借りるかどうかは別にして毎回プログラミング系の本棚はチェックするんですけど(結構リキ入ってる感じです)、ふとスクラッチの本が目に止まる。そう言えばCametanさんがスクラッチに肯定的な評価をされていたような?LispもMIT生まれだしビジュアルプログラミングも軽く知ってて損は無いかも知れんと思って借りてみました。

 夜、待機中にYoutubeで関連動画を検索してみる。うーん、面白そうじゃないかw
 ウチの甥っ子はプログラミングに全く興味を示さないんだけど、取っ掛かりとして良いかもなぁ・・何より動画でのレクチャーに向いてますよねブロックを操作して組み上げていくってのは。Racketでのナウシカとラピュタ(こっちは同じものだけどBig-bangでGUIにする予定)が終わったら通常のプログラミング学習と並行してイジってみるかなぁ



2022/10/09
話題1 FOLDの謎が解ける!
 Cametanさんから教えていただきました
 そ、そうだったのか!! 別の挙動するモノだったとは・・・まあ、分かってても自力で出来たか怪しいですが(^_^;)  そもそも別にやらんでエエこと勝手にやってるわけですし謝っていただくどころかホント助かってます!
 でも、相当FOLDの動きとニラメッこしたので、ずいぶん慣れた気がします。match関連についても抵抗がなくなりましたかねぇ。「なんか苦手だなぁ」とか言う感覚って案外間違ってないですよね、理解できてないから直感的に避けようとしてるって事。まだ詳しくお手本コード見てないので、一度自力でFOLDタイプをやってみます!ありがとうございます〜

話題2 宿直プログラミング関連

 宿直バイトでRacketタイム。今回は自前のPCを自宅に置いといてAntx19のUSBのみを持って参上。荷物が軽くて助かる。
 で、これがバイト先の廃棄寸前だったMX-Linuxを入れたPCですが・・やっぱりHDDは重いわ(^_^;) 一度起動してしまったらそれほど気にならないんですけど、明らかにUSB起動のAntixの方が快適です!


 ただ、Antix19にはトラックパッドの設定項目が無いのです(兄弟分のMXにはあるのに)。となると、このポンコツマシンのトラックパッド故障が影響してまともには使用することが出来ないのです。
 他にもWindows10が入ってるマシン(これも僕が修理したもの)もあってUSBで起動するんですが・・・こっちはこっちで無線LANユニットがついてないというね!(富士通の業務用PCにありがち)。
 選択肢は3つあるんだけど、見事にどれも一長一短あって悩むなぁ・・

 ところで宿直の夜にRacketでお気楽ゲーム作りに挑戦、他の日はちょっと背伸びをしてプログラミングの基礎で学習、これって図らずもかなり良いバランスなんじゃないかな〜と思ってる秋の夜でした。
 あ、そう言えば!Racketでのオートコンプリートって初めて使ってみたんですけど・・組み込み関数のみ対応で変数名とかのACは出来ない模様。ここだけはPaizaの勝ちやな。あと、Racketは都度Ctrl+/せんならんのもなぁ。組み込み関数名は結構短いので、自作関数やら変数名でACして欲しいトコロ。そうなるとEmacsになるか・・Emacs軽いし、こっちで打ってRacketでチェックも悪くないかな?

話題3 X68000Z
 予約どころか詳細発表まで延期になってるし。しかも延期発表が前日とか・・これはイケませんね〜。Racketで十分楽しめてますけどね。無料で楽しめることが多すぎる!あ〜幸せ


2022/10/08B 最小を分離をFold-leftで作・・れるか?

 Foldの理解が試されるときが来たのだ!とりあえずは数字はこう動くんだろうな・・というのを考えてみる。右にカッコが伸びていくので新たにリストから読み込まれたものをFirstと比べて小さかったら入れ替える・・と。簡単じゃない?(と、この時は思ってました)


 今から考えると・・予想通りでちゃんと理解できてませんでしたw 
 読み込まれるリストのパターンなども分かってなくて苦戦中の図

 数時間後・・ようやく初期値部分がドット対になってないといけないと気づいた模様。でもまだだめ。ここで24時を過ぎたので諦めて眠ろうかと思ったのですが・・Cametanさんのブログを見て「エラーを食らった数で決まる」という内容に励まされて、もうちょっとだけ粘る


 キターッ!ずっとエラーだったのがようやく出力することが出来た。どうしてもq部分を初期値に組み込んでのマッチングが出来なかったのでとりあえずqは捨てデータとして firstとpだけの出力で・・最初に最小(茗荷谷)が来て、ペアとしてリストの最後のデータが来ている。これでようやく眠れるぜ・・・qを入れる方法は起きてから考えよう。

 で、今朝。レコード型のマッチングも混じってるとどこがおかしいのか分からないので、思いっきり簡略化して動作を確認してみることに。これで同じ動作になってるな・・

 お、出たか・・あれっ!?()の伸びが予想と違う。リストが左から読み込まれるのは合ってるけど、左に積まれて行ってるじゃないか(と、今書きながら気づいた)。だからパターンマッチングで全然マッチしなかったのか・・・いや〜ん、マッチング!いや、fold-LがReverseで使われてたので嫌な予感はしてたんですけどね。
 けどこれ・・パターンマッチでこの形に合わせるのってどうすれば良いんだ・・逆に言うとだからfold-rightが使われたとも言えるのか?


 気になってしょうがないのでfold-r版でやってみたが・・ええっ?リストの読み込み方向が逆なだけで()の伸び方が一緒じゃないか・・ってことはまさか・・・(-_-;)


 最初のmatch-lambda*のリスト読み込みパターンでvの場所を入れ替えたら動いてしまった!! 昨夜からの苦労は何だったのか・・
 ま、何はともあれ良かったよかった・・・とは、ならーん!!

 という訳で次回はCametanさんから教えてもらったtraceでじっくり追い詰めてみようと思います。


2022/10/08A
話題その1 プログラミングの基礎Fold-rightリベンジ編

 帰宅後、早速数を増やして実験する。あっ!やっぱり最小以外も入れ替わっている・・これでとっかかりが出来た


 数字の流れを追ってみる。やっぱりFold-rightなのでリストはケツから読み込まれる。で、初期値の先頭部分(first)と比べられて置き換えられて・・すべての歯車が噛み合った!ようやく納得出来たぜ・・もし良かったら本当に理解してるかを確認するためにfold-left版を作ってみよう

話題2 match-lambda*とか
 単品相手のmatch-lambdaに関しては多分分かったと思う。


 問題はmatch-lambda*の方で・・解説アッサリしすぎだろw 例文も無いし。
 すべての引数のリスト〜? 例のFold-rightのコードで引数のリストってのはfirst と (p . v)つまりlstってのは分かった。で(first (p . v))って部分がリストを複数取ったパターンになってると。うーん・・まあ大枠分かった気になれないことも無いけど、実際かけるようにならないとなぁ・・。最小を分離のFold-left版を書く時に本当に分かってるか試されてみるとしよう。

 いやはや苦戦したナリ


2022/10/07
 バイトの待機時間で問題のfold-rightのところを見てます。再帰じゃないと思ったけど見直すと(rightなので?)ケツから最小値が先頭に浮き上がってきてる感じでやってる事は再帰版と同じでは?
 1以外の並びが変わってないのは数字が4つしかなくて、後ろから並び替えを適用してったら起きたタマタマなのでは?もっと数字を増やせば他の並びも変化する可能性が、、。
 あ〜スマホしか無くて検証と追跡が出来ない。明日帰ったら実験だ!

2022/10/06 プログラミングの基礎を進める?

 まずコチラ、Cametanさんからのアドバイス。ななな、なるほどーっ!いや、全く何も考えてませんでした(^_^;) ちゃんと見てたらヒントは配置されていた・・。見苦しい言い訳で出した画像で思わぬ収穫でした。その他いろいろ擁護してもらったりして・・ありがとうございます!


 早速Cametanさんに書いてもらったお手本を拝見して流れを追っていこう。ちなみに、これ教科書では普通に演習としてノーヒントで書かされるんだけど・・浅井先生結構キツいなぁ・・(ま、そこは講義でフォローがあるのかな?)。
 問題はやはりmatch-let(((p . v)(saitan_wo_bunriCR rest)))の部分かな・・。ここで再帰が入るってことはpとvに入るのは果たして?クイックソートの時にも途中で再帰が入ってきてこんがらがったなぁ・・要するに真に理解してないな。
 ちょっと途中で変数の表示を入れて流れを追ってみる?と思ったけど・・意味ないか

 考えることしばし・・どうもソートしてるんじゃないな。先頭が最小だったら後の並びはどうでも良さそう。
 実際に数値だけを入れたつもりで考えてみると・・ケツから小さいのを前に持ってきてというのを繰り返してるっぽいか・・となると結果は1 423となってるはず。

 おおっ!読みどおり。これは合ってるんでは?けど自分で思いつけるかと言われたら・・w まあmatch-letはだいたい分かったし良いか!

 続いてmatch-lambdaを。説明は意味不明だけど・・

 例文を入れてみて分かる。あ、なるほど!これは便利だ・・case-lambdaのパターン版って感じか。match-lambda*と合わせて明日色々と試して理解に努めよう


 じゃあ本日の本番、fold-right版にかかりますか・・昨夜、なんか分かった!という気になって眠ったのですが、これを書き始めて見直すと分かってませんでしたw
 初期値が空レコードで、そこにリストの1番目(の数値部分)3が来る。3は”と入れ替わり、”はsaで削除される。初期値3となったところに(4 ())がvとして追加、並びの変化なし。初期値が34(first)となっところに2(p)が読み込まれ並び替え、234が初期値となり、1(p)が来て並び替え・・と考えてたんですが他の数値を入れてみると辻褄が合わない。これは間違ってるな、と。

 色々と組み合わせを変えてヤッてみたんですけど、初期のリストと最後で見比べると、どれも最小の数だけが先頭に動いてて、他の数字の並びは変わってないんですよね・・2314->1234, 4213->1423, 3421->1342 という感じで。と言うことは再帰的な前から隣り合う数を比べて入れ替えて・・って感じでは無いのではなかろうかと。

fold-rightの挙動がこうだとすると・・
2314の場合は・・
inf() これがinitでまず4がリストから呼ばれるわけですよね?
入れ替わって 4が次の初期値として1が呼ばれて
入れ替わって 14 これを初期値として3が呼ばれて
変わらずで 143 次に2が呼ばれて
変わらずで 1432。でも正解は1234なので違う、と。
 と言うかそもそもリストはどう扱われてるのか・・
・まさかのカウンター代わり?って事はないか
・最初に2314と全部与えてしまうと2134で止まるだろうし・・

 要するに挙動が全然分からないのだった。昨日4時間、本日6時間くらい考えたけど無理だった・・。

 ちょっと諦めてmatch-lambda match-lambda*の勉強します


2022/10/04
話題1 CametanさんからRacket編へのアドバイス

 最初に結論を書くと、色んな謎が一気に氷解しました\(^o^)/


 値が返らない!?そ、そうだったのか!!
 いや、僕もですねぇ破壊的変更はマズイだろう・・と思ってたんです。が、構造体を再構成する方法が分からなかったと言うね・・(-_-;)
 Gaucheのレコードみたいにmake-eki_tみたいな感じで書く方法無いんかい・・と思ってたんですけど

 これで良かったんですね・・define 使ったら怒られるし、make-struct-hero とか make-nausika や make-hero なんかもダメだし・・

 そしたら例のRealm of Rakcetのオークバトルのところでこんな感じであったもんですからつい・・


 あ〜これを教えてもらえたらバッチリです!ありがとうございます!

 あとコチラ。僕の読みでは・・・僕と来たらまたREPLの基本忘れてしもてますよ・・石取り編、ババ抜き編もっかい復習してから出直します(^o^)


話題2 プログラミングの基礎編
 またしてもCametanさんにお手数をおかけすることになったというね・・

 しかも

 ・最初データを明らかにしないので、推測で書かせてしまう
 ・データを明らかにしたけどコピペできる形式ではなくて画像データ
 ・結局データも手打ちさせた上で解答例を書いてもらう・・

 ぬわー!本当すいません。まあコピペできる状態のデータだと「いかにもヨロシク!」って感じじゃなかろうか・・という妙な気の遣い方をした結果がコレで、もうホントなんというか・・お手数おかけしました

 明日は宿直なんで色々ヤッたろうおもとります!

話題3 ウシアブ
 真の姿はコレだそうです。腐海怖いな〜
 


2022/10/03 プログラミングの基礎の続き

saitan_wo_bunri作りを進める。Cametanさんから教えていただいたmatch-letはfold-rightを使った版なので、前に作った再帰版の検証をしないと・・
 こんな感じでデータを作る。eki_t型は3つのフィールド「駅名 最短距離(他の関数でリストから割り出す) 手前駅のリスト(繋がっていた場合に自駅と手前駅を入れたリスト)を持ちます。で、(最短距離が最小の駅 . (残りの駅たち)という形で出せと。

 で、テストしてみる。ん?全然並び変わってない!そりゃそうだ再帰してないじゃないかw

 で、再帰を入れ込むが・・あっ!! これ前にソートの問題と一緒で、前提が「既に昇順に並んでいるもの」に対して有効なヤツ!そして今回は新たに挿入する訳ではないので、再帰で作る意味がない!

 レコードの最短距離フィールドでソートするサンプル。Cametanさんのブログが結果的にどんどんレファレンスになってて超便利です\(^o^)/

 よしよし・・並んでいるなと確認して

 取り出すのが面倒なので((map (lambda (x) (eki_t-kana.....)でやろうとすると()で引っかかる)、形しか見てないけど多分大丈夫でしょう。結局コレで良いわけでしょ?

 じゃ、次回はいよいよ match-letを使ってfold版に挑戦するぜ!ってことで(いや、ほとんど解答を教えてもらってるんですけどねw)


2022/10/02 
話題1 Cametanさんから教えていただく

 例によっておねだり(←変換すると「お強請り」って出てヒイた)に答えていただき光明が見えて来ました!明日は暇なのでじっくりやってみたいと思います。あと質問を書くときにはデータ型の内容とかちゃんと書くようにします。上手くない質問でした(-_-;)

 毎度ありがとうございますホント

 いや〜・・出先で「あ、こうすれば動くはず!」とか思いついて帰宅して試したら動かないとか・・青春だな!

話題2 Racketゲーム第3回
 今回は先頭部分を楽勝で作ってショップ作成へGO!とか思ってましたけど、まあいつもの通りの展開で・・青春だな!
 とりあえずリストで動くようにしたところまで。構造体の更新は絶対に見落としがあるはずなのでCametanさんの勇者やアドベンチャー、ババ抜きあたりをもう一度見直してみるで、と。
 戦闘の敵画像・主人公ステータス表示とかメッセージ送りのキー待ちとかは一通り出来てから詰めてくって感じで。



2022/10/01 プログラミングの基礎、Foldが本当に苦手だと思った

 リストから最短距離最小の駅とそれ以外のリストをドットペアで返す(であろう)関数、とりあえず動くように書いてみてテスト。ゲッ!?全然並びが変わってない!


 それもそのはずでテストに使ったeki_t型のリストはまだ最短距離の処理をしてないリストだった。でもまあ、一応動いたということで・・。テストのためのデータを作らないと・・と、今、これを書きながら思ってます。
 と言うのも、前回既に書き終えるところまでやったと思いこんでて次の演習に取り掛かってしまったんですよね。

 同じことをFoldでやれ!と。ま〜苦戦中です。まずお手本の(fun first (p, v)てのがLambdaで再現できるのか?ってのが不明。最初普通にy xで受けておいて、yを更に切り分けるって感じで段階を踏まないと出来ない気がする?


 最初こういう感じかな?とやってみる。まあ動かないですよね・・・

  matchを使わないなら出来るかな?と実験してみたけど・・pairじゃないだろ!と言われる。Foldでもコレ出るのか〜・・再帰とmatchを使ったときには終了条件を((x . () で逃げることが出来たけどFoldだと思いつかない・・①


 ここはコンピューターの探索を見習って総当たりで試すかw
 コレ駄目。エラーメッセージからするとリストで返ってないということなのか・・?ちゃんとクオーとしてるけどなぁ


 その後様々試してみる(^_^;) 初期値をリストにする必要がないのでは?と単品のeki_tレコードにしてみたり・・。で、matchを更に入れてfirstも分解してみたりして・・駄目か〜。eki_t型がマッチしてない・・


 firstのmatchの場所がおかしいのか?と順番を変えてみたけど駄目。


 これで駄目なら諦める!とやってみたんですけど駄目w エラーからして超基本的な話だと思うんだけどなぁ・・
 これと①のfoldを使う場合にCar Cdrを使うときにペア?を回避できる方法って無いですかねぇ?
 


2022/09/29
話題1 プログラミングの基礎を少し

 受け取ったリストを距離が近い順に並べ替えて、先頭を切り離して最小とその他というドットリストで返す、と

 という訳でScheme訳した(つもりな)わけですけど・・終了条件後の処理だけどなんで空のeki_t要素を返す必要があるんだ・・?と思ったんだけど、今これを書きながら、そうか・・Ocamlのリストって同じ型の要素しか持てないんだっけ?それで無理やり型を合わせてるのか・・と書いてて気づく。

 それに比べてScheme(lisp)と来たら・・・最高じゃないか!


話題2 Cametanさんの返答にまた驚く
 ええっ!?今まで知らなんだ・・確かに言われてみれば書き方のルールはあっても予約語って見なかったかも!
 後はend関数うんぬんの話で出たマクロ。今のトコロ「あ、こういうのが」というところで出てくるのがマクロと遅延評価なのでそのうちちゃんとやってみたいと思っております

 これも驚いた・・実は「僕には思いつかないけどどうせとっくに作られてるんだろう」と思ってたんですよね、倉庫番解決プログラム。それがまだ研究段階だったとは・・。
 無限ループするかどうかの判定が不可能ってのもそうだけど、何ていうか計算機科学ってまだまだフロンティアが広がってるんですねぇ。
 よく日本のドラマとか昔のアニメ・漫画で出てくるコンピューターがらみの場面を見て
 「全然分かってねぇなw」
 とか思ってたけど分かってないのは自分だった!というね。

話題3 Racketでゲーム
 宿直夜のお楽しみ、ラケットでのゲームブックのコンピューターゲーム化を続けております。まあ、どうなるか分かりませんけど部品作ってればいつかは出来上がるだろうってなノリで。

 で、「Racket ゲームプログラミング」で検索するとトップにCametanさんの記事が来るのも面白いんですが
 こちらの多分雑誌で連載された記事のPDF抜き出しが公開されててヒットします。なんとBig-bangを使ったGUIゲームの作り方という貴重なものでして

 「お、これでフロッガー作れるやん(と言うかこれフロッガー)」

 なんて見てたんですが最後の著者プロフィール!

 あんた浅井先生の教え子だったんじゃないの!?いや絶対にそうだろw


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

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

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