Tìm khoảng thời gian nhỏ nhất từ ​​số> 1000 chữ số


10

Công việc của bạn là lấy số này làm đầu vào (mặc dù nó cũng hoạt động với bất kỳ số nào khác):

18349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957

và tìm khoảng thời gian nhỏ nhất, trong trường hợp này:

1834957034571097518349570345710975183495703457109751834957034571097518349570345710976

Chúc may mắn và vui vẻ!


Làm rõ :

  • Số đầu vào có tối thiểu một khoảng thời gian và một phần thời gian
  • Khoảng thời gian luôn bắt đầu ở đầu số đầu vào
  • Thời gian có nghĩa là trong trường hợp này một chuỗi các số lặp lại chính nó.

kích thước tối đa của số đầu vào là gì? nếu bạn có nghĩa là 1000 là kích thước tối đa, bạn >đang đối mặt với sai cách.
Cấp sông St

@steveverrill: Không, không có kích thước tối đa của số đầu vào mỗi se, nhưng hãy giới hạn ở mức 2 ^ 16 chữ số (vì bạn đã hỏi).
Michael Bolli

3
Một khoảng thời gian là gì?
FUZxxl

@FUZxxl trong trường hợp này: một chuỗi các số tự lặp lại.
Michael Bolli

3
Những gì bạn yêu cầu là rõ ràng, nhưng bạn thực sự không nên gọi đó là một khoảng thời gian: trong toán học, một khoảng thời gian chỉ đề cập đến các chữ số sau khi dấu thập phân lặp lại vô hạn nhiều lần . Ngược lại, đầu vào kiểm tra của bạn là một số nguyên và có số chữ số hữu hạn.
GOTO 0

Câu trả lời:


4

CJam, 20 16 byte

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

Đọc từ STDIN. Hãy thử trực tuyến.

Đoạn mã trên sẽ yêu cầu bộ nhớ O (n 2 ) , trong đó n là độ dài của đầu vào. Nó sẽ hoạt động với 2 16 chữ số, miễn là bạn có đủ bộ nhớ.

Điều này có thể được cố định chi phí của năm byte thêm:

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

Chạy ví dụ

$ 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

Làm thế nào nó hoạt động

Đối với đầu vào Q, ý tưởng là lặp lại lần đầu tiên của ký tự len (Q) và kiểm tra xem chỉ số của Q trong kết quả là 0. Nếu không, hãy lặp lại hai lần ký tự đầu tiên (Q) lần, v.v.

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 (hương vị .NET), 23 22 byte

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

Điều này sẽ phù hợp với khoảng thời gian cần thiết như một chuỗi con.

Kiểm tra nó ở đây.

Làm thế nào nó hoạt động?

# 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
Điều này chỉ hoạt động nếu khoảng thời gian bắt đầu ở đầu chuỗi. Đó là trường hợp ở đây, nhưng tôi không thấy điều này trong thông số kỹ thuật. Đúng?
Tim Pietzcker

1
@TimPietzcker Xem bình luận / chỉnh sửa của OP về câu hỏi: khoảng thời gian luôn bắt đầu ở đầu chuỗi.
Martin Ender

Regex Storm .Net dường như cũng xử lý .NET và nó không yêu cầu Silverlight (không khả dụng trên hầu hết các nền tảng).
Dennis

@Dennis Cảm ơn, tôi không biết điều đó!
Martin Ender

1
@tolos Đó là vì bạn không đảm bảo rằng bạn có thể đi đến cuối chuỗi như thế này. Do đó, nó sẽ chỉ sử dụng điều đầu tiên lặp đi lặp lại. Eg aabaabaabcó thể sẽ phù hợp abởi vì nó lặp lại. Tôi chưa tìm được cách giải quyết trong PCRE. Dennis đã cố gắng trong một câu trả lời đã bị xóa, nhưng câu trả lời đó cũng không hoàn toàn hoạt động. Btw, bạn không cần g.
Martin Ender

3

Con trăn 60

s là chuỗi các chữ số

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

ví dụ:

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

1

Pyth , 14 ký tự

hf}z*lzTm<zdUz

Giải trình:

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

Về cơ bản, nó tạo ra tất cả các chuỗi ban đầu của đầu vào, lặp lại từng len(z)lần một và xem liệu zđầu vào đó có nằm trong chuỗi kết quả hay không.


Đây không phải là một câu trả lời hợp lệ, nhưng một tính năng gần đây đã được thêm vào Pyth, sau khi câu hỏi được hỏi, cho phép giải pháp 12 ký tự:

<zf}z*lz<zT1

Điều này sử dụng bộ lọc trên tính năng số nguyên.


0

Japt , 8 byte

å+ æ@¶îX

Thử nó

-2 byte nhờ Shaggy!

Transpiled JS đã giải thích:

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

Tuyệt vời :) Tôi đã thấy ném một toán tử vào chức năng giảm trước đó, nhưng quên nó.
dana

0

Java 8, 125 byte

Lấy đầu vào dưới dạng một chuỗi vì không có cách nào hợp lý để biểu thị số 1000 chữ số trong Java ngoài chuỗi (Vui lòng không có 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;}

Hãy thử trực tuyến!


Bạn có thể thay thế Stringbằng var. -3 byte
Adam

@Adam Java 8 mặc dù
Benjamin Urquhart

Ồ, không thấy điều đó.
Adam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.