Ben Otomorfik Bir Numara mıyım?


20

Bir Otomorfik sayı, taban 10'daki karesinin soneki olan bir sayıdır. Bu, OEIS'deki A003226 dizisidir .

Senin görevin:

Bir girişin Otomorfik sayı olup olmadığını belirlemek için bir program veya işlev yazın.

Giriş:

Otomorfik bir sayı olabilecek veya olmayabilecek 0 ile 10 ^ 12 (dahil) arasında bir tam sayı.

Çıktı:

Girdinin bir Otomorfik sayı olup olmadığını gösteren bir doğruluk / yanlış değer.

Örnekler:

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

puanlama:

Bu , bayt kazanır en düşük puan.


9
Btw, 1e12 sınırı, gönderimlerin 80 bitlik bir sayı olan 1e24'e kadar sayıları işlemesi gerektiği anlamına gelir. Bu kadar büyük sayıların işlenmesi zor bir gereklilikse, çıkan yanıtların çoğu geçersizdir.
Dennis

Seçtiğimiz dilde hassas sorunlara yol açacak sayıları ele almalı mıyız?
Shaggy

Bununla ilgili standart boşluğu kötüye kullanmamanız koşuluyla, bu iyi olur.
Gryphon - Monica'yı


Loooong bir gün oldu ve çok, çok yorgunum ama yorumlarınız JS çözümümü doğrulamak olarak bana okundu. Bunu onaylayabilir misin? (Silinmiyorsa sorun yok)
Shaggy

Yanıtlar:



38

Python 2 , 24 bayt

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

Çevrimiçi deneyin!

Tarihte ilk kez, Python 2'nin Luzun ömürlü repr'e bir ekleme , bir hatadan ziyade bir özelliktir.

Fikir demek, bir alt dizesi olup olmadığını kontrol ederek 76^2=5776biter 76olmadığını kontrol 76Letmektir 5776L. Yapmak için L, olmayan büyük sayılar için biz çarpma tarafından görünmesini 1Lveya sahip 2Luzun uzun üretir ile birlikte bir aritmetik işlem beri üs olarak.


9

Python 2 , 31 bayt

Xnor tarafından dışarı golf ... (bu her seferinde olur)> <Ama hey, şaşırtıcı bir şekilde için Pythonic .

İnsanlar Python'un str.endswith()...

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

Çevrimiçi deneyin!


`n*n`Sayıyı dizeye dönüştürmek için kullanamaz mısınız?
Downgoat

@Downgoat Daha uzun sayılara bir 'L' takar.
totallyhuman

@totallyhuman İyi bir nokta, kullanımını kaçırdım.
isaacg


5

Retina , 44 bayt

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

Çevrimiçi deneyin!

10 adik denklemin tam olarak 4 çözümü vardır x*x = x.


1
Ah? Tüm bu numaralar geçerli çözümler değil mi?
Leo

@Leo Hayır, değiller. Açıkçası 5*5 != 5. Ancak, bağlandığınız numaralarda bazı desenler görebilirsiniz. 4 çözüm şunlardır: 0, 1, ... 59918212890625, ... 40081787109376 (p-adik sayılar sonsuzca sola gider ). Bağlandığınız sayılar 4 sayının son ekleridir.
Leaky Nun

Oh tamam, teşekkür ederim, p-adik sayıları bilmiyordum
Leo

4

Alice , 17 bayt

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

Çevrimiçi deneyin!

(Ordinal modda falsili olan) veya Jabberwocky(boş olmayan ve bu nedenle Ordinal modda gerçek olan; hiçbir şey kanonik doğruluksal dize değeri) çıktı verir.

açıklama

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

Bu, doğrusal Ordinal mod programları için genel çerçevede küçük bir değişikliktir. /Ortada arasında Kardinal modunda tek operatörü için kullanılır ( *) ve daha sonra ihtiyacımız #yolu sırtında Sıra modunda atlamak için. Bu durumda doğrusal program:

i..*.QLzno@

Bunu inceleyelim:

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 bayt

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

@LeakyNun sayesinde 4 bayt kaydedildi. Girişin 10 ^ 12'den düşük olduğunu fark ederek 3 bayt kaydedildi, bu nedenle n"L" ile bitmiyor. @Dennis sayesinde 1 bayt kaydedildi çünkü ilk etapta yanlış saydım.

Çevrimiçi deneyin! (@Dennis'in izniyle TIO bağlantısı).




3

C # (.NET Core) , 47 bayt

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

Çevrimiçi deneyin!


Is not değişikliği mümkündür $"{n}"için n+""? Ayrıca, bir TryItOnline bağlantısı ekleyebilir misiniz ? Oh, ve bu bir snippet, bir işlev / program değil. Bu yüzden n=>önüne eklemelisin .
Kevin Cruijssen

1
@KevinCruijssen Tamamlandı! Daha da basitleştirmek mümkün mü? TIL kullanarak bir int dizeye dönüştürebilirsiniz n+"". Teşekkürler!
kakkarot

bool f(long n)C #, Java, vb. Lambda cevapları için veya sondaki noktalı virgül gerekmez . Sadece n=>$"{BigInteger.Multiply(n,n)}".EndsWith(n+"")yeterlidir. :) Ve neredeyse unutuyordum: PPCG'ye hoş geldiniz!
Kevin Cruijssen

@KevinCruijssen Teşekkür ederiz!
kakkarot

Rica ederim! :) Oh, ve işte TIO-link dönüştürücünüz sadecen=> , kullanarak System.Func.
Kevin Cruijssen

3

Kömür , 12 11 bayt

I¬⌕⮌IXIθ²⮌θ

Çevrimiçi deneyin!

FalseOlarak falseyve Trueolarak döner truthy.

  • Yalnızca ASCII sayesinde 1 bayt kaydedildi! ( Powerİşlevi nasıl özleyebilirim ?)

Bu döner 0için 10, 100... 1için 50, 60... 2için 760, 3792...
Neil

@Neil şimdi düzeltildi, teşekkürler!
Charlie

2
Kömürün sadece ASCII sanatı için iyi olduğunu düşündüm. ಠ_ಠ
totallyhuman


@totallyhuman Yine de, <6 baytlık çözümlerle tüm normal golfçülere bakın
sadece ASCII-sadece

2

JavaScript (ES6), 23 bayt

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

Dene

Bu Snippet'i telefonuma yazdı, bu yüzden düzgün çalışmıyorsa lütfen düzenleyin.

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>


Bu , hassas sorunlar nedeniyle 212890625 için başarısız olur .
Dennis

Bunu işaret ettiğiniz için teşekkürler, @Dennis; (aptalca) sadece test vakaları kontrol bu yüzden bu duman molası sırasında bir hızlı oldu. Hassas hatalarla ilgili açıklama ister ve gerekirse bir bilgisayara geri döndüğümde silinir.
Shaggy


2

Kotlin, 36 bayt

fun a(i:Int)="${i*i}".endsWith("$i")


2

R, 28 bayt

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

Bir işlev oluşturur:

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

x^2Karşılaştırma yaptığımız son rakamları tutacağımız modülü alır x.






1

Dyvil , 26 bayt

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

Kullanımı:

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

1

Toplu, 122 bayt

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

Algoritma yalnızca değişkenler için kullanılan tamsayı türü ile sınırlıdır. Batch durumunda, bu 32-bit işaretli tamsayılardır, bu nedenle maksimum 2147483647'dir. N ve n-1'i 2 ve 5'in gerekli güçleri için faktör olarak test ederek çalışır. (N'nin 0 veya 1 olması dışında, n ve n-1'in her birinde bir faktör olacaktır.)


1

> <> , 30 bayt

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

Çevrimiçi deneyin veya balık oyun alanında izleyin !

X giriş numarasının yığın üzerinde olduğunu varsayar .

Açıklama: balıklar katsayısı alır x 2 Bu eşittir kaç kez artan 10'un kuvvetlerine ve sayıları ile x . 10'un gücü x'ten daha büyük olduğunda sayıyı yazdırır ve durur. Sayım, x otomorfikse 1, değilse 0 olacaktır.



1

Pyth , 10 9 bayt

ISAACG sayesinde -1 bayt .

x_`^vz2_z

Sayı otomatik olarak olduğunda 0, değilse başka bir şey döndürür.

Çevrimiçi test edin!

açıklamalar

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
`dizeye dönüştür.
isaacg


0

Perl 6 , 15 bayt

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

Çevrimiçi deneyin!

Otomorfik girdiler için gerçek bir Eşleşme nesnesi ve diğer sayılar için yanlış bir Nil değeri döndürür.


0

Clojure, 59 bayt

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

Bu aşırı ayrıntılı görünüyor.


Neden sadece gitmiyorsun #(.endsWith(str(* % %))(str %))?
cliffroot

Doğru, Java yerleşiklerini unutmak çok kolay.
NikoNyrh

0

MATL , 10 bayt

UUVG36hXXn

Bu floor(sqrt(2^53)), doublehassasiyet sınırlamalarına göre en fazla sayı için geçerlidir .

Çıktı, otomorfik ise pozitif (doğru olan) veya değilse (boş olan) boş bir sayıdır.

Çevrimiçi deneyin!

açıklama

Bu cevabın aşırı yüklü iki sürümünü kullanması komiktir U: string girişi ile sayı olarak değerlendirir ve sayı girişi ile kareyi hesaplar.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.