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.


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ę


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:



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.




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.


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.


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


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!



3

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

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

Wypróbuj online!


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ę?)

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,


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


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

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!


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.






1

Dyvil , 26 bajtów

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

Stosowanie:

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

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


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.



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

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.


0

Clojure, 59 bajtów

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

To wydaje się zbyt szczegółowe.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.