Znajdź najmniejszy okres z liczby> 1000 cyfr

10

Twoim zadaniem jest przyjmowanie tej liczby jako danych wejściowych (chociaż powinna również działać z dowolną inną liczbą):

18349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957

i znajdź najmniejszy okres, który jest w tym przypadku:

1834957034571097518349570345710975183495703457109751834957034571097518349570345710976

Powodzenia i miłej zabawy!


Wyjaśnienia :

  • Numer wejściowy ma co najmniej jeden okres i jeden okres częściowy
  • Okres zaczyna się zawsze na początku numeru wejściowego
  • Kropka oznacza w tym przypadku ciąg liczb, który się powtarza.
Michael Bolli
źródło
jaki jest maksymalny rozmiar liczby wejściowej? jeśli miałeś na myśli, że maksymalny rozmiar to 1000, oznacza to, że wybierasz >niewłaściwy sposób.
Level River St
@steveverrill: Nie, nie ma maksymalnego rozmiaru liczby wejściowej jako takiej, ale ograniczmy ją do 2 ^ 16 cyfr (ponieważ pytałeś).
Michael Bolli
3
Co to jest kropka?
FUZxxl,
@FUZxxl w tym przypadku: ciąg liczb, który się powtarza.
Michael Bolli
3
To, o co prosisz, jest jasne, ale tak naprawdę nie powinieneś nazywać go kropką: w matematyce kropka odnosi się tylko do cyfr po przecinku powtarzanym nieskończenie wiele razy . Przeciwnie, twoje wejście testowe jest liczbą całkowitą i ma skończoną liczbę cyfr.
GOTO 0

Odpowiedzi:

4

CJam, 20 16 bajtów

Ll:Q{+_Q,*Q#!}=;

Czyta ze STDIN. Wypróbuj online.

Powyższy kod będzie wymagał pamięci O (n 2 ) , gdzie n jest długością wejścia. To będzie pracować z 2 16 cyfr, tak długo, jak masz wystarczająco dużo pamięci.

Można to ustalić kosztem pięciu dodatkowych bajtów:

Ll:Q{+_Q,1$,/)*Q#!}=;

Przykładowy przebieg

$ cjam <(echo 'Ll:Q{+_Q,*Q#!}=;') <<< 18349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957; echo
1834957034571097518349570345710975183495703457109751834957034571097518349570345710976
$ cjam <(echo 'Ll:Q{+_Q,*Q#!}=;') <<< 12345123451; echo
12345
$ cjam <(echo 'Ll:Q{+_Q,*Q#!}=;') <<< 1234512345; echo
12345
$ cjam <(echo 'Ll:Q{+_Q,*Q#!}=;') <<< 123451; echo
12345

Jak to działa

W przypadku wprowadzania Q chodzi o powtórzenie pierwszych znaków len (Q) razy i sprawdzenie, czy indeks Q w wyniku wynosi 0. Jeśli nie, powtórz pierwsze dwa znaki len (Q) razy itp.

L                   " Push L := [].                                                       ";
 l:Q                " Read one line from STDIN and save the result in Q.                  ";
    {        }=     " Find the first element q ∊ Q that yields a truthy value:            ";
     +              "   Execute L += [q].                                                 ";
      _Q,*Q#        "   Push (L * len(Q)).index(Q).                                       ";
            !       "   Compute the logical NOT of the index.                             ";
               ;    " Discard the last q. This leaves L on the stack.                     ";
Dennis
źródło
8

Regex (smak .NET), 23 22 bajtów

.+?(?=(.*$)(?<=^\1.*))

Spowoduje to dopasowanie wymaganego okresu jako podłańcucha.

Sprawdź to tutaj.

Jak to działa?

# The regex will always find a match, so there's no need to anchor it to
# the beginning of the string - the match will start there anyway.
.+?        # Try matching periods from shortest to longest
(?=        # Lookahead to ensure that what we've matched is actually
           # a period. By using a lookahead, we ensure that this is
           # not part of the match.
  (.*$)    # Match and capture the remainder of the input in group 1.
  (?<=     # Use a lookahead to ensure that this remainder is the same
           # as the beginning of the input. .NET lookaheads are best
           # read from right to left (because that's how they are matched)
           # so you might want to read the next three lines from the 
           # bottom up.
    ^      # Make sure we can reach the beginning of the string.
    \1     # Match group 1.
    .*     # Skip some characters, because the capture won't cover the
           # entire string.
  )
)
Martin Ender
źródło
1
Działa to tylko wtedy, gdy kropka zaczyna się na początku łańcucha. Tak się dzieje tutaj, ale nie widzę tego w specyfikacji. Dobrze?
Tim Pietzcker
1
@TimPietzcker Zobacz komentarz / edycję OP dotyczącą pytania: kropka zawsze zaczyna się na początku łańcucha.
Martin Ender
Regex Storm .Net wydaje się również obsługiwać .NET i nie wymaga Silverlight (niedostępny na większości platform).
Dennis
@Dennis Dzięki, nie wiedziałem tego!
Martin Ender
1
@tolos To dlatego, że nie zapewniasz możliwości dotarcia do końca łańcucha w ten sposób. Dlatego użyje tylko pierwszej rzeczy, która w ogóle się powtarza. Np. aabaabaabPrawdopodobnie pasuje, aponieważ się powtarza. Nie znalazłem jeszcze sposobu na rozwiązanie tego w PCRE. Dennis wypróbował już usuniętą odpowiedź, ale ta też nie działała w pełni. Btw, nie potrzebujesz g.
Martin Ender
3

Python 60

s to ciąg cyfr

[s[:i]for i in range(len(s))if(s[:i]*len(s))[:len(s)]==s][0]

na przykład:

>>> s = '18349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957'
>>> [s[:i]for i in range(len(s))if(s[:i]*len(s))[:len(s)]==s][0]
'1834957034571097518349570345710975183495703457109751834957034571097518349570345710976'
gnibbler
źródło
1

Pyth , 14 znaków

hf}z*lzTm<zdUz

Wyjaśnienie:

implicit:      z = input()
h              head(
 f                  filter(lambda T:
  }z                                z in
    *lz                                  len(z) * 
       T                                          T,
  m                        map(lambda d:
   <zd                                  z[:d],
   Uz                                   range(len(d)))))

Zasadniczo generuje wszystkie początkowe sekwencje danych wejściowych, powtarza się za każdym len(z)razem i sprawdza z, czy dane wejściowe mieszczą się w wynikowym ciągu znaków.


To nie jest prawidłowa odpowiedź, ale ostatnio została dodana funkcja do Pytha, po zadaniu pytania, która umożliwia rozwiązanie 12 znaków:

<zf}z*lz<zT1

Używa to funkcji filtrowania na liczbach całkowitych.

isaacg
źródło
0

Japt , 8 bajtów

å+ æ@¶îX

Spróbuj

-2 bajty dzięki Shaggy!

Wyjaśnienie JS:

// U is the input string representation of the number
U
 // cumulative reduce using the '+' operator
 // the result is an array of strings length 1, 2, ..., N
 // all substrings start with the first character from input
 .å("+")
 // find the first match
 .æ(function(X, Y, Z) {
  // repeat the substring until it is as long as the input
  // and compare it to the input
  return U === U.î(X)
 })
dana
źródło
1
8 bajtów:å+ æ@¶îX
Shaggy
Doskonale :) Widziałem wcześniej, jak wrzuciłem operatora do funkcji redukcji, ale o tym zapomniałem.
dana
0

Java 8, 125 bajtów

Pobiera dane wejściowe jako ciąg znaków, ponieważ nie ma rozsądnego sposobu reprezentowania ponad 1000 cyfr w Javie innych niż ciąg znaków (proszę nie BigInteger).

s->{String o="";for(int i=0;java.util.Arrays.stream(s.split(o+=s.charAt(i++))).filter(b->!b.isEmpty()).count()>1;);return o;}

Wypróbuj online!

Benjamin Urquhart
źródło
Możesz zastąpić Stringvar. -3 bajty
Adam
@Adam Java 8
Benjamin Urquhart
Nie widziałem tego.
Adam