Czy jestem liczbą automorficzną?

20

Liczba automorficzna to liczba będąca sufiksem jej kwadratu w podstawie 10. Jest to sekwencja A003226 w OEIS.

Twoje zadanie:

Napisz program lub funkcję, aby ustalić, czy dane wejściowe są liczbą automorficzną.

Wkład:

Liczba całkowita od 0 do 10 ^ 12 (włącznie), która może, ale nie musi być liczbą automorficzną.

Wynik:

Wartość prawda / fałsz wskazująca, czy dane wejściowe są liczbą automorficzną.

Przykłady:

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

Punktacja:

To jest , najniższy wynik w bajtach wygrywa.

Gryphon - Przywróć Monikę
źródło
9
Btw limit 1e12 oznacza, że ​​zgłoszenia będą musiały obsługiwać liczby do 1e24, czyli liczby 80-bitowej. Jeśli obsługa tak dużych liczb jest trudnym wymogiem, wiele z pozostałych odpowiedzi jest nieważnych.
Dennis
Czy radzimy sobie z liczbami, które prowadziłyby do problemów z precyzją w wybranym przez nas języku?
Shaggy
Pod warunkiem, że nie nadużyjesz standardowej luki w tym zakresie, byłoby dobrze.
Gryphon - Przywróć Monikę
W szczególności ta luka
Gryphon - przywraca Monikę
To był długi dzień i jestem bardzo, bardzo zmęczony, ale wasze komentarze czytają mi jako potwierdzające moje rozwiązanie JS. Czy możesz to potwierdzić? (Nie ma problemu z usunięciem, jeśli nie)
Shaggy

Odpowiedzi:

11

Brachylog , 5 bajtów

~√a₁?

Wypróbuj online!

Jak to działa

~√a₁?
~√      the input is the square root of a number
  a₁    whose suffix is
    ?   the input
Leaky Nun
źródło
Nie, mówi, czy x jest przyrostkiem jego kwadratu.
WGroleau
2
√a₁?Dlaczego nie?
totalnie ludzki,
38

Python 2 , 24 bajty

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

Wypróbuj online!

Po raz pierwszy w historii dodawanie Ldo reprodukcji długich Python 2 jest cechą, a nie błędem.

Chodzi o to, aby sprawdzić, czy powiedzmy, 76^2=5776kończy 76się sprawdzeniem, czy 76Ljest podłańcuchem 5776L. Aby Lpojawiać się w liczbach niemałych, mnożymy przez wykładnik 1Llub mamy go 2Ljako wykładnik, ponieważ operacja arytmetyczna z długim z daje długi.

xnor
źródło
9

Python 2 , 31 bajtów

Out-golfed przez xnor ... (dzieje się to za każdym razem)> <Ale hej, to zaskakująco Pythonic dla .

Ludzie nie pamiętają, że Python ma str.endswith()...

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

Wypróbuj online!

całkowicie ludzki
źródło
Nie możesz użyć `n*n`do konwersji liczby na ciąg?
Downgoat
@Downgoat Który przyczepia „L” do dłuższych liczb.
całkowicie ludzki,
@totallyhuman Dobrze, że przegapiłem jego użycie.
isaacg
5

05AB1E , 5 bajtów

n.s¹å

Wypróbuj online!

Erik the Outgolfer
źródło
6
Głosowałbym, gdybym wiedział, jak to działa.
isaacg
Podejrzewam, że njest kwadratowy, .sjest przyrostkiem, ¹jest wkładem i åtestami członkostwa @isaacg
Conor O'Brien
@isaacg Co powiedział Conor ... nie miał czasu na wyjaśnienia.
Erik the Outgolfer,
5

Siatkówka , 44 bajty

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

Wypróbuj online!

Istnieją dokładnie 4 rozwiązania równania 10-adycznego x*x = x.

Leaky Nun
źródło
1
Co? Czy wszystkie te liczby nie prawidłowymi rozwiązaniami?
Leo
@Leo Nie, nie są. Oczywiście 5*5 != 5. Można jednak zauważyć pewien wzorzec w liczbach, z którymi się łączysz. 4 rozwiązania to: 0, 1, ... 59918212890625, ... 400817871093766 (liczby p-adyczne idą nieskończenie w lewo ). Liczby, które łączysz, są przyrostkami 4 liczb.
Leaky Nun
No dobrze, dziękuję, nie wiedziałem o liczbach p-adycznych
Leo
4

Alice , 17 bajtów

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

Wypróbuj online!

Nie wyprowadza nic (co jest fałszem w trybie porządkowym) lub Jabberwocky(które jest niepuste, a zatem prawdziwe w trybie porządkowym; jest to również kanoniczna wartość ciągu prawdziwych ciągów).

Wyjaśnienie

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

Jest to niewielka modyfikacja ogólnej struktury programów liniowych w trybie Ordinal. Środek /służy do tego, aby jeden operator w trybie kardynalnym znajdował się pomiędzy (a *), a następnie musimy #pominąć go w trybie porządkowym w drodze powrotnej. Program liniowy to:

i..*.QLzno@

Przejdźmy przez to:

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.
Martin Ender
źródło
4

Mathematica, 31 bajtów

Mod[#^2,10^IntegerLength@#]==#&

Wypróbuj online! Matematyka drukuje dodatkową wiadomość, ale odpowiedź jest prawidłowa

J42161217
źródło
4

Python 2, 37 33 30 29 bajtów

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

Zaoszczędź 4 bajty dzięki @LeakyNun. Zapisano 3 bajty, zauważając, że wartość wejściowa jest mniejsza niż 10 ^ 12, więc nnie kończy się na „L”. Zaoszczędziłem 1 bajt dzięki @Dennis, ponieważ najpierw przeliczyłem się.

Wypróbuj online! (Link TIO dzięki uprzejmości @Dennis).

nore
źródło
3

C (gcc) , 57 bajtów

f(__int128 n){n=n*n%(long)pow(10,printf("%u",n))==n;}

Na podstawie odpowiedzi @ betseg jest to funkcja, która zwraca 1 lub 0 . Powoduje wyrzucanie śmieci do STDOUT, co jest domyślnie dozwolone .

Wynik zawiera +4 bajty dla flagi kompilatora -lm.

Wypróbuj online!

Dennis
źródło
3

C # (.NET Core) , 47 bajtów

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

Wypróbuj online!

kakkarot
źródło
Czy nie można zmienić $"{n}"na n+""? A może mógłbyś dodać link TryItOnline ? Aha, to jest fragment kodu, a nie funkcja / program. Więc powinieneś dodać n=>przed nim.
Kevin Cruijssen
1
@KevinCruijssen Gotowe! Czy można jeszcze bardziej uprościć? TIL możesz przekonwertować int na ciąg za pomocą n+"". Dzięki!
kakkarot
Do bool f(long n)odpowiedzi lambda w języku C #, Javie itp n=>$"{BigInteger.Multiply(n,n)}".EndsWith(n+""). Nie potrzebujesz ani średnika końcowego ani średnika końcowego . Wystarczy. :) I prawie zapomniałem: Witamy w PPCG!
Kevin Cruijssen
@KevinCruijssen Dziękujemy!
kakkarot
Nie ma za co! :) Aha, a oto twój konwerter TIO-link do użycian=> , za pomocą System.Func.
Kevin Cruijssen
3

Węgiel drzewny , 12 11 bajtów

I¬⌕⮌IXIθ²⮌θ

Wypróbuj online!

Zwraca Falsejako falseyi Truejako truthy.

  • 1 bajt zapisany dzięki tylko ASCII! (Jak mogłem przegapić tę Powerfunkcję?)
Charlie
źródło
Spowoduje to powrót 0do 10, 100... 1na 50, 60... 2na 760, 3792...
Neil
@ Nee naprawione teraz, dzięki!
Charlie,
2
Myślałem, że węgiel drzewny jest dobry tylko dla sztuki ASCII. ಠ_ಠ
całkowicie ludzki,
11 bajtów
tylko ASCII,
@totallyhuman Wciąż jest, spójrz na wszystkie normalne gry w golfa z <6 bajtowymi rozwiązaniami
tylko ASCII
2

JavaScript (ES6), 23 bajty

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

Spróbuj

Napisałem ten fragment kodu na moim telefonie, więc edytuj go, jeśli nie działa poprawnie.

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>

Kudłaty
źródło
Nie udaje się to w przypadku 212890625 z powodu problemów z precyzją.
Dennis
Dzięki za zwrócenie na to uwagi, @Dennis; to było szybko podczas przerwy na dym, więc (głupio) sprawdziłem tylko przypadki testowe. Poprosę o wyjaśnienie błędów precyzji i w razie potrzeby usunę je, gdy wrócę do komputera.
Shaggy
2

Galaretka , 6 bajtów

²ṚwṚ⁼1

Wypróbuj online!

Erik the Outgolfer
źródło
Dobra robota obezwładnia mnie.
Leaky Nun
@LeakyNun I nawet związałbym Brachyloga, gdybym mógł użyć ...
Erik the Outgolfer
2

Kotlin, 36 bajtów

fun a(i:Int)="${i*i}".endsWith("$i")
weston
źródło
2

C, 77 + 4 ( -lm) = 81 bajtów

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

Wypróbuj online!

betseg
źródło
2
Można użyć n*ndo pow(n,2)i zaoszczędzić 5 bajtów.
Noodle9
2

R, 28 bajtów

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

Tworzy funkcję:

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

Przyjmuje moduł x^2taki, że zachowujemy ostatnie cyfry, które porównujemy x.

JAD
źródło
1

Retina , 47 33 bajtów

14 bajtów dzięki Martinowi Enderowi.

.+
$*
$
¶$`
\G1
$%_
M%`1
(.+)¶\1$

Wypróbuj online!

Leaky Nun
źródło
Muszę się nauczyć $%...
Neil,
1

PHP , 41 bajtów

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

PHP Sandbox Online

PHP , 42 bajty

bez Regex

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

PHP , 44 bajty

Użyj odległości levenshtein

<?=!levenshtein($argn,bcpow($argn,2),0,1,1);
Jörg Hülsermann
źródło
1

Dyvil , 26 bajtów

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

Stosowanie:

let f: int->boolean = x=>"\(x*x)".endsWith"\(x)"
print(f 20) // false
Clashsoft
źródło
1

Partia, 122 bajty

@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))

Algorytm jest ograniczony tylko typem liczbowym stosowanym dla zmiennych. W przypadku Batch są to 32-bitowe liczby całkowite ze znakiem, więc maksymalna wartość to 2147483647. Działa poprzez testowanie zarówno n, jak i n-1 pod kątem niezbędnych mocy 2 i 5 jako czynników. (Z wyjątkiem sytuacji, gdy n wynosi 0 lub 1, n i n-1 będą miały po jednym współczynniku.)

Neil
źródło
1

> <> , 30 bajtów

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

Wypróbuj online lub obejrzyj na placu zabaw dla ryb !

Zakłada, że ​​liczba wejściowa x jest już na stosie.

Objaśnienie: Ryba przyjmuje iloraz x 2 poprzez zwiększenie mocy o 10 i liczy, ile razy równa się to x . Kiedy moc 10 staje się większa niż x , wypisuje licznik i zatrzymuje się. Liczba będzie wynosić 1, jeśli x jest automatyczny, i 0, jeśli nie jest.

Nie drzewo
źródło
1

Pyth , 10 9 bajtów

-1 bajt dzięki isaacg .

x_`^vz2_z

Zwraca 0, gdy liczba jest automatyczna, wszystko inne, jeśli nie jest.

Przetestuj online!

Objaśnienia

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
Jim
źródło
1
`jest konwertowany na ciąg.
isaacg
0

Perl 6 , 15 bajtów

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

Wypróbuj online!

Zwraca prawdziwy obiekt dopasowania dla automatycznych danych wejściowych i fałszywą wartość zero dla innych liczb.

Sean
źródło
0

Clojure, 59 bajtów

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

To wydaje się zbyt szczegółowe.

NikoNyrh
źródło
Dlaczego nie po prostu pójść z #(.endsWith(str(* % %))(str %))?
Cliffroot
O, prawda, tak łatwo zapomnieć o wbudowanych Javach.
NikoNyrh
0

MATL , 10 bajtów

UUVG36hXXn

Działa to dla liczb do floor(sqrt(2^53)), zgodnie z doubleograniczeniami dokładności.

Dane wyjściowe to liczba dodatnia (co jest zgodne z prawdą), jeśli jest automatyczna, lub pusta (co jest fałszem), jeśli nie.

Wypróbuj online!

Wyjaśnienie

Zabawne, że w tej odpowiedzi wykorzystano dwie przeciążone wersje U: z wprowadzeniem ciągu oblicza liczbę, a przy wprowadzaniu liczby oblicza kwadrat.

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
Luis Mendo
źródło