Tôi có phải là số tự động không?


20

Số tự động là một số là hậu tố của hình vuông trong cơ sở 10. Đây là dãy A003226 trong OEIS.

Nhiệm vụ của bạn:

Viết chương trình hoặc hàm để xác định xem đầu vào có phải là số tự động hay không.

Đầu vào:

Một số nguyên nằm trong khoảng từ 0 đến 10 ^ 12 (đã bao gồm), có thể có hoặc không phải là số tự động.

Đầu ra:

Giá trị trung thực / giả mạo cho biết đầu vào có phải là số tự động hay không.

Ví dụ:

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

Ghi điểm:

Đây là , điểm số thấp nhất tính theo byte.


9
Btw giới hạn 1e12 có nghĩa là các bài nộp sẽ cần xử lý các số lên tới 1e24, là số 80 bit. Nếu xử lý số lớn là một yêu cầu khó, nhiều câu trả lời thoát là không hợp lệ.
Dennis

Cần chúng tôi xử lý các con số sẽ dẫn đến các vấn đề chính xác trong ngôn ngữ đã chọn của chúng tôi?
Shaggy

Với điều kiện bạn không lạm dụng kẽ hở tiêu chuẩn về điều đó, thì điều đó sẽ ổn thôi.
Gryphon - Phục hồi Monica


Đó là một ngày loooong và tôi rất, rất mệt nhưng những bình luận của bạn đọc cho tôi là xác nhận giải pháp JS của tôi. Bạn có thể xác nhận điều đó? (Không có vấn đề xóa nếu không)
Shaggy

Câu trả lời:



38

Python 2 , 24 byte

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

Hãy thử trực tuyến!

Lần đầu tiên trong lịch sử, Python 2 gắn thêm Lphần lặp lại là một tính năng chứ không phải là một lỗi.

Ý tưởng là để kiểm tra nếu nói, 76^2=5776kết thúc 76bằng cách kiểm tra nếu 76Llà một chuỗi con của 5776L. Để Lxuất hiện cho các số không lớn, chúng tôi nhân với 1Lhoặc có 2Lsố mũ, vì một phép toán số học với một thời gian dài tạo ra một thời gian dài.


9

Python 2 , 31 byte

Bị đánh gôn bởi xnor ... (điều này xảy ra mọi lúc)> <Nhưng này, thật đáng ngạc nhiên là Pythonic cho .

Mọi người không có xu hướng nhớ Python có str.endswith()...

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

Hãy thử trực tuyến!


Bạn không thể sử dụng `n*n`để chuyển đổi số thành chuỗi?
Hạ cấp

@Downgoat Điều đó giải quyết một 'L' cho các số dài hơn.
hoàn toàn là

@totallyhuman Điểm tốt, tôi đã bỏ lỡ việc sử dụng nó.
isaacg


5

Võng mạc , 44 byte

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

Hãy thử trực tuyến!

Có chính xác 4 giải pháp cho phương trình 10-adic x*x = x.


1
Ừm Không phải tất cả những con số này là giải pháp hợp lệ?
Leo

@Leo Không, họ không. Rõ ràng 5*5 != 5. Tuy nhiên, bạn có thể nhận thấy một số mẫu trong các số bạn liên kết đến. 4 giải pháp là: 0, 1, ... 59918212890625, ... 40081787109376 (số p-adic đi vô tận bên trái ). Các số bạn liên kết đến là hậu tố của 4 số.
Leaky Nun

Ồ ok, cảm ơn bạn, tôi không biết về số p-adic
Leo

4

Alice , 17 byte

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

Hãy thử trực tuyến!

Đầu ra không có gì (đó là giả trong chế độ Thông thường) hoặc Jabberwocky(không trống và do đó là trung thực trong chế độ Thông thường; đó cũng là giá trị chuỗi trung thực chính tắc).

Giải trình

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

Đây là một sửa đổi nhỏ của khung chung cho các chương trình chế độ Ordinal tuyến tính. Ở /giữa được sử dụng để có một toán tử duy nhất ở chế độ Cardinal ở giữa (the *) và sau đó chúng ta cần #bỏ qua nó trong chế độ Thông thường trên đường trở về. Chương trình tuyến tính là:

i..*.QLzno@

Chúng ta hãy đi qua đó:

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 byte

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

Đã lưu 4 byte nhờ @LeakyNun. Đã lưu 3 byte bằng cách lưu ý rằng đầu vào thấp hơn 10 ^ 12 nên nkhông kết thúc bằng "L". Đã lưu 1 byte nhờ @Dennis vì tôi đã nhầm lẫn ở vị trí đầu tiên.

Hãy thử trực tuyến! (Liên kết TIO lịch sự của @Dennis).




3

C # (.NET Core) , 47 byte

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

Hãy thử trực tuyến!


Không thể thay đổi $"{n}"thành n+""? Ngoài ra, có lẽ bạn có thể thêm một liên kết TryItOnline ? Ồ, và đây là một đoạn, không phải là một chức năng / chương trình. Vì vậy, bạn nên thêm n=>vào trước nó.
Kevin Cruijssen

1
@KevinCruijssen Xong! Có thể đơn giản hóa hơn nữa? TIL bạn có thể chuyển đổi một int thành chuỗi bằng cách sử dụng n+"". Cảm ơn!
kakkarot

Bạn không cần bool f(long n)hoặc dấu chấm phẩy cho câu trả lời lambda trong C #, Java, v.v. Chỉ cần n=>$"{BigInteger.Multiply(n,n)}".EndsWith(n+"")là đủ. :) Và tôi gần như quên mất: Chào mừng bạn đến với PPCG!
Kevin Cruijssen

@KevinCruijssen Cảm ơn bạn!
kakkarot

Không có gì! :) Ồ, và đây là công cụ chuyển đổi liên kết TIO của bạn để sử dụng chỉn=> bằng cách sử dụng a System.Func.
Kevin Cruijssen

3

Than , 12 11 byte

I¬⌕⮌IXIθ²⮌θ

Hãy thử trực tuyến!

Trả về Falsenhư falseyTruenhư truthy.

  • Lưu 1 byte chỉ nhờ ASCII! (Làm thế nào tôi có thể bỏ lỡ Powerchức năng?)

Điều này trả lại 0cho 10, 100... 1cho 50, 60... 2cho 760, 3792...
Neil

@Neil đã sửa, cảm ơn!
Charlie

2
Tôi nghĩ Char than chỉ tốt cho nghệ thuật ASCII. ಠ_ಠ
totallyhuman


@totallyhuman Vẫn vậy, hãy nhìn vào tất cả các golflang bình thường với các giải pháp <6 byte
ASCII-only

2

JavaScript (ES6), 23 byte

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

Thử nó

Đã viết Đoạn trích này trên điện thoại của tôi, vì vậy vui lòng chỉnh sửa nếu nó không hoạt động chính xác.

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>


Điều này không thành công cho 212890625 do các vấn đề chính xác.
Dennis

Cảm ơn đã chỉ ra rằng, @Dennis; Đây là một cách nhanh chóng trong khi nghỉ khói vì vậy tôi (ngu ngốc) chỉ kiểm tra các trường hợp thử nghiệm. Sẽ yêu cầu làm rõ về các lỗi chính xác và xóa khi tôi quay lại máy tính, nếu cần.
Shaggy




2

R, 28 byte

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

Tạo một chức năng:

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

Lấy mô-đun x^2sao cho chúng ta giữ các chữ số cuối cùng mà chúng ta so sánh x.






1

Dyvil , 26 byte

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

Sử dụng:

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

1

Mẻ, 122 byte

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

Thuật toán chỉ bị giới hạn bởi loại số nguyên được sử dụng cho các biến. Trong trường hợp của Batch, đây là số nguyên có chữ ký 32 bit, do đó tối đa là 2147483647. Hoạt động bằng cách kiểm tra cả n và n-1 cho các quyền hạn cần thiết là 2 và 5 làm các yếu tố. (Ngoại trừ khi n bằng 0 hoặc 1, n và n-1 sẽ có một yếu tố mỗi.)


1

> <> , 30 byte

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

Hãy thử trực tuyến , hoặc xem nó tại sân chơi cá !

Giả sử số đầu vào x đã có trên ngăn xếp.

Giải thích: Con cá lấy thương số của x 2 bằng cách tăng sức mạnh của 10 và tính số lần này bằng x . Khi công suất của 10 lớn hơn x , nó sẽ in số đếm và dừng lại. Tổng số sẽ là 1 nếu x là tự động và 0 nếu không.



1

Bình thường , 10 9 byte

-1 byte nhờ isaacg .

x_`^vz2_z

Trả về 0 khi số tự động, bất cứ điều gì khác nếu không.

Kiểm tra nó trực tuyến!

Giải thích

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
`được chuyển đổi thành chuỗi.
isaacg



0

Clojure, 59 byte

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

Điều này có vẻ quá dài dòng.


Tại sao không đi cùng #(.endsWith(str(* % %))(str %))?
vách đá

Ôi thật, thật dễ dàng để quên đi các phần mềm dựng sẵn của Java.
NikoNyrh

0

MATL , 10 byte

UUVG36hXXn

Điều này hoạt động cho các số lên đến floor(sqrt(2^53)), theo doublegiới hạn chính xác.

Đầu ra là một số dương (là trung thực) nếu tự động, hoặc trống (đó là giả) nếu không.

Hãy thử trực tuyến!

Giải trình

Thật buồn cười là câu trả lời này sử dụng hai phiên bản quá tải của U: với đầu vào chuỗi, nó đánh giá là một số và với đầu vào số, nó sẽ tính bình phương.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.