|
|
|
@ -63,8 +63,13 @@ func q1Total(a, b int) int {
|
|
|
|
|
return a + b
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
q1Entries = 100
|
|
|
|
|
q1Range = 20
|
|
|
|
|
directions = "NSWE"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|
const directions = "NSWE"
|
|
|
|
|
var q *Question
|
|
|
|
|
q = &Question{
|
|
|
|
|
ID: "directions",
|
|
|
|
@ -77,7 +82,7 @@ func init() {
|
|
|
|
|
|
|
|
|
|
known := make(map[int]map[int]bool)
|
|
|
|
|
var x, y int
|
|
|
|
|
for i := 0; i < 100; i++ {
|
|
|
|
|
for i := 0; i < q1Entries; i++ {
|
|
|
|
|
dir := directions[r.Intn(4)]
|
|
|
|
|
steps := r.Intn(30) + 1
|
|
|
|
|
newX, newY := move(x, y, dir, steps)
|
|
|
|
@ -96,48 +101,43 @@ func init() {
|
|
|
|
|
res = append(res, fmt.Sprintf("%c%d", dir, steps))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
n := rand.Intn(20) + 10
|
|
|
|
|
n := rand.Intn(q1Range) + 10
|
|
|
|
|
locX, locY := q1P1(res[:n])
|
|
|
|
|
|
|
|
|
|
dup := rand.Intn(20) + 35
|
|
|
|
|
lastX, lastY := q1P1(res[:dup])
|
|
|
|
|
|
|
|
|
|
fmt.Println(locX, locY)
|
|
|
|
|
fmt.Println(lastX, lastY)
|
|
|
|
|
fmt.Println(dup)
|
|
|
|
|
n = rand.Intn(q1Range) + 35
|
|
|
|
|
lastX, lastY := q1P1(res[:n])
|
|
|
|
|
|
|
|
|
|
dX := math.Max(float64(locX), float64(lastX)) - math.Min(float64(locX), float64(lastX))
|
|
|
|
|
dY := math.Max(float64(locY), float64(lastY)) - math.Min(float64(locY), float64(lastY))
|
|
|
|
|
|
|
|
|
|
if locX > lastX {
|
|
|
|
|
res[dup] = fmt.Sprintf("E%d", int(dX))
|
|
|
|
|
dup++
|
|
|
|
|
res[n] = fmt.Sprintf("E%d", int(dX))
|
|
|
|
|
n++
|
|
|
|
|
} else if locX < lastX {
|
|
|
|
|
res[dup] = fmt.Sprintf("W%d", int(dX))
|
|
|
|
|
dup++
|
|
|
|
|
res[n] = fmt.Sprintf("W%d", int(dX))
|
|
|
|
|
n++
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fmt.Println(res[dup-1])
|
|
|
|
|
fmt.Println("!!")
|
|
|
|
|
|
|
|
|
|
if locY > lastY {
|
|
|
|
|
res[dup] = fmt.Sprintf("N%d", int(math.Max(float64(locY), float64(lastY))-math.Min(float64(locY), float64(lastY))))
|
|
|
|
|
res[n] = fmt.Sprintf("N%d", int(dY))
|
|
|
|
|
} else if locY < lastY {
|
|
|
|
|
res[dup] = fmt.Sprintf("S%d", int(math.Max(float64(locY), float64(lastY))-math.Min(float64(locY), float64(lastY))))
|
|
|
|
|
res[n] = fmt.Sprintf("S%d", int(dY))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return strings.Join(res, "\n")
|
|
|
|
|
},
|
|
|
|
|
Validate: func(u *models.User, level Part, input string) bool {
|
|
|
|
|
inp := q.Generate(u)
|
|
|
|
|
|
|
|
|
|
lastX, lastY := q1P1(strings.Split(inp, "\n"))
|
|
|
|
|
if level == Part1 {
|
|
|
|
|
total := q1Total(lastX, lastY)
|
|
|
|
|
return strconv.Itoa(total) == input
|
|
|
|
|
}
|
|
|
|
|
lastX, lastY = q1P2(strings.Split(inp, "\n"))
|
|
|
|
|
if level == Part2 {
|
|
|
|
|
total := q1Total(lastX, lastY)
|
|
|
|
|
return strconv.Itoa(total) == input
|
|
|
|
|
Validate: func(u *models.User, level Part, input string) bool {
|
|
|
|
|
raw := q.Generate(u)
|
|
|
|
|
inp := strings.Split(raw, "\n")
|
|
|
|
|
|
|
|
|
|
switch level {
|
|
|
|
|
case Part1:
|
|
|
|
|
x, y := q1P1(inp)
|
|
|
|
|
return q1Total(x, y) == 0
|
|
|
|
|
case Part2:
|
|
|
|
|
x, y := q1P2(inp)
|
|
|
|
|
return q1Total(x, y) == 0
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
},
|
|
|
|
|