0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Gopher君のかるた大会

Last updated at Posted at 2021-03-23

概要

問題文が消失したため不詳だが、 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の方が実用的にはましだと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?