組込みじゃないんかい
Goは素晴らしい言語なのでソートのためにsort
パッケージを呼ぶことができるのです。手間かけてimportしたソートにはぬくもりがありますね。
sortパッケージはこちら。
src/sort/sort.go - The Go Programming Language
続きを読むGoは素晴らしい言語なのでソートのためにsort
パッケージを呼ぶことができるのです。手間かけてimportしたソートにはぬくもりがありますね。
sortパッケージはこちら。
src/sort/sort.go - The Go Programming Language
続きを読むそういえばやったことなかったので。n*mだとこういう感じです
graph := make([][]string, n) for i:=0; i<n; i++{ graph[i] = make([]string, m) }
Goでスライスをコピーする関数があります。
func copy(dst, src []Type) int
戻り値は「コピーが成功した要素の数」です。
注意点として、dst
とsrc
の長さが短いほうのぶんだけしかコピーされません。なので、
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...)
速度とかは知りません。
調べても見つからなかったんだけど、書式指定子なんてみんな同じノリだろという感じで適当に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
とりあえず空白区切りでの入力と一行をスライスとして得るのとそのうちでmin/maxをとるやつ。
どんどん更新してるので履歴はgistからどうぞ
メソッドチェーン的なのができないのはGenericsが無いかららしいんですが、pythonやC#のLINQにお世話になってきているのですごいめんどくさい。 [2018/04/16]追記参照
コメントアウトしてあるやつは予めいくつの要素が与えられるかわからない場合のやつで、AOJでみかけたりするやつ用として最初に作りました。pythonだとそもそもlis = list(map(int, input().split()))
とかでいくつ要素あるか知っていても一気にとってしまう事が多いのですが、goではそもそも使われてない変数とかあると怒られるので積極的に使っていこうという姿勢です。
あと疑似デフォルト引数的に構造体にフィールドをまとめるみたいなやつも使えます。競プロで使うには冗長になりすぎるので今回は使わなかったです
追記:2018/01/09 12:24
gistにおいてあります。早速更新してroundを付け足しました
追記:2018/04/16 10:08
“メソッドチェーン的なのができないのはGenericsが無いから” ← そのりくつはおかしい / “GoでCompetitive Programming用途のUtilityみたいなやつ - 田舎の高卒底辺フリーターがエンジニアを…” https://t.co/PFSiuQT5uX
— 全年齢リツイート先生 (@otiai10) 2018年1月9日
ツッコミありがとうございます。よくわかってないままノリで書きました。どこを参照したか覚えてないので参照ページを付記することの重要性を改めて思いました。まだよくわかってないので分かるか誰か教えてくれる人に教えていただけるまで消しときます。
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のAPIからは自分のアカウントでlikeしたtrackにはアクセスできるのですが、playlistには対応してないらしいです。
ならばpython+bs4+seleniumで、とも思ったのですが、pythonすら危ういのに使ったことない技術を2つも使うのは無理勉強しているうちに消されちゃうとなったので別の方法を模索しました。ちなみに結論からいうと一切pythonとか使わずに済んだのですが丸2日以上を要しました。アホです
とりあえず現状あるぶんだけのurlがわかればいいのでタイトルです。
続きを読む