ค้นหาช่วงเวลาที่เล็กที่สุดจาก> 1,000 หลัก


10

งานของคุณคือการใช้หมายเลขนี้เป็นอินพุต (แม้ว่าควรจะใช้กับหมายเลขอื่นด้วย):

18349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957

และหาช่วงเวลาที่เล็กที่สุดซึ่งในกรณีนี้:

1834957034571097518349570345710975183495703457109751834957034571097518349570345710976

ขอให้โชคดีและสนุก!


ชี้แจง :

  • จำนวนอินพุตมีอย่างน้อยหนึ่งช่วงเวลาและหนึ่งช่วงเวลาบางส่วน
  • ช่วงเวลาเริ่มต้นที่จุดเริ่มต้นของหมายเลขอินพุตเสมอ
  • Period หมายถึงในกรณีนี้ลำดับของตัวเลขที่ซ้ำกัน

ขนาดสูงสุดของหมายเลขอินพุตคือเท่าใด หากคุณหมายถึง 1,000 คือขนาดสูงสุดคุณ>กำลังหันหน้าไปทางที่ผิด
เลเวลริเวอร์เซนต์

@steveverrill: ไม่ไม่มีขนาดสูงสุดของหมายเลขอินพุตต่อ se แต่ขอ จำกัด ไว้ที่ 2 ^ 16 หลัก (เพราะคุณถาม)
Michael Bolli

3
ระยะเวลาคืออะไร?
FUZxxl

@FZZxxl ในกรณีนี้: ลำดับของตัวเลขที่ซ้ำกัน
Michael Bolli

3
สิ่งที่คุณขอให้มีความชัดเจน แต่จริงๆไม่ควรเรียกว่าระยะเวลา: ในคณิตศาสตร์ระยะเวลาเพียง แต่หมายถึงตัวเลขหลังจุดทศนิยมซ้ำแล้วซ้ำอีกมากมายหลายครั้ง ตรงกันข้ามอินพุตการทดสอบของคุณเป็นจำนวนเต็มและมีจำนวนหลัก จำกัด
GOTO 0

คำตอบ:


4

CJam, 20 16 ไบต์

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

อ่านจาก STDIN ลองออนไลน์

รหัสด้านบนจะต้องใช้หน่วยความจำO (n 2 )โดยที่nคือความยาวของอินพุต มันจะทำงานกับ 2 16หลักตราบใดที่คุณมีหน่วยความจำเพียงพอ

สิ่งนี้สามารถแก้ไขค่าใช้จ่ายของห้าไบต์พิเศษ:

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

Regex (. 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 (ไม่สามารถใช้งานได้ในแพลตฟอร์มส่วนใหญ่)
เดนนิส

@ เดนนิสขอบคุณฉันไม่รู้เหมือนกัน!
Martin Ender

1
@tolos นั่นเป็นเพราะคุณไม่แน่ใจว่าคุณจะไปถึงจุดสิ้นสุดของสตริงแบบนี้ได้ไหม ดังนั้นมันจะใช้สิ่งแรกที่ทำซ้ำเลย เช่นaabaabaabอาจจะตรงกันaเพราะซ้ำ ฉันยังไม่พบวิธีแก้ไขใน PCRE เดนนิสพยายามหาคำตอบที่ถูกลบไปแล้วในตอนนี้ Btw, gคุณไม่จำเป็นต้อง
Martin Ender

3

Python 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อินพุตอยู่ภายในสตริงผลลัพธ์หรือไม่


นี่ไม่ใช่คำตอบที่ถูกต้อง แต่เมื่อไม่นานมานี้มีการเพิ่มฟีเจอร์ใน Pyth หลังจากถามคำถามซึ่งอนุญาตให้ใช้ตัวอักขระ 12 ตัว:

<zf}z*lz<zT1

ใช้ตัวกรองกับคุณสมบัติจำนวนเต็ม


0

Japt , 8 ไบต์

å+ æ@¶îX

ลองมัน

-2 ไบต์ต้องขอบคุณ Shaggy!

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

ยอดเยี่ยม :) ฉันเคยเห็นผู้ประกอบการลงในฟังก์ชั่นการลดมาก่อน แต่ลืมไปเลย
dana

0

Java 8, 125 ไบต์

รับอินพุตเป็นสตริงเนื่องจากไม่มีวิธีที่เหมาะสมในการแสดงตัวเลข 1000+ หลักใน Java นอกเหนือจากสตริง (โปรดไม่มี 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;}

ลองออนไลน์!


คุณสามารถแทนที่Stringด้วย var -3 bytes
Adam

@Adam Java 8 แม้ว่า
Benjamin Urquhart

โอ้ไม่เห็นว่า
Adam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.