эта проблема кажется очень простой, но я не могу найти для нее решение, на самом деле я даже не знаю, что не так!!!
Итак, в основном у меня есть этот код Lua:
io.write("\nPlease provide the message to be decyphered: ")
message = io.read()
seq = #message
ffib = {}
a = 0
b = 1
c = a + b
fib = 0
while c < (seq - 10) do
fib = fib + 1
ffib[fib] = c
a = b
b = c
c = a + b
end
decyphered = ""
for i = 1,seq do
decyphered = table.concat{decyphered, message:sub(ffib[i],ffib[i])}
end
io.write("\nDecyphered message: ", decyphered, "\n\n")
и попытка доступа ffib[fib]
возвращает nil
. Поэтому попытка message:sub(ffib[i]...
позже выдает ошибку.
Когда я пытаюсь получить доступ к значениям ffib
вручную, например, ffib[1]
, он работает нормально, только при попытке доступа к нему с помощью итератора он облажался.
Где-то еще в моем коде у меня есть это:
io.write("\nPlease provide the message to be cyphered: ")
message = io.read()
cyphered = ""
seq = #message
ffib = {}
a = 0
b = 1
c = a + b
for fib = 1,seq do
ffib[fib] = c
a = b
b = c
c = a + b
end
что в основном то же самое, но вместо использования цикла while используется цикл for, и он работает просто отлично!
Пожалуйста, помогите мне решить это, я схожу с ума.
Учитывая, что позже вы используете числа Фибоначчи для индексации сообщения, почему бы вам не использовать while c < #message
в качестве условия в цикле while? Это будет генерировать числа Фибоначчи до длины сообщения.
эта часть не имеет особого смысла, я думаю
while c < (seq - 10) do
Почему минус 10? ffib
будет иметь меньше записей, чем seq
, в то время как в цикле после этого вы ожидаете значение в ffib
от 1 до seq
И даже если вы измените его на
while c < seq do
Тогда на сообщения больше длины 2 все равно не хватит.
Во всяком случае, вы можете захотеть сделать
while c < (seq + 10) do
Но даже там вы столкнетесь с проблемой, когда сообщение имеет определенную длину.
Я тоже не знаком с этим алгоритмом, но мне он кажется довольно странным, и мне интересно, что он на самом деле устанавливает
Я предполагаю, что алгоритм должен генерировать числа Фибоначчи до длины сообщения, которые затем используются для индексации строки сообщения. Возможно, они также пытались реализовать шифр Цезаря со сдвигом Фибоначчи?
Извините, я забыл упомянуть, что при шифровании сообщения в конце вставляется 10 дополнительных символов, поэтому я вычитаю 10 из «seq». Хотя проблема не в этом. Как я уже сказал, при сохранении значений в массив он работает нормально, просто когда доступ их через итератор возвращает «ноль». По крайней мере, это то, что я понял из отладки, если у кого-то есть более разумное объяснение, пожалуйста, поделитесь!
Хорошо, я понял это!
io.write("\nPlease provide the message to be decyphered: ")
message = io.read()
seq = #message
ffib = {}
a = 0
b = 1
c = a + b
fib = 0
while c < (seq - 10) do
fib = fib + 1
ffib[fib] = c
a = b
b = c
c = a + b
end
decyphered = ""
for i = 1,seq do <--------------
decyphered = table.concat{decyphered, message:sub(ffib[i],ffib[i])}
end
io.write("\nDecyphered message: ", decyphered, "\n\n")
Я использовал неправильную переменную в цикле for, поэтому он перебирал всю длину сообщения вместо длины массива Фибоначчи, значения «nil» были индексами за пределами!
Чтобы исправить это, я просто заменил seq
на #ffib
в этом цикле For Loop, отмеченном стрелкой.
Спасибо всем, кто хоть как-то пытался мне помочь!
Я не знаком с алгоритмом, но сейчас вы генерируете недостаточное количество чисел Фибоначчи. Для строк менее 12 байт вы вообще ничего не генерируете. Поэтому вы не можете повторить свое полное сообщение.