Załóżmy, że mam numer z powtarzającym się wzorcem, tj. Istnieje ciąg cyfr, które powtarzają się w celu utworzenia danego numeru. Na przykład taka liczba może być 1234123412341234
, utworzona przez powtarzanie cyfr 1234
.
Co chciałbym zrobić, to znaleźć wzór, który powtarza się, aby utworzyć numer. Dlatego też, biorąc pod uwagę 1234123412341234
chciałbym obliczyć 1234
(a może 4
, aby wskazać, że 1234
powtarza się 4 razy, aby utworzyć 1234123412341234
)Wyszukiwanie powtarzającego się wzoru
wiem, że mogę to zrobić:
def findPattern(num):
num = str(num)
for i in range(len(num)):
patt = num[:i]
if (len(num)/len(patt))%1:
continue
if pat*(len(num)//len(patt)):
return patt, len(num)//len(patt)
to jednak wydaje się trochę zbyt odurzający. Pomyślałem mogę użyć itertools.cycle
porównać dwa cykle dla równości, które tak naprawdę nie ułoży:
In [25]: c1 = itertools.cycle(list(range(4)))
In [26]: c2 = itertools.cycle(list(range(4)))
In [27]: c1==c2
Out[27]: False
Czy istnieje lepszy sposób na obliczenie tego? (Będę otwarty na regex, ale nie mam pojęcia jak ją stosować tam, dlatego, że nie obejmują go w moich próbach)
EDIT:
- I don nie musisz wiedzieć, że liczba ma powtarzający się wzór, więc muszę zwrócić
None
, jeśli jej nie ma. - Obecnie skupiam się wyłącznie na wykrywaniu liczb/ciągów, które składają się w całości z powtarzającego się wzoru. Jednak później, będę prawdopodobnie być także zainteresowany w znalezieniu wzorów, które rozpoczynają się po kilku znaków:
magic_function (78961234123412341234)
wróci 1234
jako wzór, jak 4
ile razy powtarza się, a 4
jako pierwszy indeks na wejściu gdzie wzór pierwszy prezentuje się
Co na przykład z '771177117711'? To bardzo trudne. –
@AlexThornton: Jest to wzorzec '7711', 3 razy lub wzorzec' 1177', dwa razy (z początkowym i końcowym szumem) – inspectorG4dget
Wyrażenie regularne zawodzi, irytująco. Zobaczę, czy coś wymyślę. –