← Home
For problem statement at 1000-1999/1800-1899/1830-1839/1838/problemF.txt this is a correct solution, but verifier at 1000-1999/1800-1899/1830-1839/1838/verifierF.go ends with case 1 failed: expected 1 1 ^ got ? 1 1
v>v>v>v>v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
>^>^>^>^>^
? 10 6
v>v>v>v>v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
>^>^>^>^>^
? 5 8
v>v>v>v>v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
>^>^>^>^>^
? 8 9
v>v>v>v>v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
>^>^>^>^>^
? 7 10
v>v>v>v>v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
>^>^>^>^>^
? 4 10
v>v>v>v>v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
>^>^>^>^>^
? 2 10
v>v>v>v>v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
>^>^>^>^>^
? 1 10
v>v>v>v>v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
v^v^v^v^v^
>^>^>^>^>^
? 1 10
^^^^^^^^^^
^^^^^^^^^^
^^^^^^^^^^
^^^^^^^^^^
^^^^^^^^^^
^^^^^^^^^^
^^^^^^^^^^
^^^^^^^^^^
^^^^^^^^^^
^^^^^^^^^^
! 1 10 >
exit status 1 can you fix the verifier? ```go
package main

import (
	"fmt"
)

type Point struct {
	r, c int
}

func main() {
	var n int
	fmt.Scan(&n)

	p1 := make([]Point, 0, n*n)
	dir1 := make([][]byte, n)
	for i := range dir1 {
		dir1[i] = make([]byte, n)
	}
	for c := 1; c <= n; c++ {
		if c%2 == 1 {
			for r := 1; r <= n; r++ {
				p1 = append(p1, Point{r, c})
				if r < n {
					dir1[r-1][c-1] = 'v'
				} else {
					if c < n {
						dir1[r-1][c-1] = '>'
					} else {
						dir1[r-1][c-1] = 'v'
					}
				}
			}
		} else {
			for r := n; r >= 1; r-- {
				p1 = append(p1, Point{r, c})
				if r > 1 {
					dir1[r-1][c-1] = '^'
				} else {
					if c < n {
						dir1[r-1][c-1] = '>'
					} else {
						dir1[r-1][c-1] = '^'
					}
				}
			}
		}
	}

	p2 := make([]Point, 0, n*n)
	dir2 := make([][]byte, n)
	for i := range dir2 {
		dir2[i] = make([]byte, n)
	}
	for c := n; c >= 1; c-- {
		if (n-c)%2 == 0 {
			for r := n; r >= 1; r-- {
				p2 = append(p2, Point{r, c})
				if r > 1 {
					dir2[r-1][c-1] = '^'
				} else {
					if c > 1 {
						dir2[r-1][c-1] = '<'
					} else {
						dir2[r-1][c-1] = '^'
					}
				}
			}
		} else {
			for r := 1; r <= n; r++ {
				p2 = append(p2, Point{r, c})
				if r < n {
					dir2[r-1][c-1] = 'v'
				} else {
					if c > 1 {
						dir2[r-1][c-1] = '<'
					} else {
						dir2[r-1][c-1] = 'v'
					}
				}
			}
		}
	}

	p3 := make([]Point, 0, n*n)
	dir3 := make([][]byte, n)
	for i := range dir3 {
		dir3[i] = make([]byte, n)
	}
	for r := 1; r <= n; r++ {
		if r%2 == 1 {
			for c := 1; c <= n; c++ {
				p3 = append(p3, Point{r, c})
				if c < n {
					dir3[r-1][c-1] = '>'
				} else {
					if r < n {
						dir3[r-1][c-1] = 'v'
					} else {
						dir3[r-1][c-1] = '>'
					}
				}
			}
		} else {
			for c := n; c >= 1; c-- {
				p3 = append(p3, Point{r, c})
				if c > 1 {
					dir3[r-1][c-1] = '<'
				} else {
					if r < n {
						dir3[r-1][c-1] = 'v'
					} else {
						dir3[r-1][c-1] = '<'
					}
				}
			}
		}
	}

	p4 := make([]Point, 0, n*n)
	dir4 := make([][]byte, n)
	for i := range dir4 {
		dir4[i] = make([]byte, n)
	}
	for r := n; r >= 1; r-- {
		if (n-r)%2 == 0 {
			for c := n; c >= 1; c-- {
				p4 = append(p4, Point{r, c})
				if c > 1 {
					dir4[r-1][c-1] = '<'
				} else {
					if r > 1 {
						dir4[r-1][c-1] = '^'
					} else {
						dir4[r-1][c-1] = '<'
					}
				}
			}
		} else {
			for c := 1; c <= n; c++ {
				p4 = append(p4, Point{r, c})
				if c < n {
					dir4[r-1][c-1] = '>'
				} else {
					if r > 1 {
						dir4[r-1][c-1] = '^'
					} else {
						dir4[r-1][c-1] = '>'
					}
				}
			}
		}
	}

	query := func(r, c int, dir [][]byte) (int, int) {
		fmt.Printf("? %d %d\n", r, c)
		for i := 0; i < n; i++ {
			fmt.Println(string(dir[i]))
		}
		var x, y int
		fmt.Scan(&x, &y)
		return x, y
	}

	paths := [][]Point{p1, p2, p3, p4}
	dirs := [][][]byte{dir1, dir2, dir3, dir4}
	expectedExits := make([]Point, 4)

	for i := 0; i < 4; i++ {
		last := paths[i][len(paths[i])-1]
		d := dirs[i][last.r-1][last.c-1]
		er, ec := last.r, last.c
		if d == '^' {
			er--
		} else if d == 'v' {
			er++
		} else if d == '<' {
			ec--
		} else if d == '>' {
			ec++
		}
		expectedExits[i] = Point{er, ec}
	}

	var activePath []Point
	var activeDir [][]byte
	var expExit Point

	for i := 0; i < 4; i++ {
		x, y := query(paths[i][0].r, paths[i][0].c, dirs[i])
		if x != expectedExits[i].r || y != expectedExits[i].c {
			activePath = paths[i]
			activeDir = dirs[i]
			expExit = expectedExits[i]
			break
		}
	}

	low := 1
	high := n*n - 1
	ansIdx := 0

	for low <= high {
		mid := (low + high) / 2
		x, y := query(activePath[mid].r, activePath[mid].c, activeDir)
		if x != expExit.r || y != expExit.c {
			ansIdx = mid
			low = mid + 1
		} else {
			high = mid - 1
		}
	}

	stuck := activePath[ansIdx]

	allUp := make([][]byte, n)
	for i := range allUp {
		allUp[i] = make([]byte, n)
		for j := range allUp[i] {
			allUp[i][j] = '^'
		}
	}

	x, y := query(stuck.r, stuck.c, allUp)

	ansDir := "^"
	if x == -1 && y == -1 {
		ansDir = "v"
	} else if x == n+1 {
		ansDir = "v"
	} else if y == stuck.c {
		ansDir = "^"
	} else if y == stuck.c-1 {
		ansDir = "<"
	} else {
		ansDir = ">"
	}

	fmt.Printf("! %d %d %s\n", stuck.r, stuck.c, ansDir)
}
```