Drill

ProblemsGo › patterns

Which commit broke the build

mediumpatternsBinary searchArraysGo

Every commit up to some point built cleanly and every one after it fails. A bisect finds the first bad one without building them all.

firstBadBuild(passed: list<bool>) → int

Go needs a compiler and Drill does not host one yet, so this page is the reference rather than an exercise: the problem, worked examples, and the solution in full. To type it out, the same problem runs in Python.

Solve it in Python →

Where you start

func firstBadBuild(passed []bool) int {
	
}

Worked examples

CallResult
firstBadBuild([]bool{true, true, false, false})2
firstBadBuild([]bool{true, true, true})-1
firstBadBuild([]bool{false, false})0
firstBadBuild([]bool{})-1

Hint

This is what `git bisect` does. Halve the range, and let a failure pull the right edge in while a pass pushes the left edge out.

Reference solution in Go
func firstBadBuild(passed []bool) int {
	lo, hi := 0, len(passed)
	for lo < hi {
	    mid := (lo + hi) / 2
	    if passed[mid] {
	        lo = mid + 1
	    } else {
	        hi = mid
	    }
	}
	if lo == len(passed) {
	    return -1
	}
	return lo
}

The same problem in another language

More patterns problems in Go