В качестве упражнения для практики Go каждый день, я пытаюсь выполнить одно из ежедневных заданий на r / dailyprogrammer, каждый день.
В настоящее время я выполняю промежуточное задание, # 362 (https://www.reddit.com/r/dailyprogrammer/comments/8n8tog/20180530_challenge_362_intermediate_route/), это простая задача шифрования / дешифрования.
Итак, в моем подходе у меня есть базовая структура для представления входных данных:
type Vector struct {
x, y int
}
type Input struct {
text string
vector Vector
method string
}
и часть структур для входных данных запроса:
inputs := []Input{
{"WE ARE DISCOVERED. FLEE AT ONCE", Vector{9, 3}, "clockwise"},
{"why is this professor so boring omg", Vector{6, 5}, "counter-clockwise"},
{"Solving challenges on r/dailyprogrammer is so much fun!!", Vector{8, 6}, "counter-clockwise"},
{"For lunch let's have peanut-butter and bologna sandwiches", Vector{4, 12}, "clockwise"},
{"I've even witnessed a grown man satisfy a camel", Vector{9, 5}, "clockwise"},
{"Why does it say paper jam when there is no paper jam?", Vector{3, 14}, "counter-clockwise"},
}
Пока все хорошо.
У меня есть функция для упрощения ввода строки, как указано в задании (т. Е. Функция удаляет все знаки препинания и дополняет строку с помощью 'X к длине требуемой сетки).
После этого я подаю строку в эту функцию, чтобы создать матричную сетку:
func makeGrid(s string, v Vector) [][]byte {
g := make([][]byte, v.y, v.x)
for k, c := range s {
g[k/v.x] = append(g[k/v.x], byte(c))
}
return g
}
Так, например, для первого ввода,запуск программы приведет к созданию сетки, подобной следующей (строки вместо байтов включены ниже для удобства чтения):
[[W E A R E D I S C]
[O V E R E D F L E]
[E A T O N C E X X]]
Однако, когда программа достигает этого ввода:
{"For lunch let's have peanut-butter and bologna sandwiches", Vector{4, 12}, "clockwise"},
Следующий эрror брошено:
panic: runtime error: makeslice: cap out of range
То же самое для этого ввода:
{"Why does it say paper jam when there is no paper jam?", Vector{3, 14}, "counter-clockwise"},
Я могу полностью понять, почему ошибка возникает во время выполнения, а не при компиляции, так как нет способа длякомпилятору нужно знать размер сетки во время компиляции, поэтому паника может возникнуть только во время выполнения.
Чего я не понимаю, так это того, что я инвертирую векторы во входных данных:
{"For lunch let's have peanut-butter and bologna sandwiches", Vector{12, 4}, "clockwise"},
{"Why does it say paper jam when there is no paper jam?", Vector{14, 3}, "counter-clockwise"},
Ошибка больше не возникает.Программа работает нормально.
Это происходит только в тех случаях, когда значение x в векторе меньше значения y.
Отладка и выполнение кода, я не могу понять, почемусетка с большим количеством коротких строк вызовет ошибку, а сетка с несколькими длинными строками - нет.
Кажется, здесь есть несколько других ответов, которые могут быть связаны, но я не могуПосмотрите, как я должен изменить свой метод, чтобы избежать ошибки.
Есть идеи?