Temukan periode terkecil dari> 1000 digit angka

10

Tugas Anda adalah untuk mengambil nomor ini sebagai input (meskipun harus bekerja dengan nomor lain juga):

18349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957

dan temukan periode terkecil, dalam hal ini:

1834957034571097518349570345710975183495703457109751834957034571097518349570345710976

Semoga berhasil dan selamat bersenang - senang!


Klarifikasi :

  • Jumlah input minimal satu periode dan satu periode parsial
  • Periode selalu dimulai pada awal nomor input
  • Periode berarti dalam hal ini urutan angka yang berulang sendiri.
Michael Bolli
sumber
Berapa ukuran maksimum dari jumlah input? jika yang Anda maksud 1000 adalah ukuran maksimum, Anda >menghadap ke arah yang salah.
Level River St
@steveverrill: Tidak, tidak ada ukuran maksimum nomor input per se, tetapi mari kita batasi menjadi 2 ^ 16 digit (karena Anda bertanya).
Michael Bolli
3
Apa itu periode?
FUZxxl
@ FuZxxl dalam hal ini: urutan angka yang berulang sendiri.
Michael Bolli
3
Apa yang Anda minta jelas, tetapi Anda benar-benar tidak boleh menyebutnya periode: dalam matematika, periode hanya mengacu pada angka setelah titik desimal berulang berkali-kali . Sebaliknya, input tes Anda adalah bilangan bulat dan memiliki jumlah digit terbatas.
GOTO 0

Jawaban:

4

CJam, 20 16 byte

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

Baca dari STDIN. Cobalah online.

Kode di atas akan membutuhkan memori O (n 2 ) , di mana n adalah panjang input. Ini akan bekerja dengan 2 16 digit, selama Anda memiliki cukup memori.

Ini dapat memperbaiki biaya lima byte tambahan:

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

Contoh dijalankan

$ 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

Bagaimana itu bekerja

Untuk input Q, idenya adalah mengulangi karakter pertama len (Q) kali dan memeriksa apakah indeks Q dalam hasilnya adalah 0. Jika tidak, ulangi dua karakter pertama len (Q) kali, dll.

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

Regex (.NET flavor), 23 22 byte

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

Ini akan cocok dengan periode yang diperlukan sebagai substring.

Uji di sini.

Bagaimana cara kerjanya?

# 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
sumber
1
Ini hanya berfungsi jika periode dimulai pada awal string. Itu terjadi di sini, tapi saya tidak melihat ini dalam spesifikasi. Baik?
Tim Pietzcker
1
@TimPietzcker Lihat komentar OP / edit pada pertanyaan: periode selalu dimulai pada awal string.
Martin Ender
Regex Storm .Net tampaknya menangani .NET juga, dan tidak memerlukan Silverlight (tidak tersedia di sebagian besar platform).
Dennis
@ Dennis Terima kasih, saya tidak tahu yang itu!
Martin Ender
1
@tolos Itu karena Anda tidak memastikan bahwa Anda dapat mencapai akhir string seperti ini. Karena itu ia hanya akan menggunakan hal pertama yang berulang. Misalnya aabaabaabmungkin akan cocok akarena berulang. Saya belum menemukan cara untuk menyelesaikannya di PCRE. Dennis mencoba jawaban yang sekarang sudah dihapus, tetapi jawaban itu juga tidak berfungsi. Btw, kamu tidak perlu g.
Martin Ender
3

Python 60

s adalah deretan angka

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

misalnya:

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

Pyth , 14 karakter

hf}z*lzTm<zdUz

Penjelasan:

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

Pada dasarnya, ini menghasilkan semua urutan awal dari input, mengulangi setiap satu len(z)kali, dan melihat apakah z, input, terletak di dalam string yang dihasilkan.


Ini bukan jawaban yang valid, tetapi fitur baru-baru ini ditambahkan ke Pyth, setelah pertanyaan diajukan, yang memungkinkan solusi 12 karakter:

<zf}z*lz<zT1

Ini menggunakan filter pada fitur integer.

isaacg
sumber
0

Japt , 8 byte

å+ æ@¶îX

Cobalah

-2 byte terima kasih kepada Shaggy!

Dijelaskan JS Dijelaskan:

// 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
sumber
1
8 byte:å+ æ@¶îX
Shaggy
Sangat baik :) Saya pernah melihat melemparkan operator ke fungsi pengurangan sebelumnya, tetapi lupa tentang hal itu.
dana
0

Java 8, 125 byte

Mengambil input sebagai string karena tidak ada cara yang masuk akal untuk mewakili angka 1000+ di Jawa selain string (Tolong Bukan 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;}

Cobalah online!

Benjamin Urquhart
sumber
Anda dapat mengganti Stringdengan var. -3 byte
Adam
@Adam Java 8 though
Benjamin Urquhart
Oh, tidak melihatnya.
Adam