- 投稿日:2021-03-21T22:15:57+09:00
AtCoder Regular Contest 115のメモ
前置き
Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。問題
A
Q_A.gopackage main import ( "fmt" "strings" ) func main() { var N, M int fmt.Scanf("%d %d", &N, &M) m := make(map[int]int) var s string var count int for i:=0; i<N; i++{ count = 0 fmt.Scanf("%s", &s) s_ := strings.Split(s, "") for j:=0; j<M; j++{ if s_[j] == "1"{ count = count+1 } } _, isThere := m[count] if !isThere { m[count] = 1 } else { m[count] = m[count] + 1 } } var result int var odd, even int for k := range m { if k % 2 == 0{ even += m[k] } else { odd += m[k] } } result = odd * even fmt.Printf("%d\n", result) }B
覚えてたら後で書きます。
C
覚えてたら後で書きます。
D
覚えてたら後で書きます。
E
覚えてたら後で書きます。
F
覚えてたら後で書きます。
- 投稿日:2021-03-21T20:55:04+09:00
Gopher君のかるた大会
概要
問題文が消失したため不詳だが、 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/tyama_codeiq181.go2 のようになった。
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の方が実用的にはましだと思います。