Статья Автор: Лебедев Дмитрий Алексеевич

Про цифры числа Пи

Текстовый файл состоит из 10 млн десятичных цифр дробной части числа \(\pi\)
Найдите длину максимальной подстроки, сумма цифр которой кратна 7 и она не содержит одинаковых цифр подряд.
В ответе укажите количество символов в такой подстроке

Способов решения может быть несколько.
  1. Произвести замены комбинаций "xx" на "x_x" для всех x (0,1,...9)
    Сделать сплит по "_" и далее исследовать отрезки
  2. Применить метод "двух указателей": первый на начале последовательности, второй бежит до запретной комбинации 
    Далее обработка полученного отрезка и "скачок" первого указателя на место второго.
  3. Комбинированный способ, который и будет применен.
Для способа I, обычно используют сортировку по длине отрезков. Вообще это достаточно трудоемко, поэтому можно:
  • найти максимальную длину
  • "оставить только длинные" и отсортировать только их
В чем состоит предлагаемая идея:
  1. Найти в последовательности все индексы i : s[i] == s[i-1] (s - исследуемая строка) - это "по существу точки сплитования"
  2. Создать список границ таких отрезков:  [(i,j) ... ] 
  3. Найди максимум длин  этих отрезков и оставить "верхушку" (например те, у которых длина больше 90% от максимума)
  4. Отсортировать и вывести "нужную" статистику/информацию для "визуального отбора"
ЗЫ. Похоже длина кода будет меньше описания :)


Выполнив код (в котором есть вывод промежуточной информации) получим:
len(s)=10_000_000 len(a)=1_000_192 max(len)= 128 sr(len)=9.998
l=128 sum % 7 =4 29036...46343 [1_749_889;1_750_017]
l=121 sum % 7 =4 26392...63172 [7_270_846;7_270_967]

информацию о двух строках.
Остаток в первой строке равен 4, значит надо убрать "с краев" цифры, сумма которых % 7 == 4.
"Минимально" это можно сделать, убрав слева пару цифр (29, т.к. (2+9)%7 = 4)
Ответ на задани: 126 цифр.

 

Придумайте свое задание для этой последовательности. Попробуйте решить его аналогичным способом
Attached files
24_pi.txt
Печать