星田オステオパシー

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

2022/09/28
話題1 プログラミングの基礎の続き

 素数判定プログラム、Cametanさんにも教えていただいたんですけど教科書を見てなるほど!2からnまでの連続した数って限定があったんですね。いや〜・・教科書忘れてネットのレシピのコメントだけ見てたもんで(^_^;)
 仕組みを聞くとなるほどバッチリ分かりました!よく出来たアルゴリズムだぁ

 さて、教科書の目標成果物、ダイクストラアルゴリズムによる最短駅検索プログラムなんですが、どんどんテスト用のデータを作るのが面倒になってて丁度「どうせ今後の演習で実際のデータを作ることになるだろうからテストはその時で良いや」とか書いたんですが
 直後にまるで見透かしたように釘を刺されてました。さすが先生w

話題2 Racketでゲーム(not)ブックゲームを作り始めました
 やっとこさ! いや〜推測ですけど「ゲームを作り始めると幸福なときが2回ある。最初に構造体を考えてるときと最後にゲームが動いた時だ」こういう名言とかあるんじゃないですか?無いかな?(ウォーレン・バフェットの高級スポーツカーを買った人についてのパロディ)。

 とりあえず構造体で「こんな感じかな?」というのを作って画像を埋め込んで表示できるかチェックするところまで。後は前の数引きゲーム?あれのREPLを参考にしたら出来るんじゃないかな?CLI版は。戦闘ありフラグはenemyが#fじゃなければ・・・って判定でも良かったかも知れないけど、なんとなく別フラグにしておきました。明日また宿直なので続きをやろう。次は戦闘部分かな・・。戦闘部分は続編のラピュタにも使えるしある程度汎用性のあるものにしたい思うとります



2022/09/27 プログラミングの基礎の続き
 あ!なるほど!! ん?と言うことは停止条件の後に関数の実行も可能ということでもあるのか・・もしかしてパターンマッチングか何かを使って常に適切な終了処理をするようなend関数(仮名)を作れたりするんだろうか?ちょっと今度試してみよう。

 教科書を読んでいて、へぇ〜となる。つまりコレって無限ループするかどうかは「やってみないと分からない」って事かな?それでメモリを使い切るまでとかタイムアウトでエラーが出るようになってるのか(推測)。

 Cametanさんのカウントを手打ちして眺める。xはリスト要素のカウントとして使われてるだけ、と。Fold-leftだったらLmabdaの仮引数の順番が入れ替わると。

 後はおなじみのSUMをFold-rightで・・なんだけど、自作版はリストと初期値の場所が定義で入れ替わってるので注意という事ですね


 で、階乗。まあ別にコメントは無いかな・・・。


2022/09/26
話題1 Cametanさんにリアクションをいただいた
 あ、こういう風に使うのか!

 えっ!組み込みの関数を一時的に上書き出来るのか!関数名が被るとエラーが出ると思ってました。なるほど、それを知るとすごく良いサンプルですよね・・R7Rsにも一言そういうのが書かれてあればなぁ・・

 ええっ!?今日は驚くことばっかりですが・・WEBでの実行環境って切り離されてるわけでは無いんですね・・それでIDEONE(でしたっけ?)って実行にワンクッションあったのか!あの一手間がこまめに実行でテストしないといけない僕には苦痛だったんですが・・必要な措置だったんですねぇ

話題2 プログラミングの基礎を少し進める

 ついにコレが来たか・・前にちゃんと理解してなかった関数ですが、これをLambdaを使って書けという演習。


 うーん、こうかなぁ? (match `(,p ,q)... だけど・・この形でちゃんと渡されるか謎。確かめたいけどテスト用データを作るのが面倒なんだコレが・・どうせ章が進めばデータを作る場面が出てくるワケだから検証はそこまで待とう。

 同じ目的なんだけど、matchで一緒にしないで初期引数として渡されているpを最初に、Lambdaでリストからピックアップされるqと分けて処理している。こっちの方が感覚的に分かりやすいかなぁ

 こっちは多分合ってるんじゃないかな?これも実際のデータが出来てから検証ってことで。

 後はお気楽に授業内容を学習する。今日はリストの中から完全数をピックアップする関数
 まずは完全数を出すために約数を出すために連続した数値のリスを返す関数。Iotaで良いと思うけど、まあ付き合ってちゃんとやりましょう

 約数を返す


 ほんで完全数と。なるほどねぇ・・うーん、楽しい。

話題3 涙の手打ち倉庫番
 ええっ!?まさか本当に手打ちとは・・(・。・; 
 すごい熱意だ・・

 ところで昨日考えた自動マップ生成ですけど、考えてみたら最初に完成状態を打ち込むトコロは手打ちなんで意味ねぇなと。じゃあなんか方法が無いかと思ったんですが
 ・読み込んだ倉庫番マップがクリア可能かで真偽を返す倉庫番自動解答述語を作る(soukoban-clear?)
 ・20x20くらいで「壁、箱、ゴール」をランダムに配置する関数を作ってマップを100000000個くらい作る
 ・Filterでクリア可能なものだけを選んで
 ・最後は人間が「面白そう」という感覚でフィルターする
 これで半自動生成出来るんじゃないですかね?まあ問題は倉庫番をクリアするためのアルゴリズムってのが全く思いつかないことなんですが。



2022/09/25
話題1 R7Rsをちょっとだけ進めた
 実は昨日にRacket(Update中でブラウザが全然使えなかったので)で同様の事をやってたんですけど細かく違ってて全然進まなかった。しかも結局容量不足でOSを入れ直すハメになったので同じのをPaizaでやり直してます。
 RacketだといちいちDisplayしなくても見られるしNewlineしなくてもリスナー(?)部分では改行されてるから楽でした。
 普段Let*とか使わないから完全に忘れてます

 そしてLetrec・・これも何回も練習で書いたけど忘れてました。と言うかこのサンプルが難解でしたw。まずeven?っていかにも組み込みでありそうな名前なので混乱しました。アルゴリズムも面白いけど最初謎だった

 あと、地味に普段はChromeBookで英語キーボード、このWindows10PCは日本語キーボード配置ということで ` | _ の3つが打ちづらくてしょうがない。まあこっちはRacketがメインになるかなぁ。とにかく余計なソフトを入れて汚さないように使っていこうと思います!快適!

話題2 Cametanさんの倉庫番
 前にCametanさんの僕への隠しメッセージではないか?と閃いた倉庫番だったけどまさかCametanさん自身が作っておられたとは・・楽しみすぎる!
 そしてマップ数500オーバーとか (・。・; 
 マップ生成のアルゴリズムとかあるんだろうか?素人考えだと、最初にクリア状態のマップを作っておいて、そこから自動で1マスずつマップを「荒らす」事で作れそうではあるけど・・まさか500面全部手打ちでは無いですよね?恐ろしい・・

 僕はパズルゲームを全くプレイしないんですけどプログラマーってパズルが好きなイメージありますね(と言うか数学好きな人?)。

 今週はちょっと宿直ヘルプが重なるんでRacket触れるから、僕もちょっと作り始めましょうかねぇ


2022/09/23
話題1 プログラミングの基礎の続き
 お題

 foldを活用するための学習。データを作るのが面倒だったので駅間リストのデータを使ったのだが・・数値、明らかに変だよな?ただの合算なのに。
 なるほどなるほど・・foldで使う引数が分かってれば、それを返す単品関数を簡単に考えられるな・・

 同じものを局所関数を使って。なるほど・・Letのノリで前提となる単品関数を作って使えると。ただLetの場合は(let ....)で包むけど、(define の場合は中で一旦完結させると。


 どんどん行こう。前に書いたのをfilter lengthを使って書き直すお題

 任意の所属線名を入れたら数を返すって感じで。うわ〜・・これはもはや再帰で回すのは面倒に感じるラクチンさ。

 更に次のお題、無名関数funの使い方。まあ、Lambdaなんですが。Lambdaにmatchはこう書くのか・・エエやん!


 過去の関数をLambdaとmapを使って書き直すお題。終了条件とかConsとか考えなくて良いから楽だなぁ


 こちらも同様のお題。明らかにスッキリして書きやすいし見やすい。教科書ってよく考えられてるなぁ・・


 今度は前の2つを一気に済ませるもの。おお・・再帰版で2つに分かれていたのを書かされてたときには面倒くさかったけど、ここで伏線回収か・・ありがたみが分かります(^_^;)

 という訳で更に面白くなってきたぜ!


話題2

 今日、バイトの待機中にベッドで寝転がっていて突如ある可能性が閃く

 「ハッ!? 最近ずっとCametanさんが倉庫番を執拗に紹介していたのって・・あれ、もしかして「Racketで倉庫番的なの作ってみても良いんじゃない?」というメッセージだったのでは?」

 Cametanさんが作ってくれた例のBig-bangの勇者プログラム、あれを改造したら倉庫番出来ると思うんだよなぁ・・自分が向いてる方向の1つ先が箱、2つ先のマスが空いてたら箱移動可能、目的マスだったら1つ完了って感じで。
 Big-bangでのループの回し方とか完全に忘れてるから、復習にもちょうどエエんではないか?と。ちょっとやってみるか・・(そんなんばっかり言ってますが)。


2022/09/22 Linuxパソコンを結局Windowsに戻す(^_^;)

 今日は一日プログラミング学習に使えるぞ!と思っていたのだが、波動測定器がWINEで動かない、持ち運びできるサイズのノートパソコンがLinuxを入れてるAsusPCのみ・・ということで、Linuxは例のUSB起動AntiXでまかなえるか・・とWindowsに。最初7を入れたのだけど、どうしても挙動がおかしくて改善できなかったので10を入れ直すという・・。やっぱり7より重いなぁ・・

2022/09/21 

緊急追記! 二本木じゃなくて二分木な模様!!戒めのために敢えて前回の部分は書き換えません(^_^;)

プログラミングの基礎(寄り道の自作素数チェック関数)
 まずLambda内に条件式を入れられるかどうかも分からなかったのでテスト。ふーむ・・




 基本的な書き方がわかったのでOcamlの直訳版を書いてみる。<>はnotだと思ったんだけど・・しっかりと6とか9とか入ってるし・・うーん・・

 Lambdaの中にループを仕込むしか無いか・・今まで自作述語をLambdaで書いたこと無いし手こずる。そして判定が間違っている・・あ、zの初期値を-1しないと駄目だ

 これでどうだ!? 段々と長くなってきてるけど・・(^_^;)

 そしてフィルターに入れてみる・・おおっ!いや、9!

 結局3の除外も・・条件式がこんだけあったらなんかエレガントじゃないなぁ(本当は動いただけでも嬉しいが!)

 ちなみにLambdaを()で更に包むとちゃんと動くと実験の結果分かったんだけど、取ってしまうとこうなる。最初この()でもう一重包むのが分からなくてずっと述語 sieve? で n がそのまま返ってきて困ってました。普段MapとかFilterで包んで使ってばかりだったので・・・

 という訳で振り返り
・述語をLambdaで書く基本的な方法が分かったかも知れない
・Lambda単品で返す時には()で包まんといかんようだ
・Lambda式の中でループを入れるのに成功した

 最初考えていたのはもっと局所でのループだったんだけど、更にLambdaに入れるって事になりそうだから意味無いのかな・・と。

 今回は以上です。明日は一日空いてるのでどんどん進めていこう!
 ちなみにちゃんと検証してないので本当に素数の判定が出来てるかは知りません!

2022/09/18
話題1 プログラミングの基礎の続き
 14章を飛ばしてたのが発覚したのでジワジワと・・Foldの実装演習。教科書のお手本版はこう。Fold-rightなのでこうなんだろうけど


 initの部分を更新して再帰・・というイメージがあるのもあって、直感的にはこう書きたくなる。考えてみるとこれってFold-leftなんですよね。


 やっぱりLeftの挙動ですね。なるほどねぇ・・


 で、Foldを使ってLengthを作る。ほほう・・?仮引数がfirst rest_resultって事はfirst に lst、rest_resultに0って事?lstはただのカウンタになってるからコレで良いってことかな・・

 応用版でリスト内の文字を合体させるconcat。実は空の文字(列)を""って表現するってのが分からなくて時間を食ってしまったのでした。こっちが本来の使い方ですなぁ。

 続いて素数を返す関数。funって?と思ったらどうやらLambdaらしい。え?これで素数の判定できるのか・・?これ書いてて改めて疑問に思ったので次回、同じことをSchemeでやってみるとして・・


 答えを見ずに自分でやってみようと思って行き詰まったので、とりあえず検索してみる。なんでiに2ずつ増やしてループなんだ・・1じゃなくて・・というので詰まったのでまた次回考えることにする(^_^;)


 最初自分でやってみるか?と思って素数判定述語を作ろうと思って「はっ!?」として立ち尽くしてしまった。条件分があってるかどうかは別にして、後半...(mod n (;nより小さな数)ってトコロ、filterとかmapとかで任意?の数nが選ばれたときに、リストの中のnより小さな要素ってのを自動的に設定するってどうすればいいのだろう?と。リスト内にある要素を比べるのであれば分かりそうな気がする(気がするだけ?)のでとりあえず置いといて、今回みたいに、ある範囲の数を自動的にチェックする場合ってどうすれば良いのか

話題2 cametanさんのAVLの記事

 な、なんだってー!?

 つぼみってまだ現役やったんかい、、しかもランキング上位って!

 まあそれもビックリしたんですが、二本木関係の組み込み機能とかが無いとか意外ですね、、なんか再帰で割り振ってけば良いだけのような気もするのに(←まず間違いなく浅はかな思いつき)。

 このタイミング、そして例としてゲームブックを出されてるところからして何かあるのかも?とか。いや、あれですかね、夏休みの工作。まあ衣替えの時期までにはテストデータとエンジン部分を作る気満々です!


2022/09/17 
話題1 プログラミングの基礎 コード整理

 最近、Paiza ioでSchemeのコードを書いて学習をしてます。このエディタはブラウザを閉じても内容が保存されるので便利なんですが、たまにタブの再読込が発生して前日の状態に戻ってしまったりするんですよね。何度かくらった後、Chromebookのテキストエディタに全文保存するようにしたんですけど、前の混乱などもあってコードがとっちらかっており、実験のために書いたテストのゴミとかも放置されてたり教科書の順番がバラバラだったりしたので、数時間かけてキレイに整理しました。型名のリストと変数名は電子パッドに書き出して、と。かなりスッキリした。
 ま、謎の円盤UFOを見ながら出来る作業ということで行ったんですけどね。

話題2 R7Rs 14ページまで
 インクルード? 

 さっぱりなのでGaucheで。なるほど〜 ある程度以上の大きさのプログラムを書こうと思ったら大事そうですね。やっぱり例文があると分かりやすい


 cond-expand?

 さっぱりなのでGaucheで。ほほう・・依存する機能があればそれを使って、無ければ無いなりの条件分けが出来るってことか。とりあえずそういうのがあるということだけ覚えておこうか


2022/09/16 プログラミングの基礎 重複駅排除

 ekimei_t型のリストを受け取ってひらがなで並び替えをしつつ重複駅を取り除く。のOcaml版お手本。

 以前、Cametanさんに教えてもらったekimei_insert。これを使ってseiretsuを作るわけだけど・・

 そのままの形だとエラー・・

 うーん・・とりあえず自分で書いてみる。二重matchを使ったりなんかしたりして・・やっぱり駄目。エラーからするとリスト内を評価しようとして(先頭が関数じゃないので)エラーが出てる感じ?だがなぜ?ただリストを返してほしいだけなのに

 ダメ元で普通に再帰で書いてみるけど・・やっぱり同じタイプのエラー。これは返り値の設計が間違ってるんだろうけど・・うーん・・


 しょうがないのでリスト状態で処理をして、それをレコード型に変換・・ということでお茶を濁す。まあ動いてはいるんですけど。

 明日はこの続きを・・ペースが落ちてるのは「謎の円盤UFO」のせいです


2022/09/14 
話題1 CametanさんのGauche版新単語を追う
 なんかエレガントだったので・・


 お手本を手打ちさせてもらって復習。注目だったのはLetとMatchの合わせ技でしょうか・・なるほど〜・・全く考えつかなかった。やっぱりいろいろなコードを読むって大事ですねぇ!

 fold部分をもう一度consで追う


 そして外側の (fold (lambda... を改めてもう一度ちゃんと見る。うーん、よく出来ている!! 更にエレガントですよコイツぁ!

話題2 R7Rsの話題
Cametanさん、「#;」の件、ありがとうございます!ピンポイントで意味単位(?)がアウト出来るのはテストの時に便利そうですねぇ!
 折角の便利機能なのにこの例文は意味無いんじゃないでしょうかねR7Rs(^_^;)



2022/09/13
話題1 新単語Fold版の理解
 結局、全然コードの流れが読めてなかったのとSubstringの数え方?が分かってなかったのが原因で手こずっていたのでした(^_^;)


 という訳で動きました。最初にfoldを使うと見た時にinitの部分にapple→appletter→appleterock...と文字列の保存をしていく&rangeで出来るリストはリストイート用のカウンタだと思ったというのも読み解きが遅くなった理由ですかねぇ。(fold (lambda (... のパターンは苦手意識がやっぱりあるようなので使いまくらないといかんな(減感作療法)。

話題2 R7Rs、11Pまで読む
・#; って;とどう違うのか謎。もしかして同じ行の中で部分的にコメントアウト出来るのか?と思ったけど普通に行末までコメントアウトされるし・・

・<datum>ってなんだ?と思って調べたけど明確な答えが見つからない。

・データムラベルが謎。リストとかで呼び出すんじゃなくてデータを直接呼び出すということ?変数に束縛で良いのでは?

・末尾文脈うんぬんのところは読み飛ばす。言語の拡張とかをする人が読む部分なのかな、と。

次回から4の「式」に突入。ここからが注目ポイントじゃないかな?と予測





2022/09/12
話題1 世間は狭いなぁ

 これは笑った(^o^) いや〜Cametanさんもびっくりされたのでは?いや、よくあるのかも?でもホント「おっ!コレコレ!」と思いました

話題2 ちょっとだけプログラミングの基礎

 ちょっとした指の運動にプログラミングの基礎の演習問題好きなのでコツコツ。最大公約数を出す関数・・へぇ!余りを使って出す方法とかあんのか(無知)。寄り道でユークリッド互除法の解説を読んだりする。

話題3 Cametanさん版Paiza新単語問題を追う
 Listに変換する必要が無いと。ボンヤリとでも存在を知らないと思いつく可能性はゼロなのでやっぱり通読するかなぁドキュメント。

 とりあえずCametanさんのRacket用コードをそのままコピーして実行。add1とrangeが無い模様なので・・ちょうど良いし作るか。add1は問題ないのでrangeを・・まあ一応動きますけどRacketの動作を見ると引数によって変わる模様。おっ!Case-lambdaの練習になるな


 よしよし・・実は最初 (define (range (case-lambda...にしててどうやっても返り値が1なので途方に暮れてました。あと複数の引数のパターンマッチがmatchと違ってたりとか

 オッケイ、良いんじゃないでしょうか〜。Case-lambda良いっすねぇ!


 が、まだエラー。どうやらsubstringの引数、Racketで省略可能なのが通じない模様。


 省略って事は0かな?と0をぶっ込んで、foldl(お気楽版)を使った結果がコチラ。ん〜


 SRFIのfoldを使うとこちら。どっちみちfoldの記憶と理解が怪しいので解説を元にしてScheme版をちゃんと作ろう!明日以降ですけどね
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

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

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