電波ビーチ

☆(ゝω・)v

Goのsortパッケージを少し調べた

組込みじゃないんかい

Goは素晴らしい言語なのでソートのためにsortパッケージを呼ぶことができるのです。手間かけてimportしたソートにはぬくもりがありますね。

sortパッケージはこちら。

src/sort/sort.go - The Go Programming Language

続きを読む

Sliceをコピーするときcopyじゃなくてappendを使うとなにも考えずに済む

Goでスライスをコピーする関数があります。

func copy(dst, src []Type) int

戻り値は「コピーが成功した要素の数」です。

注意点として、dstsrcの長さが短いほうのぶんだけしかコピーされません。なので、

arr := []int{1, 2, 3}
tmp := []int{}
copy(tmp, arr)

は、len(tmp) == 0なので、最大コピー数は0、つまりコピーなんてされません。

fmt.Println(tmp)    //    []
fmt.Println(arr)    //    [1 2 3]

解決策として、予めコピー元のサイズを求めてmakeしておく手がありますが、書くのめんどくせぇです。

// あらかじめサイズを確保して作っておく
tmp := make([]int, len(arr))
copy(tmp, arr)

愚直です。

空のスライスにコピー元をまるごとappendで追加したやつが1行も短く書けます。

tmp := append([]int{}, arr...)

速度とかは知りません。

Goでfloat値を小数点以下n位まで出力する

調べても見つからなかったんだけど、書式指定子なんてみんな同じノリだろという感じで適当にC言語の書き方をしたらいけた。

a := 156.0/46.0
fmt.Println(a)
fmt.Printf("%f\n", a)
fmt.Printf("%.4f\n", a)     //小数点以下4桁まで
fmt.Printf("%10.3f\n", a)   //右詰め・小数点以下3桁まで
fmt.Printf("%010.5f\n", a)  //ゼロ埋め・右詰め・小数点以下5桁まで
>>> 3.391304347826087
>>> 3.391304
>>> 3.3913
>>>     3.391
>>> 0003.39130

GoでCompetitive Programming用途のUtilityみたいなやつ

とりあえず空白区切りでの入力と一行をスライスとして得るのとそのうちでmin/maxをとるやつ。 どんどん更新してるので履歴はgistからどうぞ

メソッドチェーン的なのができないのはGenericsが無いかららしいんですが、pythonC#LINQにお世話になってきているのですごいめんどくさい。 [2018/04/16]追記参照
コメントアウトしてあるやつは予めいくつの要素が与えられるかわからない場合のやつで、AOJでみかけたりするやつ用として最初に作りました。pythonだとそもそもlis = list(map(int, input().split()))とかでいくつ要素あるか知っていても一気にとってしまう事が多いのですが、goではそもそも使われてない変数とかあると怒られるので積極的に使っていこうという姿勢です。
あと疑似デフォルト引数的に構造体にフィールドをまとめるみたいなやつも使えます。競プロで使うには冗長になりすぎるので今回は使わなかったです

otiai10.hatenablog.com

追記:2018/01/09 12:24
gistにおいてあります。早速更新してroundを付け足しました

追記:2018/04/16 10:08

ツッコミありがとうございます。よくわかってないままノリで書きました。どこを参照したか覚えてないので参照ページを付記することの重要性を改めて思いました。まだよくわかってないので分かるか誰か教えてくれる人に教えていただけるまで消しときます。

Goでマルチバイト文字列をインデックス付きでほしい

Goでは文字列型は[]byteとして解釈されるらしいです。

mojiretsu := "💀test♡"
for i:=0; i<len(mojiretsu); i++{
    fmt.Printf("%v ", mojiretsu[i])
}
>>> 240 159 146 128 116 101 115 116 226 153 161

そこで、rune型とかいうのが使われます。forでstring型に対してrangeを使うと、全体に対する1文字ごとのバイト列のインデックス値とrune型が返ります。しれっと書いてますがこの理解であっているか知りません

target := "のじゃロリ狐娘virtualyoutuberおじさん"
for i,v := range target{
   fmt.Printf("index:%d -> %s\n", i, string([]rune{v}))
}

出力がこんな感じになってしまいます

index:0 -> の
index:3 -> じ
index:6 -> ゃ
index:9 -> ロ
index:12 -> リ
index:15 -> 狐
index:18 -> 娘
index:21 -> v
index:22 -> i
index:23 -> r
index:24 -> t
index:25 -> u
index:26 -> a
index:27 -> l
index:28 -> y
index:29 -> o
index:30 -> u
index:31 -> t
index:32 -> u
index:33 -> b
index:34 -> e
index:35 -> r
index:36 -> お
index:39 -> じ
index:42 -> さ
index:45 -> ん

インデックスが文字ごとではなく、全体をバイト列とみたときに該当する文字の箇所の最初のインデックスになっています。

外部にインデックス用の変数を用意しとくのも手ですがそれだけのために冗長です。いっそforのスコープ内で作れればいいのですがrangeを使っている関係上(たぶん)これ以上簡易文で変数は作れないです。わからんけど

cur := 0
for _,v := range target{
     fmt.Printf("index:%d -> %s\n", cur, string([]rune{v}))
     cur+=1
}

rangeに渡すときに文字列を[]runeとしてやればいいです。

for i, v:=range []rune(target){
     fmt.Printf("index: %d -> %s\n", i, string(v))
}

soundcloud.com/you/setsの指定要素からurlを抜き取ってくる

あらすじ

消される前に落としたいのだけれどsoundcloudAPIからは自分のアカウントでlikeしたtrackにはアクセスできるのですが、playlistには対応してないらしいです。

stackoverflow.com

ならばpython+bs4+seleniumで、とも思ったのですが、pythonすら危ういのに使ったことない技術を2つも使うのは無理勉強しているうちに消されちゃうとなったので別の方法を模索しました。ちなみに結論からいうと一切pythonとか使わずに済んだのですが丸2日以上を要しました。アホです

とりあえず現状あるぶんだけのurlがわかればいいのでタイトルです。

続きを読む