20210321のGoに関する記事は2件です。

AtCoder Regular Contest 115のメモ

前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

問題

A

Q_A.go
package 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

覚えてたら後で書きます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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の方が実用的にはましだと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む