Вступление
Метод среднего квадрата используется для генерации псевдослучайных чисел. Однако на практике это не очень хороший метод, поскольку его период обычно очень короткий и имеет некоторые серьезные недостатки. Как это работает? Давайте возьмем пример:
Для семян мы выбираем 123456
:
Seed 123456
Квадрат семени (семя × семя), равен:
Seed² 15241383936
Мы начали с 6-значного числа. Это означает, что в квадрате семян должно быть 12-значное число. Если это не так, добавляются начальные нули для компенсации:
Seed² 015241383936
Затем мы берем среднюю часть числа того же размера, что и начальное число:
Seed² 015241383936
^^^^^^
Это наше новое семя : 241383
. Мы повторяем тот же процесс, как показано выше. Мы получаем следующее:
0: 123456
015241383936
| |
1: 241383
058265752689
| |
2: 265752
070624125504
| |
3: 624125
389532015625
| |
4: 532015
283039960225
| |
5: 039960
001596801600
| |
6: 596801
И это продолжается некоторое время ... Теперь мы знаем, что такое метод среднего квадрата, давайте перейдем к задаче:
Задание
Каждое семя имеет в период . Период n- цифрового семени не может быть длиннее 8 n . Например, семя 82
. Это дало бы следующую последовательность:
82 > 72 > 18 > 32 > 02 > 00 > 00 > 00 > 00 > 00
|____|____|____|____|____|____|____|____|____|___...
0 1 2 3 4 5 6 7 8 9
Вы можете видеть, что период равен 5 , прежде чем снова содержать ту же цифру. Ваша задача, если задано начальное число больше 0, не содержащее начальных нулей, вывести период начального числа . Итак, в этом случае вам необходимо вывести 5
.
Другой пример:, 24
который дает следующее:
24 > 57 > 24
|____|____|___...
0 1 2
Как видите, не все последовательности заканчиваются на 0
. Этот цикл имеет период 1 .
Контрольные примеры
Input > Output
24 > 1
82 > 5
123456 > 146
8989 > 68
789987 > 226
Пастбины с последовательностями по 123456 , 8989 , 789987
Это код-гольф , поэтому выигрывает представление с наименьшим количеством байтов!
Вы можете предположить, что ввод никогда не будет иметь разное количество цифр.
24
является периодическим (с периодом 2, я бы сказал),82
в конечном итоге периодическим (с периодом 1).Ответы:
Желе,
262418 байтПопробуйте онлайн!
Как это устроено
источник
Чистая Баш,
162 131 116 113107Сохранено 3 байта с помощью
$c
...Спасибо @Dennis за помощь, чтобы сохранить еще 6 байтов.
---- begin middleSquare ----
---- end middleSquare ----
Квадрат, 131
---- begin middleSquare ----
---- end middleSquare ----
Старый, но с фантастическим выходом, 162
---- begin middleSquare ----
---- end middleSquare ----
источник
JavaScript (ES7), 82 байта
Принимает ввод в виде строки, например, «82», и возвращает целое число. Простая хвостовая рекурсивная техника для проверки каждого семени по очереди на хеш семян, которые уже были замечены. Я добавляю 100 ** л к квадрату, чтобы обеспечить постоянную длину.
источник
Python
32,13911497 байтСпасибо Seeq за игру в гольф с 25 байтами и благодаря Деннису за игру с 17 байтами! Код:
Определенно можно дальше играть в гольф. Этот код также использовался для создания тестовых случаев: P.
источник
Pyth, 21 байт
Попробуйте онлайн: демонстрация или тестовый набор
редактировать: нашел крайний случай
1000
, который не работал с моим предыдущим кодом. Исправлено это за 1 байт.Объяснение:
источник
sz
вместоQ
?Q
, я должен заменить всеlz
сl`Q
с.input
. Я предполагаю, что это действительно предназначено для второго чтения стандартного ввода ..?.z
и.Q
, хотя они читают несколько строк ввода и сохраняют их в списках. Но я на самом деле не видел, чтобы кто-то использовал эту функцию. Это только 1 байт, чтобы оценить строку или преобразовать число в строку.Qz.Q.z
?MATL , 33
3540байтПопробуйте онлайн!
источник
Oracle SQL 11.2, 184 байта
Un-golfed
Он использует встроенное обнаружение цикла, чтобы остановить рекурсивность.
источник
Юлия, 64 байта
Попробуйте это с Coding Ground .
источник
Mathematica, 80 байт
источник
CJam, 37 байт
Столкнулся с досадной проблемой порядка стеков, которую я не могу сразу увидеть, как решить. Это также невероятно медленно.
Как это работает: Каждая итерация помещает новое значение поверх стека, затем мы упаковываем стек в массив и видим, совпадает ли он с его объединением с самим собой (чтобы увидеть, есть ли у него дублирующиеся элементы). Когда у него есть повторяющиеся элементы, остановитесь и посмотрите, сколько элементов в стеке.
источник
Python 2, 82 байта
Попробуйте это на Ideone .
источник
Python, 124 байта
источник
VBSCRIPT, 131 байт
Лучшее, что я мог сделать с VBScript, первым постером, так что будь осторожен со мной!
источник