Пример #1
0
func solver(in *ProblemReader.ProblemReader) string {
	turnAround := in.Num()
	nums := in.NNums(2)
	nA, nB := nums[0], nums[1]
	allTrips := make([]trip, nA+nB)

	for _, v := range allStations {
		v.clear()
	}

	for j := 0; j < nA; j++ {
		allTrips[j] = readTrip(in, A, B)
	}
	for j := 0; j < nB; j++ {
		allTrips[nA+j] = readTrip(in, B, A)
	}
	sort.Sort(tripArray(allTrips))

	for _, t := range allTrips {
		src, dst := allStations[t.src], allStations[t.dst]

		// fmt.Printf("trip:%v, from %v to %v\n", t, src, dst)

		src.getTrain(t.depart)
		dst.addTrain(t.arrive + turnAround)
	}

	return fmt.Sprintf("%d %d", allStations[A].reserved, allStations[B].reserved)
}
Пример #2
0
func solver(in *ProblemReader.ProblemReader) string {
	word := []byte(in.Line())
	lastVal = -1

	letterVal := make(map[byte]int)
	for _, c := range word {
		if _, ok := letterVal[c]; !ok {
			letterVal[c] = nextVal()
		}
	}

	base := int64(lastVal + 1)
	if base == 1 {
		base++
	}
	sum := int64(0)
	mul := int64(1)

	//fmt.Println("letterVal: ", letterVal, "word:", word)

	for j := len(word) - 1; j >= 0; j-- {
		sum += mul * int64(letterVal[word[j]])
		//fmt.Println("letter: ", word[j], "val: ", letterVal[word[j]], "mul: ", mul, "sum: ", sum)
		mul *= base
	}
	return fmt.Sprintf("%d", sum)
}
Пример #3
0
func solver(in *ProblemReader.ProblemReader) string {
	words := in.Words()

	reversed := make([]string, len(words))
	for pos, word := range words {
		reversed[len(words)-pos-1] = word
	}
	return strings.Join(reversed, " ")
}
Пример #4
0
func loadBoard(in *ProblemReader.ProblemReader) *board {
	hw := in.NNums(2)
	b := new(board)
	b.height, b.width = hw[0], hw[1]
	b.cell = make([][]*Cell, b.height)
	for j := 0; j < b.height; j++ {
		b.cell[j] = make([]*Cell, b.width)
		altitude := in.NNums(b.width)
		for k := 0; k < b.width; k++ {
			b.cell[j][k] = &Cell{altitude: altitude[k]}
		}
	}
	return b
}
Пример #5
0
func solver(in *ProblemReader.ProblemReader) string {
	n := in.Num()
	v1 := in.NNums(n)
	v2 := in.NNums(n)

	sort.SortInts(v1)
	sort.SortInts(v2)

	var sum int64 = 0

	for j := 0; j < n; j++ {
		sum += int64(v1[j]) * int64(v2[n-j-1])
	}
	return fmt.Sprint(sum)
}
Пример #6
0
func solver(in *ProblemReader.ProblemReader) string {
	nums := in.NNums(2)
	board, toWin := nums[0], nums[1]
	assert(toWin <= board)
	lines := make([]string, board)
	for j := 0; j < board; j++ {
		line := []byte(in.Line())
		if len(line) != board {
			log.Fatalf("Expected %#v to be %d long", string(line), board)
		}
		shiftLine(line)
		lines[j] = string(line)
	}
	return winner(lines, toWin)
}
Пример #7
0
func solver(in *ProblemReader.ProblemReader) string {
	line := in.Line()
	scores := make([]int, len(PATTERN))
	for j := range line {
		c := line[j]
		for k := len(PATTERN) - 1; k >= 0; k-- {
			if c == PATTERN[k] {
				if k == 0 {
					scores[k] = (scores[k] + 1) % 10000
				} else {
					scores[k] = (scores[k] + scores[k-1]) % 10000
				}
			}
		}
	}
	return fmt.Sprintf("%04d", scores[len(scores)-1])
}
Пример #8
0
func solver(in *ProblemReader.ProblemReader) string {
	n := in.Num()
	wires := make([]Wire, n)

	for j := 0; j < n; j++ {
		wire := in.NNums(2)
		wires[j] = Wire{wire[0], wire[1]}
	}
	sort.Sort(WireSlice(wires))

	cross := 0
	for j := 0; j < n; j++ {
		for k := j + 1; k < n; k++ {
			if wires[k].b < wires[j].b {
				cross++
			}
		}
	}
	return fmt.Sprintf("%d", cross)
}
Пример #9
0
func solver(in *ProblemReader.ProblemReader) string {
	credit := in.Num()
	items := in.Num()
	prices := in.NNums(items)

	p0, p1 := pairSum(credit, prices)
	return fmt.Sprintf("%d %d", p0+1, p1+1)
}
Пример #10
0
func solver(in *ProblemReader.ProblemReader) string {
	nums := in.NNums(2)
	existing, toCreate := nums[0], nums[1]

	tree := newTree()

	for j := 0; j < existing; j++ {
		tree.add(in.Line())
	}
	additions := 0
	for j := 0; j < toCreate; j++ {
		additions += tree.add(in.Line())
	}

	return fmt.Sprintf("%d", additions)
}
Пример #11
0
func solver(in *ProblemReader.ProblemReader) string {
	nEngines := in.Num()

	engines := make([]string, nEngines)
	for j := 0; j < nEngines; j++ {
		engines[j] = in.Line()
	}

	terms := in.Num()
	available := make(map[string]bool)
	reset(available, engines, "")
	changes := 0
	for j := 0; j < terms; j++ {
		term := in.Line()
		if _, ok := available[term]; ok {
			available[term] = false, false
			if len(available) == 0 {
				changes++
				reset(available, engines, term)
			}
		}
	}
	return fmt.Sprintf("%d", changes)
}
Пример #12
0
func solver(in *ProblemReader.ProblemReader) string {
	flavours := in.Num()
	nCustomers := in.Num()

	customers := make([]*customer, nCustomers)
	for j := 0; j < nCustomers; j++ {
		customers[j] = newCustomer(in.Nums())
	}

	malted := make(map[int]bool, flavours)
	for j := 0; j < flavours; j++ {
		malted[j+1] = false
	}

	keepLooking := true
	for keepLooking {
		keepLooking = false
		// Is there anybody unhappy?
		for _, c := range customers {
			if !c.happyWith(malted) {
				// Unhappy, but can be made happy with malt
				if c.likesMalted && !malted[c.malted] {
					malted[c.malted] = true
					keepLooking = true
				} else {
					return "IMPOSSIBLE"
				}
			}
		}
	}

	reply := make([]string, flavours)
	for j := 0; j < flavours; j++ {
		reply[j] = ternary(malted[j+1], "1", "0")
	}
	return strings.Join(reply, " ")
}
Пример #13
0
func readTrip(in *ProblemReader.ProblemReader, src string, dst string) trip {
	sched := in.Words()
	return trip{src, dst, parseT(sched[0]), parseT(sched[1])}
}