DevQuiz 2011 - Go

解答晒し。誰が書いても似た様になるだろうけど。


1つだけ疑問。オリジナルのCountColorの引数がpngになっていたけど、image/pngをimportした時に、名前が衝突してpng.Decode()が呼び出せない。io.Readerの変数名がpngというのも気持ち悪いのでsrcに変更したけど、本当はどうすべきだったのか*1

package main

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

func rgbaToInt(s image.Color) uint32 {
	r, g, b, a := s.RGBA()
	i32 := r + g<<8 + b<<16 + a<<24 
	return i32
}

func CountColor(src io.Reader) int {
	hash := make(map[uint32] int)

	dec, e := png.Decode(src)
	if e != nil {
		fmt.Println(e)
		return -1
	}

	for y := dec.Bounds().Min.Y; y < dec.Bounds().Max.Y; y++ {
		for x := dec.Bounds().Min.X; x < dec.Bounds().Max.X; x++ {
			color := dec.At(x, y)
			if hash[rgbaToInt(color)] != 1 {
			   hash[rgbaToInt(color)] = 1
			}
		}
	}
	return len(hash)
}

/* これらの関数は提出時に自動挿入されます。 */
func main() {
	png := GetPngBinary()
	cnt := CountColor(png)
	fmt.Println(cnt)
}

*1:@adakoda 情報: importでPNG "image/png"とするとエイリアスがつけられる。

DevQuiz 2011 - Android

誰が書いても似た様になるだけなので、解答晒さない。


AndroidEclipse環境はとても賢い。Eclipse様の仰るとおりにインプリメントしただけ。

  • AIDLファイルをプロジェクトにDrag & Drop
    • src/com/google/android/apps/gddquizに置けと怒られる
    • そうする
  • ServiceConnectionのメンバー変数定義
    • connect/disconnectのメソッドを定義しろと怒られる
    • そうする
  • 適宜Shift-Ctrl-Oでimportの整理
  • あとはAIDLのドキュメントの通り
    • Ctrl-Spaceで補完しまくり
    • Log.dに出してこぴぺ

DevQuiz 2011 - 一人ゲーム

解答晒し。やや長いのでpatebin。

http://pastebin.com/9mZBtu1H

  • まず、ロボット的に最短に近い手数を出す。(ruledengine)
    • 奇数かつ5で割り切れる数が1以上なら、取り除く(evalremove5)
    • それ以外は半分
    • 繰り返せば最短に近い手数が出そう
  • ロボットが出した手数まで全探索(walkaroundengine)
    • 単純な2分木探索
  • 取り除かれた数字には-1をいれておくことで、配列のコピーを避ける

DevQuiz 2011 - スライドパズル

解答晒し。やや長いのでpatebin。

http://pastebin.com/ayQbs5UA

  • 単純なA*(のハズ)
  • 16個プロセスを立ち上げて分散
    • mod16番目の問題をそれぞれが対応
    • 1プロセスあたり100MB程度のメモリ消費
  • キュー済みかどうかの判定がstrcmp
  • 正解文字列生成にsort
    • bubble sortを実装
  • しかし、100問しか解けなかった
    • 参考になりません

C言語だと再発明する車輪が多すぎです。