電波ビーチ

☆(ゝω・)v

golangでジェネレータ

雰囲気で書いたのであってるか(正しいか)どうかは知らん。呼び出すたびにリバースするだけのやつ。適当にやったのにちゃんと動くから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。実装にあたってはこちらを参考、というかパクりました。ありがとうございます。

qiita.com

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

競プロだと揃えておくべきやつなのでみんなも風呂で見せ合いっこしようぜ