概要
問題文が消失したため不詳だが、 https://github.com/cielavenir/codeiq_solutions/blob/master/00misc/comb/comb_test.go なるテストコードがpassすれば良い。
つまり、
func main(){
strs := []string{"A", "B", "C", "D", "E"}
for i := range comb.CombinationGenerator(5,2){
var actual []string
i.Index(strs,&actual)
fmt.Printf("%v\n", actual)
}
}
なるmainに対し、
[A B]
[A C]
[A D]
[A E]
[B C]
[B D]
[B E]
[C D]
[C E]
[D E]
なる出力をすれば良い。
本問に関して、 https://qiita.com/cielavenir/items/d82515b7d12ab25afa56 にて、「Goの型システムは死ぬほど理解に苦しむ、と思った。」と述べた。だが、これを克服できる可能性が生まれた。
条件
- comb.CombinationGeneratorが組み合わせを表すオブジェクトを組み合わせ数分返すこと
- 当該オブジェクトがIndexメソッドを持つこと
である。 「組み合わせを表すオブジェクト」の型は規定されていない というのが肝要である。
Go2
Go2にて、ジェネリクスが導入されることとなった。メソッドに対してはジェネリクスを扱えないので、オブジェクトの側に型を導入するしかない。
てなわけで https://github.com/cielavenir/codeiq_solutions/blob/master/00misc/comb/tyama_codeiq181_generics.go のようになった。
8年越し に解くことができた。
余談1
C++でこういうコードが合法らしい。初めて知った。
#include <iostream>
template<typename T>
void P(int x){std::cout<<x<<std::endl;}
int main(){P<char>(3.0);}
余談2
unique_permutationの方が実用的にはましだと思います。