Trova il periodo più piccolo da un numero> 1000 cifre


10

Il tuo compito è prendere questo numero come input (anche se dovrebbe funzionare anche con qualsiasi altro numero):

18349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957

e trova il periodo più piccolo, che è in questo caso:

1834957034571097518349570345710975183495703457109751834957034571097518349570345710976

Buona fortuna e buon divertimento!


Chiarimenti :

  • Il numero di input ha almeno un periodo e un periodo parziale
  • Il periodo inizia sempre all'inizio del numero di input
  • Periodo indica in questo caso una sequenza di numeri che si ripete.

qual è la dimensione massima del numero di input? se intendevi che 1000 è la dimensione massima, stai >affrontando la strada sbagliata.
Level River St,

@steveverrill: No, non esiste una dimensione massima del numero di input in sé, ma limitiamolo a 2 ^ 16 cifre (perché hai chiesto).
Michael Bolli,

3
Che cos'è un periodo?
FUZxxl,

@FUZxxl in questo caso: una sequenza di numeri che si ripete.
Michael Bolli,

3
Quello che stai chiedendo è chiaro, ma in realtà non dovresti chiamarlo punto: in matematica, un punto si riferisce solo alle cifre dopo il punto decimale ripetuto all'infinito molte volte . Al contrario, l'input del test è un numero intero e ha un numero finito di cifre.
GOTO 0

Risposte:


4

CJam, 20 16 byte

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

Legge da STDIN. Provalo online.

Il codice sopra richiede memoria O (n 2 ) , dove n è la lunghezza dell'ingresso. Esso sarà lavorare con 2 16 cifre, fino a quando si dispone di memoria sufficiente.

Questo può essere risolto il costo di cinque byte extra:

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

Esempio di esecuzione

$ 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

Come funziona

Per l'input Q, l'idea è di ripetere il primo carattere len (Q) volte e verificare se l'indice di Q nel risultato è 0. In caso contrario, ripetere i primi due caratteri len (Q) volte, ecc.

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.                     ";

8

Regex (sapore .NET), 23 22 byte

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

Ciò corrisponderà al periodo richiesto come sottostringa.

Provalo qui.

Come funziona?

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

1
Questo funziona solo se il periodo inizia all'inizio della stringa, comunque. Questo è il caso qui, ma non lo vedo nelle specifiche. Giusto?
Tim Pietzcker,

1
@TimPietzcker Vedi il commento / modifica dell'OP sulla domanda: il periodo inizia sempre all'inizio della stringa.
Martin Ender,

Regex Storm .Net sembra gestire anche .NET e non richiede Silverlight (non disponibile sulla maggior parte delle piattaforme).
Dennis,

@Dennis Grazie, non lo sapevo!
Martin Ender,

1
@tolos Questo perché non ti assicuri di poter raggiungere la fine della stringa in questo modo. Quindi utilizzerà solo la prima cosa che si ripete. Ad esempio aabaabaabprobabilmente corrisponderà aperché si ripete. Non ho ancora trovato un modo per risolverlo in PCRE. Dennis provò in una risposta ora cancellata, ma neanche quella funzionava completamente. A proposito, non è necessario g.
Martin Ender,

3

Python 60

s è la stringa di cifre

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

per esempio:

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

1

Pyth , 14 caratteri

hf}z*lzTm<zdUz

Spiegazione:

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

In sostanza, genera tutte le sequenze iniziali dell'input, si ripete ciascuna una len(z)volta e vede se zl'input si trova all'interno della stringa risultante.


Questa non è una risposta valida, ma recentemente è stata aggiunta una funzionalità a Pyth, dopo che è stata posta la domanda, che consente una soluzione a 12 caratteri:

<zf}z*lz<zT1

Questo utilizza la funzione filtro su numero intero.


0

Japt , 8 byte

å+ æ@¶îX

Provalo

-2 byte grazie a Shaggy!

Spiegato JS spiegato:

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

1
8 byte:å+ æ@¶îX
Shaggy

Eccellente :) Ho già visto lanciare un operatore nella funzione di riduzione, ma me ne sono dimenticato.
dana,

0

Java 8, 125 byte

Prende l'input come stringa poiché non esiste un modo ragionevole per rappresentare un numero di oltre 1000 cifre in Java diverso da una stringa (No BigInteger, per favore).

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

Provalo online!


È possibile sostituire Stringcon var. -3 byte
Adam

@Adam Java 8
Benjamin Urquhart il

Oh, non l'ho visto.
Adam
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.