前回までのあらすじ
PaizaスキルチェックでBランク合格できるくらいは書けるようになった。基本的に使う文法は基礎的なもので、問題を解決するアルゴリズムを構築するスキルが求められているのを感じる。これは他言語に通じるものがあるので初めてよかったと思う。
今週の学習内容
基礎的な所の復習がメインになっており、余り新規で学んだことが少ない。
レベルアップメニューで適当に書いたコードだけが増えてきているのでGithubにpushした。
Go勉強用リポジトリ
命名で悩む時間がもったいなくて、とりあえずローマ字と英語の混在命名というひどいコードになっている。またコピペして改変したfunctionなんかはdocの修正が出来ていないのもある。
なのでリファクタリングはそのうちやりたい。多分やらない。
1. Go Map キー存在チェック
他言語だとこんな感じでcontains等でキーのtrue/falseを返す処理をよく見ると思う。
if(mp.containsKey("foo")){
str = mp["foo"]
}
しかしGolangでは存在チェックと存在するときの値取得を1行で書ける。
これはGolang特有の仕様で、他言語とは違いmapから値を取得する際2つの値を受け取れるためである。
ちなみに値を取得する場合にboolの受取は行わなくてもコンパイルエラーにならない。
- マップのキーに対応する値
- そのキーが存在するかどうかを示すブール値
// mp["foo"]で値を取りに行く処理は受け取る第二引数を指定すると存在有無を返す
val, result := mp["foo"]
if result {...}
// if文の外でmapから取り出した値を使わないなら、ifブロックに纏めても良い
if val, result := mp["foo"]; result { ... }
2. Go ソート処理
sortパッケージをインポートして使う。
昇順なら基本的に sort.Ints()
, sort.Strings()
等の用意されている昇順用functionを使うべき。
降順にしたいときはsort.Reverse()
を噛ます必要があるのだが少しややこしい。
var s []int = []int{1, 21, 3, 4, 5}
// 昇順
sort.Ints(s)
sort.Sort(sort.IntSlice(s)) // 非推奨
// 降順
sort.Sort(sort.Reverse(sort.IntSlice(s)))
一応上記の昇順2つの処理は等価。
Ints()
は内部でsort.Sort()
を呼び出しており、恐らく可読性向上やシンプルにソートするための関数として提供されている。Strings()
も同様。
IntSlice()
はSort()
を行うInterfaceとして定義している型で、Int型のSliceを受け取ってキャスト。
その後、Interfaceで定義された並び替え処理を呼び出すという流れ。
func Ints ¶
func Ints(x []int)
Ints sorts a slice of ints in increasing order.Note: as of Go 1.22, this function simply calls slices.Sort.
3. Go Replace処理
公式より
Replace returns a copy of the string s with the first n non-overlapping instances of old replaced by new. If old is empty, it matches at the beginning of the string and after each UTF-8 sequence, yielding up to k+1 replacements for a k-rune string. If n < 0, there is no limit on the number of replacements.
要は何回第二引数を第三引数に変換するかを第四引数で指定する。
一斉置換を使うことが多くなると思うので第四引数は基本的に-1
になるかな?
str = strings.Replace(str, "hoge", "Fuga", -1)
Goで文字列の置き換えをする(strings packageのReplace)
所感
レベルアップメニューこなしている分には真新しいことは余りなかった。今のところ大体が既存知識の組み合わせでいけている。
細かいアルゴリズムのメニューもPaizaにはあるので、Aランクメニューが終わったらそちらの学習メニューをやる予定。
week2終わった直後にAランクチャレンジしたらBランクと差がありすぎて心傷を負った。
難易度の上がり幅にもうちょっとこう…手心というか…
細かいアルゴリズム構築周りの個人スキルがかなり落ちているのを感じるので年末に実家帰ったら学生時代の教科書を引っ張りだしてこようと思う。
後paizaのコンパイラはslices
パッケージをサポートしておらずコンパイルエラーになるのだけ何とかしてほしい。マジで。
リスト内の探索処理を問題の度に自前実装するの面倒すぎる。
一応レベルアップメニューとしてはBランクコンプでAランク途中まで。
Aランクの途中で1個だけできていない奴は本当に意味わからないのだが机上デバッグと同一の結果だが入力パターン1つだけエラー判定になっている。
時間あるときに作り直してみるのを検討。