前回rubyをいれたんですが、rubyいれたら書き始める前に使い方を覚えておけと話題のrubocopを触ってみます。
続きを読むGoでスライスの任意のインデックスに挿入
ちなみに「任意のインデックスを削除」はこれでやってます。
実装
package main import "fmt" func main(){ n := []int{1, 2, 3,} incert_target := 9999 intint := make([][]int, 0) for i:=0; i<len(n)+1; i++{ intint = append(intint, incert(i, incert_target, n)) } fmt.Println(intint) } func incert(index int, x int, origin []int)(ret []int){ ret = append([]int{}, origin...) ret = append(ret[:index], append([]int{x}, ret[index:]...)...) return }
Goのスライスの応用的な使い方はこれを一通りみればいいです
ちなみにdelete
はmapの組み込み関数なので注意。
Goで順列を辞書順で
スライスのポインタで渡すところとスライスのコピーとスライスの任意のインデックスの要素を消すっていう実装が頭まわりませんでした…
実装
package main import "fmt" func main(){ test := []int{1, 2, 3, 4} perms := permuration(test, 3) fmt.Println("1から4の中から3つ取る順列") fmt.Println(perms) // int以外の場合でもどうせインデックスを返すので数列を渡せばいい aquars := []string{"千歌", "梨子", "曜", "ダイヤ", "果南", "鞠莉", "善子", "花丸", "ルビィ"} indices := make([]int, len(aquars)) for i := 0; i<len(aquars); i++{ indices[i] = i } coupling := permuration(indices, 3) for _, c := range coupling{ for i, v := range c{ fmt.Print(aquars[v]) if i<2{ fmt.Print(" x ") } } fmt.Println() } } func permuration(target []int, limit int)([][]int){ if limit<1 || len(target)<limit{ return nil } ret := make([][]int, 0) gen_perm(make([]int, 0), target, &ret, limit) return ret } func gen_perm(perm []int, rest []int, lis *[][]int, n int){ if n==0{ *lis = append(*lis, perm) }else{ // 探索 for i, r := range rest{ next_rest := make([]int, 0) next_rest = append(next_rest, rest...) next_perm := make([]int, 0) next_perm = append(next_perm, perm...) next_rest = deleteIndex(next_rest, i) next_perm = append(next_perm, r) gen_perm(next_perm, next_rest, lis, n-1) } } } func deleteIndex(in []int, index int)[]int{ out := make([]int, 0) out = append(out, in...) if index<0 || len(in)<index{ fmt.Println("delete index mis") return nil } out = append(out[:index], out[index+1:]...) return out }
gen_perm
は最初無名関数でやってたんですが無名関数の再帰ってできないんですね(当然)
参考
Go のスライスでハマッたところ - Block Rockin’ Codes
Goで「文字列のa番目からb番目までを反転」をやる
そういう問題があったので。
Transformation | Aizu Online Judge
func Reverse(s string, a int, b int) string { r := []rune(s) for i, j := a, b; i < (a+b)/2+1; i, j = i+1, j-1 { r[i], r[j] = r[j], r[i] } return string(r) }
(a+b)/2+1
でちゃんと+1しないといけない。
Goで二次元スライスの宣言をグローバルでやってローカルで初期化
日本語あってるかわかりませんが。
main
の外で二次元スライスを作っておき、中でmake
でcap/lenを設定して初期化するといいです。
package main import "fmt" var multislice [][]string func main(){ multislice = make([][]string, 4) s := []string{"ドバイ", "インド", "ドイツ", "味噌汁"} for i:=0; i<len(multislice); i++{ multislice[i] = make([]string, 3) for j:=0; j<len(multislice[0]); j++{ multislice[i][j] = string([]rune(s[i])[j]) } } fmt.Println(multislice) }
出力
[[ド バ イ] [イ ン ド] [ド イ ツ] [味 噌 汁]]
競プロでたとえば入力であとからHeight, Widthを与えられる問題なんかのときにどうすりゃいいかわからんかったので。