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

20

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

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

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

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

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

Выход:

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

Примеры:

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

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

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

Грифон - Восстановить Монику
источник
9
Между прочим, ограничение 1e12 означает, что заявки должны обрабатывать числа до 1e24, что является 80-битным числом. Если обработка больших чисел является жестким требованием, многие из существующих ответов являются недействительными.
Деннис
Нужно ли нам обрабатывать числа, которые могут привести к проблемам с точностью на выбранном нами языке?
Лохматый
При условии, что вы не злоупотребляете стандартной лазейкой по этому поводу, тогда это будет хорошо.
Грифон - Восстановить Монику
В частности, это лазейка
Грифон - Восстановить Монику
Это был долгий день, и я очень, очень устал, но ваши комментарии читаются как подтверждение моего решения JS. Не могли бы вы подтвердить это? (Нет проблем удаления, если нет)
Shaggy

Ответы:

11

Брахилог , 5 байт

~√a₁?

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

Как это устроено

~√a₁?
~√      the input is the square root of a number
  a₁    whose suffix is
    ?   the input
Дрянная Монахиня
источник
Нет, он говорит, является ли x суффиксом своего квадрата.
WGroleau
2
√a₁?Почему нет?
полностью человек
38

Python 2 , 24 байта

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

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

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

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

XNOR
источник
9

Python 2 , 31 байт

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

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

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

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

totallyhuman
источник
Не можете ли вы использовать `n*n`для преобразования числа в строку?
Downgoat
@ Downgoat Это привязывает 'L' к более длинным номерам.
полностью человек
@totallyhuman Хороший вопрос, я пропустил его использование.
Исаак
5

05AB1E , 5 байтов

n.s¹å

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

Эрик Outgolfer
источник
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+"")

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

kakkarot
источник
Разве нельзя изменить $"{n}"на n+""? Кроме того, не могли бы вы добавить ссылку TryItOnline ? О, и это фрагмент, а не функция / программа. Таким образом, вы должны добавить n=>перед этим.
Кевин Круйссен
1
@KevinCruijssen Готово! Можно ли упростить еще дальше? TIL вы можете преобразовать int в строку, используя n+"". Благодарность!
Каккарот
Вам не нужна bool f(long n)или конечная точка с запятой для лямбда-ответов в C #, Java и т. Д. Просто n=>$"{BigInteger.Multiply(n,n)}".EndsWith(n+"")достаточно. :) А я чуть не забыл: добро пожаловать в PPCG!
Кевин Круйссен,
@KevinCruijssen Спасибо!
Каккарот
Пожалуйста! :) О, а вот ваш конвертер TIO-link для использования простоn=> , используя System.Func.
Кевин Круйссен
3

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

I¬⌕⮌IXIθ²⮌θ

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

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

  • 1 байт сохранен благодаря ASCII-только! (Как я мог пропустить Powerфункцию?)
Чарли
источник
Это возвращается 0для 10, 100... 1для 50, 60... 2для 760, 3792...
Neil
@ Нил сейчас исправлено, спасибо!
Чарли
2
Я думал, что древесный уголь хорош только для искусства ASCII. ಠ_ಠ
полностью человек
11 байтов
только 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

Желе , 6 байт

²ṚwṚ⁼1

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

Эрик Outgolfer
источник
Хорошая работа превзошла меня.
Дрянная Монахиня
@LeakyNun И я бы даже связал брахилог, если бы мог использовать ...
Эрик Игрок в гольф
2

Котлин, 36 байт

fun a(i:Int)="${i*i}".endsWith("$i")
Уэстон
источник
2

C 77 + 4 ( -lm) = 81 байт

#import<tgmath.h>
i;f(long double n){i=fmod(n*n,pow(10,(int)log10(n)+1))==n;}

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

betseg
источник
2
Можно использовать n*nдля pow(n,2)и сохранить 5 байт.
Noodle9
2

R, 28 байт

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

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

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

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

JAD
источник
1

PHP , 41 байт

<?=preg_match("#$argn$#",bcpow($argn,2));

PHP Sandbox Online

PHP , 42 байта

без регулярных выражений

<?=strtr(bcpow($argn,2),[$argn=>X])[-1]>A;

PHP , 44 байта

Используйте расстояние Левенштейна

<?=!levenshtein($argn,bcpow($argn,2),0,1,1);
Йорг Хюльсерманн
источник
1

Дивиль , 26 байт

x=>"\(x*x)".endsWith"\(x)"

Использование:

let f: int->boolean = x=>"\(x*x)".endsWith"\(x)"
print(f 20) // false
Clashsoft
источник
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

Perl 6 , 15 байт

{$^x²~~/$^x$/}

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

Возвращает истинный объект Match для автоморфных входных данных и ложное значение Nil для других чисел.

Шон
источник
0

Clojure, 59 байт

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

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

NikoNyrh
источник
Почему бы просто не пойти с #(.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
Луис Мендо
источник