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


20

Автоморфне число - це число, яке є суфіксом його квадрата в основі 10. Це послідовність A003226 в OEIS.

Ваше завдання:

Напишіть програму або функцію, щоб визначити, чи є вхідним числом Автоморфне число.

Вхід:

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

Вихід:

Корекційне / хибне значення, що вказує, чи є вхідним числом Автоморфне чи ні.

Приклади:

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

Оцінка:

Це , найнижчий бал у виграші байтів.


9
Btw межа 1e12 означає, що подання потрібно обробляти числами до 1e24, що є 80-бітним числом. Якщо поводження з великими числами є важкою вимогою, багато відповідей, що виходять, є недійсними.
Денніс

Чи потрібно обробляти цифри, які могли б призвести до питань точності на вибраній мові?
Кудлатий

За умови, що ви не зловживаєте стандартною лазівкою щодо цього, тоді це було б добре.
Грифон - Відновити Моніку


Минув день, і я дуже, дуже втомився, але ваші коментарі читали мені як підтвердження мого рішення JS. Ви могли б це підтвердити? (Видалення не виникає, якщо немає)
Shaggy

Відповіді:



38

Python 2 , 24 байти

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

Спробуйте в Інтернеті!

Вперше в історії додавання Python 2 Lдо перевидання longs - це швидше функція, а не помилка.

Ідея полягає у тому, щоб перевірити, чи скажімо, 76^2=5776закінчується 76, перевіривши, чи 76Lє підрядком 5776L. Для того, щоб Lвідобразитись для величезних чисел, ми множимо на 1Lабо маємо 2Lяк показник, оскільки арифметична операція з довгим з дає тривале.


9

Python 2 , 31 байт

Захищений гольфом xnor ... (це трапляється кожен раз)> <Але ей, це дивно піфонічно для .

Люди не схильні пам’ятати, що Python має str.endswith()...

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

Спробуйте в Інтернеті!


Ви не можете використати `n*n`для перетворення числа в рядок?
Пуховик

@Downgoat Це додає "L" до більших чисел.
повністюлюдський

@totallyhuman Добре, я пропустив його використання.
isaacg


5

Сітківка , 44 байти

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

Спробуйте в Інтернеті!

Існує рівно 4 рішення 10-адичного рівняння x*x = x.


1
А? Чи не всі ці номери є дійсними рішеннями?
Лев

@Leo Ні, вони ні. Очевидно 5*5 != 5. Однак ви можете помітити певний зразок у числах, до яких ви пов’язані. 4 рішення: 0, 1, ... 59918212890625, ... 40081787109376 (p-адичні числа йдуть нескінченно зліва ). Числа, до яких ви пов’язані, є суфіксами 4-х чисел.
Leaky Nun

Ой добре, дякую, я не знав про p-адичні номери
Лев,

4

Аліса , 17 байт

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

Спробуйте в Інтернеті!

Виводить нічого (що є фальшивим в ординарному режимі) або Jabberwocky(що є не порожнім і, отже, простий в ординарному режимі; це також є канонічним значенням truthy string).

Пояснення

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

Це незначна зміна загальної основи для лінійних програм звичайного режиму. У /середині використовується один оператор у режимі Кардинала між ( *) і тоді нам потрібно #пропустити його в звичайному режимі на зворотному шляху. Лінійна програма тоді:

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". Збережено 1 байт завдяки @Dennis, оскільки я в першу чергу помилився.

Спробуйте в Інтернеті! (Посилання TIO люб’язно надано @Dennis).




3

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

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

Спробуйте в Інтернеті!


Чи не можлива зміна $"{n}"в n+""? Також ви можете додати посилання TryItOnline ? О, це фрагмент, а не функція / програма. Тож слід додати n=>перед цим.
Kevin Cruijssen

1
@KevinCruijssen Готово! Чи можна спростити ще більше? TIL ви можете перетворити int в рядок за допомогою n+"". Спасибі!
какарот

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

@KevinCruijssen Дякую!
какарот

Ласкаво просимо! :) О, і ось ваш конвертер TIO-посилань просто використовуватиn=> , використовуючи a System.Func.
Kevin Cruijssen

3

Вугілля деревне , 12 11 байт

I¬⌕⮌IXIθ²⮌θ

Спробуйте в Інтернеті!

Повертається Falseяк falseyі Trueяк truthy.

  • 1 байт збережено завдяки лише ASCII! (Як я міг пропустити Powerфункцію?)

Це повертається 0для 10, 100... 1для 50, 60... 2для 760, 3792...
Neil

@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

Dyvil , 26 байт

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

Використання:

let f: int->boolean = x=>"\(x*x)".endsWith"\(x)"
print(f 20) // false

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 вже є в стеці.

Пояснення: Риба приймає коефіцієнт x 2 , збільшуючи потужність на 10, і підраховує, у скільки разів це дорівнює x . Коли потужність 10 стає більшою за x , вона друкує кількість і зупиняється. Кількість буде 1, якщо x є автоматичною, і 0, якщо це не так.



1

Pyth , 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
`перетворюється в рядок.
isaacg



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.