Encontre o menor período a partir de um número> 1000 dígitos

10

Seu trabalho é considerar esse número como entrada (embora também deva funcionar com qualquer outro número):

18349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957

e encontre o menor período, neste caso:

1834957034571097518349570345710975183495703457109751834957034571097518349570345710976

Boa sorte e divirta-se!


Esclarecimentos :

  • O número de entrada possui no mínimo um período e um período parcial
  • O período começa sempre no início do número de entrada
  • Período significa, neste caso, uma sequência de números que se repete.
Michael Bolli
fonte
qual é o tamanho máximo do número de entrada? se você quis dizer 1000, é o tamanho máximo, >está voltado para o lado errado.
Level River St
@ steveverrill: Não, não existe tamanho máximo do número de entrada em si, mas vamos limitá-lo a 2 ^ 16 dígitos (porque você pediu).
Michael Bolli 22/09
3
O que é um período?
FUZxxl 22/09/14
@FUZxxl neste caso: uma sequência de números que se repete.
Michael Bolli 22/09
3
O que você está pedindo é claro, mas você realmente não deve chamá-lo de ponto: em matemática, um ponto refere-se apenas a dígitos após o ponto decimal repetido infinitamente várias vezes . Por outro lado, sua entrada de teste é um número inteiro e possui um número finito de dígitos.
GOTO 0

Respostas:

4

CJam, 20 16 bytes

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

Lê de STDIN. Experimente online.

O código acima exigirá memória O (n 2 ) , em que n é o comprimento da entrada. Ele vai trabalhar com 2 16 dígitos, contanto que você tem memória suficiente.

Isso pode ser corrigido pelo custo de cinco bytes extras:

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

Exemplo de execução

$ 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

Como funciona

Para a entrada Q, a ideia é repetir o primeiro caractere len (Q) vezes e verificar se o índice de Q no resultado é 0. Se não estiver, repita os dois primeiros caracteres len (Q) vezes, etc.

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
fonte
8

Regex (sabor .NET), 23 22 bytes

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

Isso corresponderá ao período necessário como uma substring.

Teste aqui.

Como funciona?

# 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
fonte
11
Isso só funciona se o período começar no início da string. É o que acontece aqui, mas não vejo isso nas especificações. Direita?
precisa saber é o seguinte
11
@ TimPietzcker Veja o comentário / edição do OP sobre a pergunta: o período sempre começa no início da string.
Martin Ender
O Regex Storm .Net também parece manipular o .NET e não requer o Silverlight (indisponível na maioria das plataformas).
Dennis
@ Dennis Obrigado, eu não sabia disso!
Martin Ender
11
@tolos Isso é porque você não garante que pode chegar ao final da string assim. Portanto, usará apenas a primeira coisa que se repete. Por exemplo aabaabaab, provavelmente corresponderá aporque se repete. Ainda não encontrei uma maneira de resolvê-lo no PCRE. Dennis tentou uma resposta agora excluída, mas essa também não funcionou totalmente. Btw, você não precisa g.
Martin Ender
3

Python 60

s é a sequência de dígitos

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

por exemplo:

>>> s = '18349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957'
>>> [s[:i]for i in range(len(s))if(s[:i]*len(s))[:len(s)]==s][0]
'1834957034571097518349570345710975183495703457109751834957034571097518349570345710976'
mordedor
fonte
1

Pitão , 14 caracteres

hf}z*lzTm<zdUz

Explicação:

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)))))

Essencialmente, ele gera todas as seqüências iniciais da entrada, repete-se uma len(z)vez e vê se za entrada está dentro da sequência resultante.


Esta não é uma resposta válida, mas um recurso foi adicionado recentemente ao Pyth, depois que a pergunta foi feita, que permite uma solução de 12 caracteres:

<zf}z*lz<zT1

Isso usa o filtro no recurso inteiro.

isaacg
fonte
0

Japonês , 8 bytes

å+ æ@¶îX

Tente

-2 bytes graças a Shaggy!

JS Transpilado Explicado:

// 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
fonte
11
8 bytes:å+ æ@¶îX
Shaggy
Excelente :) Eu já vi jogar um operador na função de redução antes, mas esqueci.
dana
0

Java 8, 125 bytes

Recebe entrada como uma sequência, pois não há uma maneira razoável de representar um número de mais de 1000 dígitos em Java que não seja uma sequência (No BigInteger, por favor).

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;}

Experimente online!

Benjamin Urquhart
fonte
Você pode substituir Stringpor var. -3 bytes
Adam
Porém, @Adam Java 8
Benjamin Urquhart
Oh, não vi isso.
Adam