幅優先探索で迷路を解く様子(2021/08/16)

幅優先探索って何だろう、、、深さ優先探索って何だろう、、、、

実際に動く物を作ってみたらわかるんじゃなかろうか。

という事で

作ってみた

ここで触れます(触ってみてね)

https://editor.p5js.org/momo_chan/sketches/BDC1O7R-j

 

 探索してる様子

20210816180924

                         かわいいねっ 

 

★やり残し★

深さ優先探索の方がまだできてないからいつか作る。

あとManageクラスをせっかく作ったのにFieldのクラスとSearchのクラスで

プログラムの制御をしてしまっているのでそういった制御は完全にManageクラス内で行うようにする。

あと、探索中に死んだ経路の色を戻すようにする。

あと、できたら幅優先探索で最短経路が出るようにする。

 

コンテンツツリー

<ヘロンの数学チャンネル様>

https://www.youtube.com/channel/UCQO4HzPkRpczr3rECUOL3RQ

・分かり易いし楽しいし触れるすごい

 

<TutorialCrawler様>

[JavaScript]キューを実装する - Tutorial Crawler

・Queuruの作成を参考にさせ(コピらせ)て頂きました。

 

<プログラミングコンテストチャレンジブック>(書籍)

・ロジックを参考にさせて頂きました。

 

 

プログラムの指摘等コメントで頂けたら嬉しいです 

 

bash変数展開一覧表 (2018/08/12)

bashスクリプトのコード見てみたら${変数名:-値}みたいなのが出てきた、なんだこれはと思い調べてみた。

ここにすごくよく分かり易いまとめが書かれてた。

【シェル芸人への道】Bashの変数展開と真摯に向き合う - Qiita

以上、レポっした、、、、ってオイ!Σ\( ̄ー ̄;)

 それじゃああまりにも意味がなさすぎるので、それぞれの変数展開を実行したときの返り値と実行後の変数値の状態をまとめてみた。

 初期状態の違う3つの変数を用意し、それに対する変数展開の結果である。

 

変数の初期状態

  • hoge=old
  • foo=""
  • bar →未定義

ようは値ありと空文字と未定義の3種だ。

 

実行内容

hoge,foo,barのそれぞれの変数にそれぞれのコマンドで変数展開を行う。

       例)echo ${hoge:+"new"}

返り値はその場で帰ってくる値で。実行後の変数値は変数展開実行後にhoge,foo,barそれぞれに入っている値

 

そして結果は次の通り

 実行結果

コマンド→ = := + :+ - :- ? :?


hoge old old new new old old old old
foo "" new new "" "" new "" error
bar new new     new new error error


hoge old old old old old old old  
foo "" new "" "" "" "" "" ""
bar new new            

 

こうみると”=”や":="は値無しや未定義に対して値を設定し、設定した時にその値を返してくれて、"-"と":-"は値を設定しない。"+"と":+"は"-"達の反対。

ほんで、"?"と":?"は未定義の時とかにスクリプトを強制停止させるために使えそう。

 

今日はここまでにしときます(神の慈悲)。それぞれの変数展開を今後自分が使っていったら、ここにどんな使い方したのか追記していこうと思います。

編集後記

正直引用した記事で事足りる気がする。自分用だしま、多少はね?(歪んだ完璧主義を何度も正してくれた金言)

このテーブル表作る時にvimの使い方とかググりまくったのでそっちをまとめた方がよかった希ガス。あとハテナブログの編集楽で助かる、最近すごいものが有るんやね~。

 

次回:さっき言ってたvimの使い方

 

 

LINUXコマンド学習日記(2021/08/11) -草案

AWKの勉強用ファイルをコマンドラインから作ろうとして苦戦したので、できるまでに調べたこととかをまとめる。自分がたどった軌跡をそのまま書くので見るに堪えない。備忘録、感想文。

 

勉強用ファイルawkで操作する用のファイル。/usr/binディレクトリの中の普通のファイル(test -f でひっかかるタイプの(ディレクトリとか、リンクとかでない))の名前とサイズを並べたファイル。

 

1行コマンドラインでエレガントに作りたかったけど、到底できませんでした。

なので大きく4つのステップで実行していった。

  1. binディレクトリ配下のファイル名を抽出してまとめた一覧ファイルを作成する。
  2. 一覧ファイルを整形しgrepで使えるようにする。ファイル名の中に"["が有るのでその前にエスケープシーケンス"\"を入力する。あとファイル名が最後に来る行だけ抽出するように一覧ファイルの各行末に"$"を置く。
  3. 作成した一覧ファイルを使用してまたbinディレクトリにgrepをかける。それだけだとリンクまで引っかかってしまうから、行頭にlがついている行を省くgrepも一緒にかける。
  4. grepされた結果をawkコマンドを使ってファイル名とサイズの順で一行ずつファイルに出力する。

  3と4は一行で実行

 

 

1に関して

実行コマンド

for filepath in `find "$(pwd)" -type f`; do echo ${filepath##*/} >> ~/awk_pra/itiran.txt ;done

内容

現在地(/usr/bin)のファイルを"find -type f" でとってきてfor文に渡す。

${filepath##*/}はファイルパスからファイル名だけを取る変数展開の仕方。パターンの最長一致箇所を省く”~~/~~/~~/ファイル名”だと一番右の/までが最長一致でその部分を省くからファイル名が取得されることとなる。

↓のをそのまま使わせて頂いた。

パス文字列からファイル名などを抜き出す - Qiita

 

躓いたとこ

  • for分で一行ずつファイルに出力するときに">"を使うと最後の一行しか残らない。かといって">>"だと新規ファイルを作ってくれないのであらかじめファイルを作っておかないとだめ。なんかいいコマンドないかなぁ
  • 最初find -type fではなくて、if [ -f "$(pwd)/*" ]で一覧取得しようとしたけどどうしてもだめだった。(一気にディレクトリ内容を渡そうとしている?)

2に関して

やった事。vimでitiran.txtを開いて。"["を検索して見つかったところに"\"を置く。

あと書く行末に"$"を置く。←この操作はvimの機能で簡単にできた。

vimで複数行の行頭、行末に一気に文字を挿入する方法 - 基本へ帰ろう

 

3,4に関して

実行コマンド

ls -l | grep -v "\->" | grep -f ~/awk_pra/itiran.txt | awk '{print $9,$5}'

内容

一覧ファイルを使ってgrepする。しかしhostnameという名前のファイルが、普通ファイルの他にシンボリックリンク先にも設定されている(~~~~ -> hostnameとlsコマンドでは現れる)。そのせいでシンボリックリンクも拾ってきてしまっていたので、別のgrep を使用して"->"が現れる行を省くようにした。

あとはawkを使ってほしいフィールドを出力。

躓いたとこ

grep のオプションをlsと同じ用につなげて書くことが出来ると思い込んで、

grep -ev "\->" -ef itiran.txt みたいな記述をしようとしてたけどできなかった。grepは-eしか複数条件書くことが出来ない?不便だ。。。(不確定)

(普通にできました_2021/08/14)

grep -f [正規表現が書かれたファイル] -e[正規表現] [検索対象ファイル]

で検索対象のファイルに複数の正規表現で検索された結果が返ってきます。

manコマンドの見方も勉強した方がいいなこりゃ

 

総評

もっといろいろつまったとこあったけど、まとめる間に忘れていった。

shell芸極めた人だったら、自分がやりたいこと一行でできるんだろうな。