DevQuizのソースコード(Go!編)

初めて触ったGo言語ですが、環境構築の方が手間取ったくらい簡単に回答できました。
LinuxかMacでの環境構築が可能という情報を見つけたので、とりあえず手持ちのMacに環境をインストール後にプログラムを開始。

Go言語の仕様として、if文等の波括弧(中括弧)の位置が固定されており、C言語ほど構文の自由度が無い事が不満でしたが、それ以外は使いやすいというか、結構Objective-Cっぽいというか・・・
後は未使用変数の縛りが厳しかったり(これはコンパイルオプション等で回避できるのかな?)、初期値の代入方法にクセがあったりしたのも印象的でした。

今回の解法ですが、pngファイルから色情報を取得し、その色情報を連結したものをキーとした連想配列を生成し、その数を数えることで画像の色数としました。
(連想配列は同一のキーは上書きされるという特性を利用しています。)
連想配列の総数の取得方法が分からなかった為、連想配列を回しながらインクリメントしていますが、これは標準命令(count的な関数)で効率的にできるはずです。

が、それを調べる間もなくうまくプログラムが動いてしまったので、このまま提出して合格となりました。

package main

import (
    "fmt"
    "io"
    "strings"
    /* add more */
    "image/png"
)

func CountColor(png2 io.Reader) int {
    img, e := png.Decode(png2);
    if e != nil {
        return -1
    }

    m := make(map[string]int)

    for i:=0; i<img.Bounds().Size().X; i++ {
        for j:=0; j<img.Bounds().Size().Y; j++ {
            r,g,b,_ :=img.At(i,j).RGBA()
            m[fmt.Sprint(r) + "-" + fmt.Sprint(g) + "-" + fmt.Sprint(b)] = 1
        }
    }

    cnt := 0
    for _, value := range m {
        cnt = cnt + value
    }

    return cnt
}

この問題については、解答をWEBの入力フォームから提出すると、結果がWEB画面に表示されました。
面白い仕組みだなぁ。。と思いながら、とりあえずGo!は完了。

次回はAndroid編です。

This entry was posted in プログラム. Bookmark the permalink.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です