| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- 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())
- }
|