Знайдіть найменший період з числа> 1000 цифр


10

Ваше завдання - взяти це число як вхідне (хоча воно має працювати і з будь-яким іншим номером):

18349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957

і знайдіть найменший період, який є в даному випадку:

1834957034571097518349570345710975183495703457109751834957034571097518349570345710976

Хай щастить!


Роз'яснення :

  • Номер введення має мінімум один період та один частковий період
  • Період завжди починається з початку вхідного числа
  • Період означає в цьому випадку послідовність чисел, яка повторюється.

який максимальний розмір вхідного числа? якщо ви мали на увазі, що 1000 - це максимальний розмір, ваше >обличчя стоїть неправильно.
Рівень Рівер Сент

@steveverrill: Ні, максимального розміру вхідного номера немає, але давайте обмежимо його на 2 ^ 16 цифр (тому що ви запитували).
Майкл Боллі

3
Що таке період?
FUZxxl

@FUZxxl в цьому випадку: послідовність чисел, яка повторюється.
Майкл Боллі

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

Регекс (.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
Це працює, лише якщо період починається на початку рядка. Це відбувається так, але я не бачу цього в специфікаціях. Правильно?
Тім Піцкер

1
@TimPietzcker Дивіться коментар / редагування OP щодо питання: період завжди починається на початку рядка.
Мартін Ендер

Regex Storm .Net також працює з .NET, і він не потребує Silverlight (недоступний на більшості платформ).
Денніс

@Dennis Спасибі, я цього не знав!
Мартін Ендер

1
@tolos Це тому, що ви не гарантуєте, що ви можете досягти кінця рядка таким чином. Отже, він просто використовуватиме перше, що взагалі повторюється. Напр. aabaabaab, Мабуть, збігатиметься, aтому що повторюється. Я ще не знайшов способу вирішити це в PCRE. Денніс спробував відповісти на видалену зараз, але і ця не повністю працювала. Btw, вам не потрібно g.
Мартін Ендер

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

Піта , 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 байти завдяки Шаггі!

Транспільований 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

Java 8, 125 байт

Вводиться як рядок, оскільки немає жодного розумного способу представити на Java більше 1000 знаків, окрім рядка (немає 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 байти
Адам,

@Adam Java 8, хоча
Бенджамін

О, не бачив цього.
Адам,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.