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

10

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

18349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957

и найти наименьший период, который в этом случае:

1834957034571097518349570345710975183495703457109751834957034571097518349570345710976

Удачи и приятного времяпровождения!


Пояснения :

  • Номер ввода имеет как минимум один период и один неполный период
  • Период всегда начинается с начала введенного номера
  • В данном случае точка означает последовательность чисел, которая повторяется.
Майкл Болли
источник
каков максимальный размер вводимого числа? если вы имели в виду 1000 - это максимальный размер, >значит , вы стоите не в том направлении.
Уровень Река Сент
@steveverrill: Нет, максимальный размер входного номера не существует, но давайте ограничим его 2 ^ 16 цифрами (потому что вы спросили).
Майкл Болли
3
Что такое период?
FUZxxl
@FUZxxl в данном случае: последовательность чисел, которая повторяется.
Майкл Болли
3
То, что вы просите, понятно, но вы не должны называть это периодом: в математике период относится только к цифрам после десятичной точки, повторяемой бесконечно много раз . Напротив, ваш тестовый ввод является целым числом и имеет конечное число цифр.
ПОЙТИ 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
Это работает, только если период начинается в начале строки. Это случается здесь, но я не вижу этого в спецификациях. Правильно?
Тим Пицкер
1
@TimPietzcker См. Комментарий / редактирование ОП по вопросу: период всегда начинается с начала строки.
Мартин Эндер
Похоже, что Regex Storm .Net также поддерживает .NET и не требует Silverlight (недоступно на большинстве платформ).
Деннис
@ Деннис Спасибо, я этого не знал!
Мартин Эндер
1
@tolos Это потому, что вы не гарантируете, что можете достичь конца строки следующим образом. Следовательно, он просто использует первое, что повторяется вообще. Например aabaabaab, вероятно, будет соответствовать, aпотому что это повторяется. Я еще не нашел способ решить это в PCRE. Деннис попробовал удалить удаленный ответ, но тот тоже не сработал. Кстати, вам не нужно g.
Мартин Эндер
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'
gnibbler
источник
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

При этом используется фильтр по целочисленной функции.

isaacg
источник
0

Japt , 8 байт

å+ æ@¶îX

Попробуй это

-2 байта благодаря Шегги!

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)
 })
Dana
источник
1
8 байт:å+ æ@¶îX
Мохнатый
Отлично :) Я видел, как раньше бросал оператор в функцию Reduce, но забыл об этом.
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на вар. -3 байта
Адам
@ Adam Java 8 хотя
Бенджамин Уркхарт
Ох, не видел этого.
Адам