Начиная со строки ABC
, рассмотрим результат многократного добавления последней половины к себе (используя большую половину, если длина нечетна).
Получаем прогрессию:
ABC
ABCBC
ABCBCCBC
ABCBCCBCCCBC
ABCBCCBCCCBCBCCCBC
etc...
Позвольте S
представить результирующую бесконечную строку (или последовательность), которая получается, как эта процедура повторяется навсегда.
Цель
Цель этой задачи кода - найти индекс первого вхождения прогонов C
в S
.
Сначала это легко: C
сначала происходит в index 2
, CC
at 4
, CCC
at 7
, CCCC
at 26
, но CCCCC
полностью в index 27308
! После этого у меня кончается память.
Победителем будет представление, которое правильно генерирует наиболее запущенные индексы (по порядку, начиная с C
). Вы можете использовать любой алгоритм, но обязательно объясните его, если вы не используете базовую грубую силу. Вход и выход могут быть в любом удобном для понимания формате.
Важное примечание: я официально не знаю, S
содержит ли на самом деле все серии C
. Этот вопрос выводится из этого на Математическом обмене стека , в котором автор также не нашел CCCCCC
. Мне любопытно, если кто-нибудь здесь может. (Этот вопрос, в свою очередь, основан на моем первоначальном вопросе по теме .)
Если вы можете доказать, что не все заезды C
происходят, S
вы автоматически выиграете, так как этот вопрос больше не будет действительным. Если никто не может ни доказать это, ни найти, CCCCCC
то победителем будет тот, кто сможет получить наивысшую нижнюю границу индекса CCCCCC
(или какова будет самая большая нерешенная пробежка, если CCCCCC
найден).
Обновление: Humongous престижность isaacg и разрешения , которые нашли CCCCCC
на астрономической индекс 2.124 * 10 ^ 519. При таких темпах я не могу себе представить поиск CCCCCCC
с помощью любого метода, основанного на грубой силе. Хорошая работа, ребята!
источник
CCCCC
по индексу 27308, но позже кажется, что вы не знаете, где это происходит впервые. Вы имели в видуCCCCCC
?Ответы:
Нашли в 2.124 * 10 ^ 519.
Точный показатель 2124002227156710537549582070283786072301315855169987260450819829164756027922998360364044010386660076550764749849261595395734745608255162468143483136030403857241667604197146133343367628903022619551535534430377929831860918493875279894519909944379122620704864579366098015086419629439009415947634870592393974557860358412680068086381231577773140182376767811142988329838752964017382641454691037714240414750501535213021638601291385412206075763857490254382670426605045419312312880204888045665938646319068208885093114686859061215
Найден res, используя код (старая версия) ниже, после 3,5 часов поиска.
Вокруг этого индекса строка выглядит так:
...BCCBCBCCCBCCCCCCBCCB...
Чтобы проверить, измените указанную строку в коде ниже, чтобы начать с 2946 вместо 5. Проверка занимает 20 секунд.
Обновление: улучшена программа. Старая программа искала в ~ 10 раз больше локаций, чем необходимо.
Новая версия находит
CCCCCC
всего за 33 минуты.Как работает код: в основном я смотрю только на регионы, которые соответствуют концам инкрементальных строк, и вычисляю буквы, рекурсивно возвращаясь к исходной строке. Обратите внимание, что он использует таблицу заметок, которая может заполнить вашу память. При необходимости наденьте колпачок на длину таблицы заметок.
Текущий максимальный поиск: 4000 итераций
CCCCCC
найдено при итерации (ях): 2946источник
sys.setrecursionlimit(4000)
иULIMIT=4000
нашла (примерно через 3,5 часа в моей системе) первое вхождение индекса со значением индекса = 2,124 * 10 ^ 519. Точный индекс в следующем комментарии ...Нашли в 2.124 * 10 ^ 519.
Следующий код рубина был использован для поиска
CCCCCC
.Индекс такой же, как в ответе @isaacg .
Время выполнения вышеуказанного кода для 6 порядка десяти секунд на моем компьютере. Тем не менее, он все еще ищет ответ
CCCCCCC
(если вы хотите попробовать его самостоятельно, установите константуSEARCH
в7
).Вы можете использовать,
getc
чтобы найти символ в определенной позиции,i
как это делается в последней строке, где печатается строка вокруг индекса.источник
(Не ответ, но слишком долго для комментария.)
Ниже приведен перевод на Python программы @ Howard's Ruby (увеличенный в 3 раза благодаря наличию только одного
getc
в цикле поиска). В моей системе это находит первый C ^ 6 через 3 секунды. За 93 часа он не находит C ^ 7 в 231 000 итераций, поэтому первый C ^ 7 (если он существует) должен появиться после крайних левых 10 ^ 40677 позиций в бесконечной строке.источник