Описание задачи
Давайте возьмем положительное целое число n
, перевернем его цифры, чтобы получить rev(n)
и получить абсолютное значение разности этих двух чисел: |n - rev(n)|
(или abs(n - rev(n))
).
Пример:
n = 5067
rev(n) = 7605
|n - rev(n)| = |5067 - 7605| = |-2538| = 2538
После повторения этой операции достаточно много раз, большинство чисел станет 0
(таким образом, завершая цикл) ...
5067 -> 2538 -> 5814 -> 1629 -> 7632 -> 5265 -> 360 -> 297 -> 495 -> 99 -> 0
... хотя некоторые числа (например 1584
) застряли в бесконечном цикле:
1584 -> 3267 -> 4356 -> 2178 -> 6534 -> 2178 -> 6534 -> 2178 -> 6534 -> ...
^ infinite loop starts here
Ваша задача - определить, застряло ли данное целое число в бесконечном цикле.
Описание ввода
Целое положительное число.
Описание вывода
Истинное значение ( True
, 1
), если число застряло в бесконечном цикле, ложное значение ( False
, 0
) в противном случае.
Заметки
code-golf
number-theory
shooqie
источник
источник
Ответы:
Pyth, 5 байт
4 байта благодаря FryAmTheEggman
Тестирование.
Истинное значение - это одно из чисел в цикле.
Значение фальси есть
0
.объяснение
источник
Mathematica,
3937 байтПросто применяет обратное / вычитаемое
n
время преобразования к входуn
и затем проверяет, есть ли результат0
. Никогда не может потребоваться больше, чем10n
шаги, чтобы достичь цикла, потому что преобразование не может увеличить количество цифр, и есть10n
числа меньше, чем цифрыn
. См. Доказательство Денниса о том, как уменьшить эту границуn
.источник
Желе ,
65 байтПопробуйте онлайн!
Задний план
Это использует @ MartinEnder это верхняя граница из 10n итераций и следующие наблюдения.
Есть 9 × 10 k - 1 натуральных чисел n с k цифрами.
Разность числа и его обратного всегда кратна 9 , поэтому только 10 k - 1 из них может произойти после первой итерации.
Из кратные, более 1/10 потеряет цифру в следующей итерации (для начала, все , которые начинаются и заканчиваются теми же цифрами, и примерно в два раза больше , если первая цифра не является ни 1 , ни 9 ), так Чтобы войти в цикл или потерять цифру, требуется не более 9 × 10 k - 2 .
Применяя те же рассуждения к конечному целому числу k - 1 цифр и т. Д., Требуется не более 9 × 10 k - 2 + 9 × 10 k - 2 +… ≤ 10 k - 1 ≤ n итераций для входа в цикл или достичь 0 .
Как это работает
источник
Oracle SQL 11.2, 136 байт
Un-golfed
источник
APL, 26 символов
Мы используем левый аргумент в качестве аккумулятора значений, которые мы уже видели. Мы инициализируем его как «0», что является одним из двух условий завершения. Охранник
⍵∊⍺:×⍵
читается: «Является ли правильный аргумент чем-то, что мы уже видели (и это включает ноль)? Если это так, верните знак числа, то есть 1 или 0». В противном случае давайте вернемся, назвав себя абсолютным значением вычитания после сковывания текущего значения в левый аргумент.Пересчет решения Mathematica от Мартина Эндера будет показывать 21 символ :
Он гласит: «Что является признаком результата после применения разыскиваемого 10n раз»?
источник
Python 2, 50 байт
Проверьте это на Ideone .
Задний план
Это использует @ MartinEnder это верхняя граница из 10n итераций и следующие наблюдения.
Есть 9 × 10 k - 1 натуральных чисел n с k цифрами.
Разность числа и его обратного всегда кратна 9 , поэтому только 10 k - 1 из них может произойти после первой итерации.
Из кратные, более 1/10 потеряет цифру в следующей итерации (для начала, все , которые начинаются и заканчиваются теми же цифрами, и примерно в два раза больше , если первая цифра не является ни 1 , ни 9 ), так Чтобы войти в цикл или потерять цифру, требуется не более 9 × 10 k - 2 .
Применяя те же рассуждения к конечному целому числу k - 1 цифр и т. Д., Требуется не более 9 × 10 k - 2 + 9 × 10 k - 2 +… ≤ 10 k - 1 ≤ n итераций для входа в цикл или достичь 0 .
источник
CJam,
1513 байтПроверьте это здесь.
То же, что мой ответ Mathematica.
источник
Python,
12912096 байтЕсли обнаружено исключение (обычно единственное исключение, которое может быть выдано с помощью этой функции, это RuntimeError из-за бесконечной рекурсии), выведите 1. В противном случае выведите результат, 0.
Спасибо @LeakyNun
Благодаря @shooqie
источник
return a and rev(a)
a=[n-x,x-n][n>x]
def rev(n):a=abs(n-int(str(n)[::-1]));return a and rev(a)
. Кроме того, назовите метод как-то коротко (например,r
вместоrev
)Python,
10198 байтАлгоритм черепахи и зайца.
Истина - это любое значение в цикле, фальси
0
.Идео это!
источник
Python 2,
858483 байтаЕще один ответ Python. Он добавляет n в список для каждой итерации и, если n уже есть в списке, выводит
False
. В противном случае, это работает до 0.Спасибо @NonlinearFruit за один байт.
источник
print n<1
работает (такn
как всегда неотрицательный), и это сохраняет байтdef f(n,L=[]):¶ if n<1or n in L:print n<1¶ else:f(abs(n-int(`n`[::-1])),L+[n])
сохраняет 5 байтов05AB1E,
1186 байтРазъяснения
Истинное значение - это число из цикла.
Ложное значение равно 0.
Попробуйте онлайн
Использует верхнюю границу, объясненную в ответе Желе Денниса.
Сохранено 2 байта благодаря @Adnan
В версии 7.9 05AB1E следующие 5-байтовые решения работают, как отмечено @Adnan
источник
DFÂ-Ä
работает в версии 7.9, но не в текущей версии. В текущей версии вам нужно сначала преобразовать его в тип int (как этоDFÂï-Ä
), но вы можете использовать версию 7.9, чтобы сделать ее 5 байтов: p.Java 7, 161 байт
Это требует импорта, но я написал это как функцию. Кричите на меня в комментариях, если полная программа предпочтительнее в этом сценарии. Выводит 1, если есть бесконечный цикл, и 0, если значение достигает 0.
источник
1
ли?Brachylog ,
493223 байтаВозвращает
true
для бесконечных циклов и вfalse
противном случае.Это бесстыдная адаптация алгоритма Мартина Эндера.
Предыдущий ответ, 32 байта
Объяснение предыдущего ответа
источник
PowerShell v2 +, 94 байта
Принимает ввод
$n
, запускает бесконечныйfor
цикл, с$a=,0
в качестве начального условия (используется оператор запятой для установки$a
массива из одного элемента,0
). это$a
наш массив уже увиденных значений.Каждую итерацию цикла мы проверяем
if
. Условие сначала устанавливает следующее значение$n
использования обращения строки и[math]::Abs
вызова .NET и проверяет, является ли это значение уже-in
$a
. Если это так, мы выводим$n
иexit
. В противном случае мы добавляем это значение в массив и продолжаем цикл.Выводит
0
для входных значений, где он не входит в бесконечный цикл (что неверно в PowerShell), и выводит значение, в котором цикл встречался иначе (ненулевые целые числа верны). Например, выходы2178
для ввода1584
.источник
Haskell, 65 байт
Возвращает
0
за Ложь и1
за Правда. Пример использования:([]#) 1584
->1
.Очевидный подход: ведите список со всеми результатами, замеченными до сих пор. Рассчитайте следующий номер до
0
или пока он не появится в списке.источник
JavaScript (ES6), 75 байт
n<0?n=-n:n
аn*=n>0||-1
также работа. Алгоритм чем-то напоминает ответ PowerShell, хотя это рекурсивная формулировка.источник
Рубин, 57 байт
Первоначально пустой массив
h
отслеживает ранее достигнутые значения. Мы повторяем число до тех пор, пока не достигнем предыдущего значения, затем проверяем значение на последней итерации. Поскольку 0 - это цикл из 1, он будет 0 тогда и только тогда, когда нет большего цикла. Я беру дополнительные 2 байта, чтобы преобразовать это в логическое значение, потому что 0 является правдоподобным в Ruby.источник
Perl 6
58 53 3330 байтОбъяснение:
(опирается на предыдущее наблюдение, что вам нужно всего лишь выполнить это преобразование в большинстве
n
случаев)источник
Perl 5,
3129 байтОн повторяется
n=|n-rev(n)|
n раз, поэтому вывод равен 0, если цикла нет,> 0 в противном случае. Денис уже доказал, что этого достаточно.Новая версия использует
eval
иx
оператор повтора вместоfor
цикла.источник
-p
опции,-l
не требуется для одного вводаMatlab,
8984 байтаПростой подход - складывает все числа и проверяет, появилось ли число раньше.
объяснение
источник