雰囲気で書いたのであってるか(正しいか)どうかは知らん。呼び出すたびにリバースするだけのやつ。適当にやったのにちゃんと動くからgoはえらい(そういう話ではない)
package main import "fmt" func main(){ test := []int{1, 2, 3, 4, 5} yo := f(test) fmt.Println(yo()) // [5 4 3 2 1] fmt.Println(yo()) // [1 2 3 4 5] fmt.Println(yo()) // [5 4 3 2 1] fmt.Println(yo()) // [1 2 3 4 5] } func f(arr []int)(func()[]int){ _arr := append([]int{}, arr...) _f := func()([]int){ length := len(_arr) for i:=0; i<length/2; i++{ _arr[i], _arr[length-1-i] = _arr[length-1-i], _arr[i] } return _arr } return _f }
もうちょっと役に立ちそうなやつ。Permutation。実装にあたってはこちらを参考、というかパクりました。ありがとうございます。
package main import "fmt" func main(){ test := []int{1, 2, 5, 3, 4} fmt.Println(test) np := nextPermutation(test) for { lis := np() if len(lis) == 0{ break } fmt.Println(lis) } } func nextPermutation(arr []int)(func()[]int){ ret := append([]int{}, arr...) _nextPermutation := func()([]int){ n := len(ret) for i:=n-2; i>=0; i--{ if ret[i] < ret[i+1]{ j := n for{ j-=1 if ret[i] < ret[j]{ break } } ret[i], ret[j] = ret[j], ret[i] for k:=n-1; i<k; i, k = i+1, k-1{ ret[i+1], ret[k] = ret[k], ret[i+1] } return ret } } return []int{} } return _nextPermutation }
verifyはこちら。
Submission #10500314 - AtCoder Beginner Contest 145
競プロだと揃えておくべきやつなのでみんなも風呂で見せ合いっこしようぜ