> 1000 자리 숫자에서 최소 기간 찾기


10

당신의 임무는이 번호를 입력으로 취하는 것입니다 (다른 번호와도 작동해야하지만).

18349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957

이 경우 가장 작은 기간을 찾으십시오.

1834957034571097518349570345710975183495703457109751834957034571097518349570345710976

행운을 빌고 재미있게 보내!


설명 :

  • 입력 번호에는 최소 1 개의 기간과 1 개의 부분 기간이 있습니다
  • 기간은 항상 입력 번호의 시작 부분에서 시작합니다
  • 주기는이 경우 반복되는 일련의 숫자를 의미합니다.

입력 숫자의 최대 크기는 얼마입니까? 1000이 최대 크기임을 의미하는 경우 >잘못된 방향으로 향하고 있습니다.
Level River St

@ steveverrill : 아니오, 입력 번호 자체의 최대 크기는 없지만 2 ^ 16 자리로 제한하십시오 (요청했기 때문에).
마이클 볼리

3
기간은 무엇입니까?
FUZxxl

이 경우 @FUZxxl : 반복되는 일련의 숫자입니다.
Michael Bolli

3
당신이 요구하는 것은 분명하지만 실제로 그것을 마침표라고 부를 수는 없습니다. 수학에서 마침표 는 소수점이 끝없이 여러 번 반복 된 후의 숫자만을 나타냅니다 . 반대로 테스트 입력은 정수이며 유한 자릿수를 갖습니다.
GOTO 0

답변:


4

CJam, 20 16 바이트

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

STDIN에서 읽습니다. 온라인으로 사용해보십시오.

위의 코드에는 O (n 2 ) 메모리 가 필요 합니다. 여기서 n 은 입력 길이입니다. 그것은 것입니다 이 개 작업을 16 만큼 당신이 충분한 메모리를 가지고, 숫자.

이것은 5 바이트의 비용을 고정시킬 수 있습니다 :

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

예제 실행

$ 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

작동 원리

입력 Q의 경우 첫 번째 문자 len (Q) 시간을 반복하고 결과에서 Q의 인덱스가 0인지 확인하는 것이 좋습니다. 그렇지 않은 경우 첫 문자 len (Q) 시간 등을 반복하십시오 .

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

정규식 (.NET 풍미), 23 22 바이트

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

필요한 기간을 하위 문자열로 일치시킵니다.

여기에서 테스트하십시오.

어떻게 작동합니까?

# 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
그러나 마침표가 문자열의 시작 부분에서 시작하는 경우에만 작동합니다. 그것은 여기의 경우에 발생하지만 사양에서 이것을 보지 못합니다. 권리?
Tim Pietzcker

1
@TimPietzcker 질문에 대한 OP의 의견 / 편집을 참조하십시오. 마침표는 항상 문자열의 시작 부분에서 시작합니다.
Martin Ender

Regex Storm .Net 은 .NET도 처리하는 것으로 보이며 Silverlight가 필요하지 않습니다 (대부분의 플랫폼에서 사용할 수 없음).
Dennis

@ 데니스 감사합니다, 나는 그것을 몰랐다!
Martin Ender

1
@tolos 문자열의 끝에 도달 할 수 있다는 보장이 없기 때문입니다. 따라서 그것은 반복되는 첫 번째 것을 사용합니다. 예를 들어 반복되기 때문에 aabaabaab일치 할 것입니다 a. PCRE에서 아직 해결 방법을 찾지 못했습니다. Dennis는 이제 삭제 된 답변을 시도했지만 그중 하나도 완전히 작동하지 않았습니다. Btw, 당신은 필요하지 않습니다 g.
Martin Ender

3

파이썬 60

s 자릿수입니다

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

예 :

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

1

Pyth , 14 자

hf}z*lzTm<zdUz

설명:

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

기본적으로 입력의 모든 초기 시퀀스를 생성하고 각각 한 len(z)번씩 반복 z하며 입력이 결과 문자열 내에 있는지 여부를 확인 합니다.


이것은 올바른 답변은 아니지만 질문이 제기 된 후 12 문자 솔루션을 허용하는 기능이 최근 Pyth에 추가되었습니다.

<zf}z*lz<zT1

정수 기능에 필터를 사용합니다.


0

Japt , 8 바이트

å+ æ@¶îX

시도 해봐

Shaggy 덕분에 -2 바이트!

번역 된 JS 설명 :

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

우수 :) 전에 감소 기능에 연산자를 던지는 것을 보았지만 잊어 버렸습니다.
dana

0

자바 8, 125 바이트

Java 이외의 문자열 이외의 1000 개 이상의 숫자를 나타내는 합리적인 방법이 없기 때문에 입력을 문자열로 사용합니다 (No BigInteger please).

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

온라인으로 사용해보십시오!


Stringvar로 바꿀 수 있습니다 . -3 바이트
Adam

@Adam Java 8 그래도
Benjamin Urquhart

아, 그것을 보지 못했습니다.
Adam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.