Return to problem list

2016-1B Problem A

Final solution

cmd.go:
save   open on GitHub
// package, import, etc...

func start() {
	assert(len(numbers) == 10)
	assert(len(order) == 10)
	var t int
	mustReadLineOfInts(&t)
	for i := 0; i < t; i++ {
		fmt.Fprintf(stdout, "Case #%d: ", i+1)
		test()
	}
}

var numbers []string = []string{"ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"}
var order []int = []int{0, 2, 4, 6, 8, 3, 5, 7, 1, 9}

func test() {
	line := mustReadLine()
	freqMap := make(map[byte]int)
	for i := 0; i < len(line); i++ {
		freqMap[line[i]]++
	}
	result := make([]byte, 0)
	for tryNumIndex := 0; tryNumIndex < len(order); tryNumIndex++ {
		tmpMap := make(map[byte]int)
		for k, v := range freqMap {
			tmpMap[k] = v
		}
		ok := true
		tryNum := order[tryNumIndex]
		numString := numbers[tryNum]
		for i := 0; i < len(numString); i++ {
			l := numString[i]
			if tmpMap[l] > 0 {
				tmpMap[l]--
			} else {
				ok = false
				break
			}
		}
		if !ok {
			continue
		}
		freqMap = tmpMap
		result = append(result, strconv.Itoa(tryNum)[0])
		tryNumIndex--
	}
	for _, v := range freqMap {
		if v != 0 {
			lefts := make([]byte, 0)
			for k, v := range freqMap {
				if v != 0 {
					lefts = append(lefts, k)
				}
			}
			panic(fmt.Errorf("Error: %v left, Current buffer is %v.", string(lefts), string(result)))
		}
	}
	sort.Slice(result, func(i, j int) bool {
		return result[i] < result[j]
	})
	stdout.WriteString(string(result))
	stdout.WriteByte('\n')
}

// boilerplate omitted...

Sample test cases given in question

sample.in:
save   open on GitHub
4
OZONETOWER
WEIGHFOXTOURIST
OURNEONFOE
ETHER