September 13, 2011

Google Developer Day 2011:DevQuiz解答晒し大会(3)

分野別問題(2) Go

与えられるPNGファイルが以下の制約を持つことを利用している。

  • RGBそれぞれ256階調である
  • アルファチャンネルは固定である

Colorオブジェクトを配列に格納する形式だと色数が増えたときに使用メモリ量、速度ともに制約を受けるのでビットマップで色の出現を管理する形式にした。

package main

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

func CountColor(png io.Reader) int {
    cnt := 0
    var color [256*256*4]uint64
    img, err := pngimage.Decode(png)
    if err != nil {
        return 0
    }
    border := img.Bounds()
    for n := border.Min.Y; n < border.Max.Y; n++ {
        for m := border.Min.X; m < border.Max.X; m++ {
            colr := img.At(m,n)
            r0, g0, b0, _ := colr.RGBA()
            index := (((r0 >> 8) << 16) | ((g0 >> 8) << 8) | (b0 >> 8)) >> 6
            var flag uint64 = 1 << ((b0 >> 8) & 0x3f)
            if (color[index] & flag == 0) {
                color[index] |= flag
                cnt += 1
            }
        }
    }
    return cnt

}