Return to problem list2016-1B Problem A
Final solution
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')
}
Sample test cases given in question
4
OZONETOWER
WEIGHFOXTOURIST
OURNEONFOE
ETHER