package main import "strconv" import "strings" import "bufio" import "fmt" import "os" type Screen struct { Pixels [6][50]bool } func NewScreen() Screen { var this Screen return this } func (this *Screen) CreateRect(x int, y int) { for i := 0; i < y; i++ { for j := 0; j < x; j++ { this.Pixels[i][j] = true } } } func (this *Screen) RotateRowByOne(rowIndex int) { tmp := this.Pixels[rowIndex][49] for i := 49; i > 0; i-- { this.Pixels[rowIndex][i] = this.Pixels[rowIndex][i -1] } this.Pixels[rowIndex][0] = tmp } func (this *Screen) RotateRows(rowIndex int, shift int) { for ; shift > 0; shift -- { this.RotateRowByOne(rowIndex) } } func (this *Screen) RotateColumnByOne(colIndex int) { tmp := this.Pixels[5][colIndex] for i := 5; i > 0; i-- { this.Pixels[i][colIndex] = this.Pixels[i -1][colIndex] } this.Pixels[0][colIndex] = tmp } func (this *Screen) RotateColumn(colIndex int, shift int) { for ; shift > 0; shift -- { this.RotateColumnByOne(colIndex) } } func (this *Screen) EvalInstr(line string) bool { if strings.HasPrefix(line, "rect ") { size := strings.Split(line[5:], "x") if len(size) != 2 { return false } px, err := strconv.Atoi(size[0]) if err != nil { return false } py, err := strconv.Atoi(size[1]) if err != nil { return false } this.CreateRect(px, py) } else if (strings.HasPrefix(line, "rotate column x=")) { size := strings.Split(line[16:], " ") colIndex, err := strconv.Atoi(size[0]) if err != nil { return false } rotateBy, err := strconv.Atoi(size[2]) if err != nil { return false } this.RotateColumn(colIndex, rotateBy) } else if (strings.HasPrefix(line, "rotate row y=")) { size := strings.Split(line[13:], " ") rowIndex, err := strconv.Atoi(size[0]) if err != nil { return false } rotateBy, err := strconv.Atoi(size[2]) if err != nil { return false } this.RotateRows(rowIndex, rotateBy) } else { return false } return true } func (this Screen) CountOn() int { result := 0 for i := 0; i < 6; i++ { for j := 0; j < 50; j++ { if this.Pixels[i][j] { result++ } } } return result } func (this Screen) Dump() { for i := 0; i < 6; i++ { for j := 0; j < 50; j++ { if this.Pixels[i][j] { fmt.Printf("#") } else { fmt.Printf(".") } } fmt.Printf("\n") } } func main() { reader := bufio.NewReader(os.Stdin) scr := NewScreen() for true { line, err := reader.ReadString('\n') if len(line) > 0 { line = line[0: len(line) -1] if scr.EvalInstr(line) == false { fmt.Println("WTF instruction " +line) continue } } if (err != nil) { break } } scr.Dump() fmt.Println(scr.CountOn()) }