Почему «массив [индекс]» возвращает «ноль»?

эта проблема кажется очень простой, но я не могу найти для нее решение, на самом деле я даже не знаю, что не так!!!

Итак, в основном у меня есть этот код 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, и он работает просто отлично!

Пожалуйста, помогите мне решить это, я схожу с ума.

Я не знаком с алгоритмом, но сейчас вы генерируете недостаточное количество чисел Фибоначчи. Для строк менее 12 байт вы вообще ничего не генерируете. Поэтому вы не можете повторить свое полное сообщение.

Luke100000 06.05.2022 07:39

Учитывая, что позже вы используете числа Фибоначчи для индексации сообщения, почему бы вам не использовать while c < #message в качестве условия в цикле while? Это будет генерировать числа Фибоначчи до длины сообщения.

LMD 06.05.2022 10:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
47
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

эта часть не имеет особого смысла, я думаю

while c < (seq - 10) do

Почему минус 10? ffib будет иметь меньше записей, чем seq, в то время как в цикле после этого вы ожидаете значение в ffib от 1 до seq

И даже если вы измените его на

while c < seq do

Тогда на сообщения больше длины 2 все равно не хватит.

Во всяком случае, вы можете захотеть сделать

while c < (seq + 10) do

Но даже там вы столкнетесь с проблемой, когда сообщение имеет определенную длину.

Я тоже не знаком с этим алгоритмом, но мне он кажется довольно странным, и мне интересно, что он на самом деле устанавливает

Я предполагаю, что алгоритм должен генерировать числа Фибоначчи до длины сообщения, которые затем используются для индексации строки сообщения. Возможно, они также пытались реализовать шифр Цезаря со сдвигом Фибоначчи?

LMD 06.05.2022 10:46

Извините, я забыл упомянуть, что при шифровании сообщения в конце вставляется 10 дополнительных символов, поэтому я вычитаю 10 из «seq». Хотя проблема не в этом. Как я уже сказал, при сохранении значений в массив он работает нормально, просто когда доступ их через итератор возвращает «ноль». По крайней мере, это то, что я понял из отладки, если у кого-то есть более разумное объяснение, пожалуйста, поделитесь!

SSudor 10.05.2022 01:33
Ответ принят как подходящий

Хорошо, я понял это!

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, отмеченном стрелкой.

Спасибо всем, кто хоть как-то пытался мне помочь!

Другие вопросы по теме