Я автоморфное число?


20

Автоморфное число - это число, которое является суффиксом его квадрата в базе 10. Это последовательность A003226 в OEIS.

Твое задание:

Напишите программу или функцию, чтобы определить, является ли вход автоморфным числом.

Входные данные:

Целое число от 0 до 10 ^ 12 (включительно), которое может быть или не быть автоморфным числом.

Выход:

Значение истинности / ложности, указывающее, является ли вход автоморфным числом.

Примеры:

0           -> truthy
1           -> truthy
2           -> falsy
9376        -> truthy
8212890625  -> truthy

Подсчет очков:

Это , выигрывает самая низкая оценка в байтах.


9
Между прочим, ограничение 1e12 означает, что заявки должны обрабатывать числа до 1e24, что является 80-битным числом. Если обработка больших чисел является жестким требованием, многие из существующих ответов являются недействительными.
Деннис

Нужно ли нам обрабатывать числа, которые могут привести к проблемам с точностью на выбранном нами языке?
Лохматый

При условии, что вы не злоупотребляете стандартной лазейкой по этому поводу, тогда это будет хорошо.
Грифон - Восстановить Монику


Это был долгий день, и я очень, очень устал, но ваши комментарии читаются как подтверждение моего решения JS. Не могли бы вы подтвердить это? (Нет проблем удаления, если нет)
Shaggy

Ответы:



38

Python 2 , 24 байта

lambda n:`n*1L`in`n**2L`

Попробуйте онлайн!

Впервые в истории добавление Lв репер longs Python 2 является скорее функцией, чем ошибкой.

Идея состоит в том, чтобы проверить, если, скажем, 76^2=5776заканчивается 76, проверяя, 76Lявляется ли подстрока 5776L. Чтобы сделать Lотображение для не больших чисел, мы умножаем на 1Lили имеем 2Lв качестве показателя степени, так как арифметическая операция с длинным с производит длинное.


9

Python 2 , 31 байт

Вне игры в гольф от xnor ... (это происходит каждый раз)> <Но, на удивление, это Pythonic для .

Люди не склонны помнить, что у Python есть str.endswith()...

lambda n:str(n*n).endswith(`n`)

Попробуйте онлайн!


Не можете ли вы использовать `n*n`для преобразования числа в строку?
Downgoat

@ Downgoat Это привязывает 'L' к более длинным номерам.
полностью человек

@totallyhuman Хороший вопрос, я пропустил его использование.
Исаак

5

05AB1E , 5 байтов

n.s¹å

Попробуйте онлайн!


6
Я бы проголосовал, если бы знал, как это работает.
Исаак

Полагаю, nквадрат, .sсуффиксы, ¹входные данные и åтесты на членство @isaacg
Конор О'Брайен,

@isaacg То, что сказал Конор ... не было времени, чтобы добавить объяснения.
Эрик Outgolfer

5

Сетчатка , 44 байта

$
;918212890625;81787109376;0;1;
^(\d+;).*\1

Попробуйте онлайн!

Существует ровно 4 решения 10-адического уравнения x*x = x.


1
Э - э? Разве все эти цифры не являются правильными решениями?
Лев

@ Лео Нет, это не так. Очевидно 5*5 != 5. Тем не менее, вы можете заметить некоторую закономерность в числах, с которыми вы связаны 4 решения: 0, 1, ... 59918212890625, ... 40081787109376 (p-адические числа идут бесконечно влево ). Числа, на которые вы ссылаетесь, являются суффиксами 4 чисел.
Утренняя монахиня

О, хорошо, спасибо, я не знал о p-adic числах
Лев

4

Алиса , 17 байт

/o.z/#Q/
@in.*.L\

Попробуйте онлайн!

Ничего не выводится (что ложно в обычном режиме) или Jabberwocky(непусто и, следовательно, верно в обычном режиме; это также каноническое истинное строковое значение).

объяснение

/.../#./
....*..\

Это небольшая модификация общей структуры для программ линейного режима Ordinal. /В середине используется , чтобы иметь одного оператор в режиме кардинала между ( *) , а затем нам нужно , #чтобы пропустить его в режиме Порядкового на обратном пути. Линейная программа тогда:

i..*.QLzno@

Давайте пройдем через это:

i    Read all input as a string and push it to the stack.
..   Make two copies.
*    This is run in Cardinal mode, so it implicitly converts the top two
     copies to their integer value and multiplies them to compute the square.
.    Implicitly convert the square back to a string and make a copy of it.
Q    Reverse the stack to bring the input on top of the two copies of its square.
L    Shortest common supersequence. This pops the input and the square from
     the top of the stack and pushes the shortest string which begins with
     the square and ends with the input. Iff the square already ends with the
     input, this gives us the square, otherwise it gives us some longer string.
z    Drop. Pop the SCS and the square. If the square contains the SCS (which
     would mean they're equal), this removes everything up to the SCS from
     the square. In other words, if the SCS computation left the square
     unchanged, this gives us an empty string. Otherwise, it gives us back
     the square.
n    Logical not. Turns the empty string into "Jabberwocky" and everything
     else into an empty string.
o    Print the result.
@    Terminate the program.


4

Python 2, 37 33 30 29 байт

lambda n:n*~-n%10**len(`n`)<1

Сохранено 4 байта благодаря @LeakyNun. Сэкономили 3 байта, заметив, что ввод меньше 10 ^ 12, поэтому nне заканчивается буквой "L". Благодаря @Dennis удалось сэкономить 1 байт, потому что я ошибся в первую очередь.

Попробуйте онлайн! (Ссылка TIO любезно предоставлена ​​@Dennis).




3

C # (.NET Core) , 47 байт

n=>$"{BigInteger.Multiply(n,n)}".EndsWith(n+"")

Попробуйте онлайн!


Разве нельзя изменить $"{n}"на n+""? Кроме того, не могли бы вы добавить ссылку TryItOnline ? О, и это фрагмент, а не функция / программа. Таким образом, вы должны добавить n=>перед этим.
Кевин Круйссен

1
@KevinCruijssen Готово! Можно ли упростить еще дальше? TIL вы можете преобразовать int в строку, используя n+"". Благодарность!
Каккарот

Вам не нужна bool f(long n)или конечная точка с запятой для лямбда-ответов в C #, Java и т. Д. Просто n=>$"{BigInteger.Multiply(n,n)}".EndsWith(n+"")достаточно. :) А я чуть не забыл: добро пожаловать в PPCG!
Кевин Круйссен,

@KevinCruijssen Спасибо!
Каккарот


3

Древесный уголь , 12 11 байтов

I¬⌕⮌IXIθ²⮌θ

Попробуйте онлайн!

Возвращает Falseкак falseyи Trueкак truthy.

  • 1 байт сохранен благодаря ASCII-только! (Как я мог пропустить Powerфункцию?)

Это возвращается 0для 10, 100... 1для 50, 60... 2для 760, 3792...
Neil

@ Нил сейчас исправлено, спасибо!
Чарли

2
Я думал, что древесный уголь хорош только для искусства ASCII. ಠ_ಠ
полностью человек


@totallyhuman Это все еще есть, посмотрите на все нормальные поля для гольфа с <6-байтовыми решениями
только ASCII

2

JavaScript (ES6), 23 байта

n=>`${n*n}`.endsWith(n)

Попытайся

Написал этот фрагмент на моем телефоне, поэтому, пожалуйста, измените его, если он работает неправильно.

f=
n=>`${n*n}`.endsWith(n)
oninput=_=>o.innerText=f(+i.value);o.innerText=f(i.value=1)
<input id=i type=number><pre id=o>


Это не удается для 212890625 из-за проблем с точностью.
Деннис

Спасибо за указание на это, @Dennis; это было быстро на перекуре, поэтому я (тупо) только проверял контрольные примеры. Попросит уточнить ошибки точности и удалить, когда я вернусь к компьютеру, если это необходимо.
Лохматый




2

R, 28 байт

pryr::f(x^2%%10^nchar(x)==x)

Создает функцию:

function (x) 
x^2%%10^nchar(x) == x

Принимает такой модуль x^2, что мы сохраняем последние цифры, с которыми сравниваем x.







1

Пакетный, 122 байта

@set/an=%1,t=f=1
:l
@set/at+=t,f*=5,n/=10
@if %n% gtr 0 goto l
@cmd/cset/a"(!(%1%%t)|!(~-%1%%t))&(!(%1%%f)|!(~-%1%%f))

Алгоритм ограничен только целочисленным типом, используемым для переменных. В случае Batch это 32-разрядные целые числа со знаком, поэтому максимум равен 2147483647. Работает, проверяя n и n-1 на наличие необходимых степеней 2 и 5 в качестве факторов. (За исключением случаев, когда n равно 0 или 1, n и n-1 будут иметь один фактор каждый.)


1

> <> , 30 байт

1&0}\{n;
:&(?\:::*&a*:&%={+}:&

Попробуйте онлайн или посмотрите на рыбной площадке !

Подразумевается номер входа х уже находится в стеке.

Пояснение: Рыба берет коэффициент x 2 , увеличивая степень на 10, и считает, сколько раз это равно x . Когда сила 10 становится больше, чем х , он печатает счет и останавливается. Счет будет равен 1, если x автоморфен, и 0, если это не так.



1

Пиф , 10 9 байтов

-1 байт благодаря isaacg .

x_`^vz2_z

Возвращает 0, когда число является автоморфным, что-нибудь еще, если это не так.

Проверьте это онлайн!

Пояснения

x_`^vz2_z

   ^vz2      # Evaluate the input to a number, compute the square
  `          # Convert the squared number to a string
 _           # Reverse it
x      _z    # Find the index of the first occurrence of the reversed input in the reversed square. That's basically equivalent of doing an endswith() in Python
             # Implicit input of the index. If 0, then the reversed square starts with the reversed input

1
`конвертировать в строку.
Исаак



0

Clojure, 59 байт

#(apply = true(map =(reverse(str %))(reverse(str(* % %)))))

Это кажется слишком многословным.


Почему бы просто не пойти с #(.endsWith(str(* % %))(str %))?
Утес

О, правда, о встроенных модулях Java так легко забыть.
NikoNyrh

0

MATL , 10 байт

UUVG36hXXn

Это работает для чисел до floor(sqrt(2^53)), согласно doubleограничениям точности.

Выход - положительное число (которое является правдивым), если оно автоморфное, или пустое (что неверно), если нет.

Попробуйте онлайн!

объяснение

Забавно, что в этом ответе используются две перегруженные версии U: при вводе строки он оценивается как число, а при вводе числа он вычисляет квадрат.

U      % Implicitly input a string. Evaluate as a number
U      % Square of number
V      % Convert number to string representation
G      % Push input string again
36h    % Post-pend '$'
XX     % Regexp match. Gives cell array of matching substrings.
n      % Number of elements. Implicitly display
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.