LINUX.ORG.RU

Как сделать поиск повторов в строке?

 


0

4

Например есть строка


3473356356356356356

Надо найти что, где и сколько раз повторяется. Что повторяется заранее неизвестно. Заранее известна общая длина строки. Состоит из цифр и могут быть заглавные буквы латинского алфавита. Повторы всегда идут подряд. Последний может быть не до конца, оборваться, например на 35

Как такое реализовать?

★★★★★

В данном топике мы можем наглядно наблюдать попытку решить хрен знает что вместо задачи.
ну или просто кому-то домашку лень самому сделать до такой степени, что даже полностью сформулировать задачу не получается.

Goury ★★★★★
()

И чего тебя останавливает? Обходи строку последовательно символ за символом, при обнаружении повтора запоминай индекс предыдущего символа. Как только повтор закончится, сваливай пару символ+число_повторений в список. На выходе будешь иметь список, по которому можно будет сказать «что, где и сколько раз повторяется».

m0rph ★★★★★
()
Ответ на: комментарий от Goury

В данном топике это должен быть период дроби в скобках. Причём дробь может быть двоичной, восьмеричной, шестнадцатеричной, хзкакойичной

Qwentor ★★★★★
() автор топика
Последнее исправление: Qwentor (всего исправлений: 1)
Ответ на: комментарий от Qwentor

В данном топике это должен быть период дроби в скобках.

Если этот период должен повториться полностью хотя бы один раз, то:

import re

period_re = re.compile(r'((.+).*)\1+\2?$')
def find_period(my_string):
    m = period_re.search(my_string)
    if m is not None:
        return m.group(1)
    else:
        return None

proud_anon ★★★★★
()

Как такое реализовать?

Как у тебя числа в строке разделены? Перебирай всё на совпадения, что после точек, только конец дробной части/начало нового числа знать надо.

peregrine ★★★★★
()
>>> import collections
>>> help(collections.Counter)
Virtuos86 ★★★★★
()

Надо найти что, где и сколько раз повторяется.

from itertools import combinations

s = "3473356356356356356"

l = {}

for i,j in combinations(range(len(s)+1), 2):
    if j-i > len(s)/2:
        continue
    l[s[i:j]] = l.get(s[i:j], []) + [i]


for k,v in filter(lambda i: len(i[1])>1, l.items()):
    for x in v:
        print((' '*x + k).ljust(len(s)), '(%i)' % len(v))

print('-'*len(s))
print(s)

Этот говнокод должен удовлетворить ваш первоначальный запрос. Давайте ваш вариант с рекурсией. На баше.

anonymous
()

Дело в том, что для подобных задач лучше использовать более мощные языки, например Io


l := "3473356356356356356" asList
result := l uniqueCount map(append(list))


cursor := l cursor

loop(
  cursor do(
   result foreach(l, if(l first == value) then (l third append(index)))
   next ifFalse(break)
  )
)

result join("\n")  print

#>>>> list(3, 7, list(0, 3, 4, 7, 10, 13, 16))
#>>>> list(4, 1, list(1))
#>>>> list(7, 1, list(2))
#>>>> list(5, 5, list(5, 8, 11, 14, 17))
#>>>> list(6, 5, list(6, 9, 12, 15, 18))

newquestion
()
Ответ на: комментарий от peregrine

Числа в строке разделены никак, оно одно. Причём разбито по отдельности на целую и дробную части

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от newquestion

Нужно Java или Python

Java я ни в зуб ногой

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

А что с чем тебе тогда надо сравнивать? Вообще все комбинации циферок? Тогда тоже перебором, только перебирать больше придётся.

peregrine ★★★★★
()
Ответ на: комментарий от Qwentor

Так и сделаю, если простого решения не найдется

Так это и есть простое решение. Или ты хотел тупо вызвать уже готовую функцию, которая делает то, что тебе нужно?

m0rph ★★★★★
()
Ответ на: комментарий от anonymous

Не понял, поясни для тупых, плиз
И почему 2 точки? Там вообще точек не будет - дробная часть отдельно

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

сделал все сам

А где результат-то? Публика жаждет откровений! Давай его сюда, если не обманываешь, что сделал.

anonymous
()
Ответ на: комментарий от Qwentor

Завтра вечером

Я буду следить. И только попробуй не выложить!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.