Капитан Приём, штурман м-р Доза и 1-й помощник м-р Перебор (Аэроплан 2)
Я не знал, что наши переводчики придумали совершенной свой текст для этого отрывка из Аэроплана-2 (имена команды видны в субтитрах):
Капитан Over (Over — над), штурман Unger (Under — под), помощник Dunn (Dunno — не знаю)
У нас:
На самом деле я тут придумываю Модель исполнения алгоритмов, аналогичную компу. Но мне нужна архитектура с бесконечной памятью для математической модели (теории алгоритмов), в отличие от реальных компов, где предельный размер используемой памяти зависит от разрядности процессора.
В принципе ничего особо сложного (если не считать, что я уже Бог знает какой протокол передачи данных придумываю — улучшая прежние), но мне хочется добиться линейности времени работы от i, j при извлечении подстроки размера j символов из строки s, начиная с позиции i:
str(s, i, j)
И раз канал имеет ограниченную пропускную способность — приходится пускать адрес к нужной ячейке, разбив его на разряды. И количество символов — так же. При движении этих пакетов данных, состоящих из «цифр», от них (пакетов) каждая ячейка отнимает 1. И в нужной ячейке значение из i становится равным 1, затем можно передавать символы и уменьшать j, пока он не станет равным 1.
Но тут есть техническая сложность — когда от разряда 1 отнимаешь 1, то не понятно — делать из 1 ноль, или вообще ничего? Ведь следующая по старшинству цифра после данной цифры (а у меня цифры в пакете данных идут от младшей в числе к самой старшей) может быть, а может и не быть. Если более старшей нет — то это (-1) от самого старшего разряда, который равен 1 и превращение его в 0. А это не правильно — мы же не пишем нули в числе 10 так: 00010.
А если число 1, то отнимать 1 вообще поздно — мы уже достигли нужной ячейки. А если число 1 превратить в 0, то дальше (при движении пакета данных через следующую ячейку) вычитание даст 9 и необходимость уменьшить следующий (старший) разряд на 1, а старшего разряда нет.
Получается, что получив разряд, где цифра 1 или 0, надо не вычитать, а дождаться следующего разряда. Из-за этого не получается обеспечить синхронное движение всех цифр — что обеспечило бы линейность времени работы от i и j.
Но! Ведь никто не мешает мне тупо отнимать единицу, даже если это нельзя делать. Просто в таком случае я дойду до конца (где старшие разряды кончаются) и увижу, что мне надо отнять 1, а отнимать не от чего! Ну и прекрасно — ставлю в сообщении отметку «перебор» и отправляю сообщение дальше. И оно уже идет в конце пакета данных, в бесконечность, и ничего не меняет там.
То есть — каждое сообщение в пакете делает какие-то изменения в ячейке, но конец пакета сообщает «Перебор» и приводит всё в исходное состояние.
Прикольный момент работы с бесконечной памятью — можно отправлять сообщения в бесконечность и считать, что изменения произошли мгновенно — потому что никакой другой сигнал не обгонит предыдущий и все следующие сигналы имеют дело с результатом работы предыдущего сигнала — куда бы они не обратились. Словно все изменения произошли мгновенно.
И тогда всё упрощается и удаётся добиться линейности. Вот на какой математический «финт» — не думать об остановке пакета данных, а лишь менять его «хвост» на «перебор» — навёл меня русский перевод фрагмента Приём-Доза-Перебор фильма Аэроплан-2. :)
Ячейка — это Приём (капитан Приём) сообщения (цифры) пакета данных (числа) и отнимает 1 от числа. Пока отнимание укладывается в рамки передаваемого числа — это ячейки в состоянии Дозы. Но когда сообщение доходит до слишком дальних ячеек — начинается состояние Перебор. И думать, как остановить передачу пакета данных — нужды нет )