1000 basamaklı bir sayıdan en kısa süreyi bulun


10

İşiniz bu numarayı girdi olarak almaktır (ancak başka bir numarayla da çalışmalıdır):

18349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957

ve bu durumda olan en küçük dönemi bulun:

1834957034571097518349570345710975183495703457109751834957034571097518349570345710976

İyi şanslar ve iyi eğlenceler!


Açıklamalar :

  • Girilen numara en az bir periyotta ve bir kısmi periyottadır
  • Süre her zaman giriş numarasının başında başlar
  • Dönem bu durumda kendini tekrar eden bir sayı dizisi anlamına gelir.

giriş numarasının maksimum büyüklüğü nedir? 1000 maksimum boyut anlamına geliyorsa >, yanlış yöne bakıyorsunuz demektir.
Level River St

@steveverrill: Hayır, giriş numarasının kendi başına maksimum boyutu yoktur, ancak bunu 2 ^ 16 basamakla sınırlayalım (çünkü siz istediniz).
Michael Bolli

3
Dönem nedir?
FUZxxl

@FUZxxl bu durumda: kendini tekrarlayan bir sayı dizisi.
Michael Bolli

3
Ne soruyorsun açıktır, ama sen gerçekten bir dönem diyoruz olmamalıdır: matematik, bir dönem sadece basamak atıfta sonra virgül tekrarlanan sonsuz birçok kez . Tersi olarak, test girişiniz bir tamsayıdır ve sınırlı sayıda haneye sahiptir.
GOTO 0

Yanıtlar:


4

CJam, 20 16 bayt

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

STDIN'den okur. Çevrimiçi deneyin.

Yukarıdaki kod O (n 2 ) bellek gerektirir , burada n giriş uzunluğudur. Bu olacak 2 ile çalışmak 16 sürece yeterli belleğe sahip olarak, basamak.

Bu beş ekstra baytın maliyeti düzeltilebilir:

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

Örnek çalışma

$ 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

Nasıl çalışır

Giriş Q için, fikir ilk karakter len (Q) kez tekrarlamak ve sonuçtaki Q indeksinin 0 olup olmadığını kontrol etmektir. Değilse, ilk iki karakter len (Q) kez vb. Tekrarlayın .

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 (.NET lezzeti), 23 22 bayt

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

Bu, bir alt dize olarak gerekli süreyle eşleşecektir.

Burada test edin.

O nasıl çalışır?

# 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
Bu yalnızca nokta dizenin başında başlarsa işe yarar. Burada durum böyle, ama bunu teknik özelliklerde görmüyorum. Sağ?
Tim Pietzcker

1
@TimPietzcker OP'nin soru hakkındaki yorumuna / düzenlemesine bakın: nokta her zaman dizenin başında başlar.
Martin Ender

Regex Storm .Net , .NET'i de işliyor gibi görünüyor ve Silverlight gerektirmiyor (çoğu platformda mevcut değil).
Dennis

@Dennis Teşekkürler, bunu bilmiyordum!
Martin Ender

1
@tolos Çünkü dizenin sonuna bu şekilde ulaşabileceğinizden emin değilsiniz. Bu yüzden sadece tekrar eden ilk şeyi kullanacaktır. Örneğin aabaabaabmuhtemelen eşleşir açünkü tekrar eder. PCRE'de henüz çözmenin bir yolunu bulamadım. Dennis şimdi silinen bir cevapta denedi, ama bu da tam olarak çalışmadı. Btw, ihtiyacın yok g.
Martin Ender

3

Python 60

s rakam dizesidir

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

Örneğin:

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

1

Pyth , 14 karakter

hf}z*lzTm<zdUz

Açıklama:

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

Esasen, girdinin tüm başlangıç ​​dizilerini oluşturur, her birini tekrarlar ve girdinin, sonuçlanan dize içinde len(z)olup olmadığını görür z.


Bu geçerli bir cevap değil, ancak soru sorulduktan sonra 12 karakterlik bir çözüme izin veren Pyth'e yakın zamanda bir özellik eklendi:

<zf}z*lz<zT1

Filtre tamsayı özelliğini kullanır.


0

Japt , 8 bayt

å+ æ@¶îX

Dene

Shaggy sayesinde -2 bayt!

Aktarılan JS Açıklaması:

// 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 bayt:å+ æ@¶îX
Shaggy

Mükemmel :) Daha önce azaltma işlevine bir operatör atmayı gördüm, ama unuttum.
dana

0

Java 8, 125 bayt

Java'da bir dize dışında 1000'den fazla basamaklı bir sayıyı temsil etmenin makul bir yolu olmadığı için girdiyi dize olarak alır (Lütfen BigInteger yok).

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

Çevrimiçi deneyin!


Var ile değiştirebilirsiniz String. -3 bayt
Adam

Adam Java 8 olsa da
Benjamin Urquhart

Oh, görmedim.
Adam
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.