package main

import (
	"fmt"
	"os"
	"strconv"
	"strings"
)

/* This program generates instructions to display words
 * on the screen from day 8
 * It assumes the screen size is 50x6
 */
func main() {
	if len(os.Args) < 2 {
		fmt.Println("Expected argument with word to convert.")
		os.Exit(1)
	}
	wrd := strings.ToUpper(os.Args[1])
	for i := len(wrd) - 1; i >= 0; i-- {
		printInst(runeToInst(rune(wrd[i])))
		if i > 0 {
			printInst(shiftCols(2))
		}
	}
}

func printInst(i []string) {
	for j := range i {
		fmt.Println(i[j])
	}
}

func runeToInst(r rune) []string {
	var ret []string
	switch r {
	case 'A':
		/*
			    ##
			   #  #
			   #  #
			   ####
			   #  #
				 #  #
		*/
		ret = append(ret, "rect 1x5")
		ret = append(ret, "rotate column x=0 by 1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x5")
		ret = append(ret, "rotate column x=0 by 1")
	case 'B':
		/*
		   ###
		   #  #
		   ###
		   #  #
		   #  #
		   ###
		*/
		ret = append(ret, "rect 1x2")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x6")
	case 'C':
		/*
			    ##
			   #  #
			   #
				 #
			   #  #
			    ##
		*/
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 5")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 5")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x4")
		ret = append(ret, "rotate column x=0 by 1")
	case 'D':
		/*
		   ###
		   #  #
		   #  #
		   #  #
		   #  #
		   ###
		*/
		ret = append(ret, "rect 1x4")
		ret = append(ret, "rotate column x=0 by 1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 5")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 5")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x6")
	case 'E':
		/*
		   ####
		   #
		   ###
		   #
		   #
		   ####
		*/
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 5")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x6")
	case 'F':
		/*
		   ####
		   #
		   ###
		   #
		   #
		   #
		*/
		ret = append(ret, shiftCols(5)...)
		ret = append(ret, "rect 3x1")
		ret = append(ret, "rotate column x=2 by 2")
		ret = append(ret, "rotate column x=1 by 2")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, "rect 4x1")
		ret = append(ret, "rect 1x6")
	case 'G':
		/*
		    ###
		   #
		   # ##
		   #  #
		   #  #
		    ##
		*/
		ret = append(ret, "rect 1x3")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 5")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x4")
		ret = append(ret, "rotate column x=0 by 1")
	case 'H':
		/*
		   #  #
		   #  #
		   ####
		   #  #
		   #  #
		   #  #
		*/
		ret = append(ret, "rect 1x6")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x6")
	case 'I':
		/*
		   ###
		    #
		    #
		    #
		    #
		   ###
		*/
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 5")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x6")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 5")
		ret = append(ret, "rect 1x1")
	case 'J':
		/*
		      #
		      #
		      #
		   #  #
		   #  #
		    ##
		*/
		ret = append(ret, "rect 1x5")
		ret = append(ret, shiftCols(2)...)

		ret = append(ret, "rect 2x1")
		ret = append(ret, "rotate column x=1 by 5")
		ret = append(ret, "rotate column x=0 by 5")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x2")
		ret = append(ret, "rotate column x=0 by 3")
	case 'K':
		/*
		   #  #
		   # #
		   ##
		   # #
		   #  #
		   #  #
		*/
		ret = append(ret, "rect 1x2")
		ret = append(ret, "rotate column x=0 by 4")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x6")
	case 'L':
		/*
		   #
		   #
		   #
		   #
		   #
		   ####
		*/
		ret = append(ret, shiftCols(3)...)
		ret = append(ret, "rect 4x1")
		ret = append(ret, "rotate column x=0 by 5")
		ret = append(ret, "rotate column x=1 by 5")
		ret = append(ret, "rotate column x=2 by 5")
		ret = append(ret, "rotate column x=3 by 5")
		ret = append(ret, "rect 1x6")
	case 'M':
		/*
		   #  #
		   ####
		   ####
		   #  #
		   #  #
		   #  #
		*/
		ret = append(ret, "rect 1x6")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x2")
		ret = append(ret, "rotate column x=0 by 1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x2")
		ret = append(ret, "rotate column x=0 by 1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x6")
	case 'N':
		/*
		   #  #
		   ## #
		   # ##
		   # ##
		   #  #
		   #  #
		*/
		ret = append(ret, "rect 1x6")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x2")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x6")

	case 'O':
		/*
		    ##
		   #  #
		   #  #
		   #  #
		   #  #
		    ##
		*/
		ret = append(ret, "rect 1x4")
		ret = append(ret, "rotate column x=0 by 1")
		ret = append(ret, shiftCols(2)...)
		ret = append(ret, "rect 2x1")
		ret = append(ret, "rotate column x=1 by 5")
		ret = append(ret, "rotate column x=0 by 5")
		ret = append(ret, "rect 2x1")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x4")
		ret = append(ret, "rotate column x=0 by 1")

	case 'P':
		/*
		   ###
		   #  #
		   ###
		   #
		   #
		   #
		*/
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 1")
		ret = append(ret, shiftCols(2)...)

		ret = append(ret, "rect 2x1")
		ret = append(ret, "rotate column x=1 by 2")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, "rect 2x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x6")

	case 'Q':
		/*
		    ##
		   #  #
		   #  #
		   #  #
		   # ##
		    ###
		*/
		ret = append(ret, "rect 1x5")
		ret = append(ret, "rotate column x=0 by 1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x2")
		ret = append(ret, "rotate column x=0 by 4")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 5")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x4")
		ret = append(ret, "rotate column x=0 by 1")

	case 'R':
		/*
		   ###
		   #  #
		   #  #
		   ###
		   #  #
		   #  #
		*/
		ret = append(ret, "rect 1x2")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, "rect 1x2")
		ret = append(ret, "rotate column x=0 by 1")
		ret = append(ret, shiftCols(2)...)

		ret = append(ret, "rect 2x1")
		ret = append(ret, "rotate column x=1 by 3")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, "rect 2x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x6")

	case 'S':
		/*
		    ###
		   #
		   #
		    ##
		      #
		   ###
		*/
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 4")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)

		ret = append(ret, "rect 1x2")
		ret = append(ret, "rotate column x=0 by 1")

	case 'T':
		/*
		   ####
		    #
		    #
		    #
		    #
		    #
		*/
		ret = append(ret, shiftCols(2)...)
		ret = append(ret, "rect 3x1")
		ret = append(ret, "rect 1x6")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x1")

	case 'U':
		/*
		   #  #
		   #  #
		   #  #
		   #  #
		   #  #
		    ##
		*/
		ret = append(ret, "rect 1x5")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 5")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 5")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x5")

	case 'V':
		/*
		   #  #
		   #  #
		   #  #
		    ##
		    ##
		    ##
		*/
		ret = append(ret, "rect 1x3")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x3")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x3")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x3")

	case 'W':
		/*
		   #  #
		   #  #
		   #  #
		   ####
		   ####
		   #  #
		*/
		ret = append(ret, "rect 1x6")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x2")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x2")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x6")

	case 'X':
		/*
		   #  #
		   #  #
		    ##
		    ##
		   #  #
		   #  #
		*/
		ret = append(ret, "rect 1x2")
		ret = append(ret, "rotate column x=0 by 4")
		ret = append(ret, "rect 1x2")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x2")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x2")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x2")
		ret = append(ret, "rotate column x=0 by 4")
		ret = append(ret, "rect 1x2")

	case 'Y':
		/*
		   #  #
		   #  #
		    ###
		      #
		      #
		    ##
		*/
		ret = append(ret, "rect 1x5")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x2")

	case 'Z':
		/*
		   ####
		   #  #
		     #
		    #
		   #  #
		   ####
		*/
		ret = append(ret, "rect 1x2")
		ret = append(ret, "rotate column x=0 by 4")
		ret = append(ret, "rect 1x2")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 2")
		ret = append(ret, "rect 1x1")
		ret = append(ret, "rotate column x=0 by 3")
		ret = append(ret, "rect 1x1")
		ret = append(ret, shiftCols(1)...)
		ret = append(ret, "rect 1x2")
		ret = append(ret, "rotate column x=0 by 4")
		ret = append(ret, "rect 1x2")
	case ' ':
		ret = append(ret, shiftCols(4)...)
	default:
		ret = append(ret, shiftCols(4)...)
		ret = append(ret, "rect 4x1")
		ret = append(ret, "rotate column x=3 by 2")
		ret = append(ret, "rotate column x=2 by 2")
		ret = append(ret, "rotate column x=1 by 2")
		ret = append(ret, "rotate column x=0 by 2")
	}
	return ret
}

func shiftCols(dist int) []string {
	var ret []string
	for i := 0; i < 6; i++ {
		ret = append(ret, "rotate row y="+itoa(i)+" by "+itoa(dist))
	}
	return ret
}

func shiftRows(dist int) []string {
	var ret []string
	for i := 0; i < 50; i++ {
		ret = append(ret, "rotate col x="+itoa(i)+" by "+itoa(dist))
	}
	return ret
}

func itoa(i int) string {
	return strconv.Itoa(i)
}
