Đó là Hip to Square


44

Thử thách

Vì vậy, ừm, có vẻ như, trong khi chúng ta có rất nhiều thử thách hoạt động với số vuông hoặc số có hình dạng khác, chúng ta không có một câu hỏi đơn giản:

Cho một số nguyên n(trong đó n>=0) làm đầu vào trả về giá trị trung thực nếu nlà một hình vuông hoàn hảo hoặc giá trị falsey nếu không.


Quy tắc

  • Bạn có thể nhận đầu vào bằng bất kỳ phương tiện hợp lý, thuận tiện nào miễn là được phép theo quy tắc I / O tiêu chuẩn .
  • Bạn không cần xử lý các yếu tố đầu vào lớn hơn những gì ngôn ngữ bạn chọn có thể xử lý nguyên bản cũng không dẫn đến sự thiếu chính xác của dấu phẩy động.
  • Đầu ra phải là một trong hai giá trị trung thực / falsey nhất quán (ví dụ: truehoặc false, 1hoặc 0) - trung thực nếu đầu vào là một hình vuông hoàn hảo, falsey nếu không.
  • Đây là nên số byte thấp nhất sẽ thắng.

Các trường hợp thử nghiệm

Input:  0
Output: true

Input:  1
Output: true

Input:  64
Output: true

Input:  88
Output: false

Input:  2147483647
Output: false

@Neil Tôi nhận ra sai lầm của mình. Tôi rút lại đề nghị đó, và thay vào đó đưa 18014398509481982( 2**54-2), mà biểu diễn với một đôi, và gây ra câu trả lời rằng việc sử dụng sqrtthất bại.
Mego

@Mego Tôi có thể sai hoặc chỉ hiểu sai những gì bạn đang nói, nhưng tôi chắc chắn 2**54-2vẫn lớn hơn gấp đôi có thể xử lý một cách an toàn, ít nhất là trong JavaScript18014398509481982 > 9007199254740991
Tom

@Mego Tôi nghĩ giá trị giới hạn là 9007199515875288. Đây không phải là hình vuông của 94906267, vì đó không thể biểu thị bằng một số kép, nhưng nếu bạn lấy căn bậc hai của nó, thì bạn sẽ nhận được số nguyên đó.
Neil

@Tom Nhập 2**54-2vào bảng điều khiển JS và so sánh những gì bạn nhận được 18014398509481982(giá trị chính xác). Do đó, JS đưa ra giá trị chính xác, do đó 2**54-2có thể biểu diễn bằng một kép. Nếu điều đó vẫn không thuyết phục được bạn, hãy lấy dữ liệu nhị phân 0100001101001111111111111111111111111111111111111111111111111111, diễn giải nó dưới dạng float chính xác kép của IEEE-754 và xem giá trị bạn nhận được.
Mego

3
Xin lỗi các bạn, bước đi ăn trưa và ... tốt, đã leo thang! Và tôi nghĩ đây sẽ là một thử thách đơn giản, tốt đẹp! Việc thêm một quy tắc mà bạn không cần xử lý các yếu tố đầu vào dẫn đến sự thiếu chính xác của dấu phẩy động trong ngôn ngữ bạn đã chọn có bao gồm nó không?
Shaggy

Câu trả lời:


27

Neim , 2 byte

q𝕚

Giải trình:

q      Push an infinite list of squares
 𝕚     Is the input in that list?

Khi tôi nói 'vô hạn', tôi có nghĩa là cho đến khi chúng ta đạt được giá trị tối đa của thời gian dài (2 ^ 63-1). Tuy nhiên, Neim đang (từ từ) chuyển sang BigIntegers lớn về mặt lý thuyết.

Thử nó!


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Dennis

Hấp dẫn. Vì vậy, điều này có đệm trước danh sách hay nó là một trình tạo / lặp tiếp tục kiểm tra sự tồn tại của đầu vào cho đến khi nó kết thúc?
Patrick Roberts

@PatrickRoberts Chúng ta có thể nói chuyện trong trò chuyện không?
Okx

Chắc chắn, chỉ cần ping tôi trên The Nineteenth Byte . Thỉnh thoảng tôi ở đó.
Patrick Roberts

Chà, đây là ... THỰC SỰ CHỨC NĂNG
Chromium


8

TI-Basic, 4 byte

not(fPart(√(Ans

Đơn giản chỉ cần kiểm tra xem căn bậc hai có phải là số nguyên hay không bằng cách tìm phần thập phân / phần thập phân khác không.


Bạn có thể thêm một TIO (hoặc tương đương) không?
Shaggy

@Shaggy Tôi không nghĩ là có. TI-Basic là độc quyền và sẽ chỉ chạy trên máy tính của TI và trong trình giả lập chạy ROM từ máy tính, vì vậy bạn không thể sử dụng TI-Basic một cách hợp pháp nếu bạn không sở hữu máy tính.
Adám

1
@Shaggy Nếu bạn có bất kỳ ROM nào, bạn có thể sử dụng trình giả lập (tùy chọn của tôi là jstified) để thử trực tuyến.
TimTech

8

C #, 27 byte

n=>System.Math.Sqrt(n)%1==0

Một cách chính xác / chính xác hơn để làm điều này sẽ là:

n=>System.Math.Sqrt(n)%1<=double.Epsilon*100

double.Epsilon là vô dụng đối với loại kiểm tra này . tl; dr: Khi so sánh các số> 2, Double.Epsilon về cơ bản giống như số không. Nhân với 100 sẽ chỉ trì hoãn một chút.
Robert Fraser

@RobertFraser Tôi chỉ đi qua bài viết SO được liên kết và không đọc nhiều về nó. Dù bằng cách nào, nó không vô dụng chỉ là không hữu ích với số lượng cao hơn.
TheLethalCoder

...<int>==0được ...!<int>tôi nghĩ
Stan Strum

@StanStrum Không có trong C #
TheLethalCoder

7

JavaScript (ES6), 13 byte

n=>!(n**.5%1)

Trả về true nếu căn bậc hai của n là một số nguyên.

Đoạn trích:

f=
n=>!(n**.5%1)

console.log(f(0));
console.log(f(1));
console.log(f(2));
console.log(f(4));
console.log(f(8));
console.log(f(16));
console.log(f(88));
console.log(f(2147483647));


7

đc, 9

0?dvd*-^p

Kết quả 1 cho sự thật và 0 cho falsey.

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

0            # Push zero.  Stack: [ 0 ]
 ?           # Push input.  Stack: [ n, 0 ]
  dv         # duplicate and take integer square root.  Stack: [ ⌊√n⌋, n, 0 ]
    d        # duplicate.  Stack: [ ⌊√n⌋, ⌊√n⌋, n, 0 ]
     *       # multiply.  Stack: [ ⌊√n⌋², n, 0 ]
      -      # take difference. Stack: [ n-⌊√n⌋², 0 ]
       ^     # 0 to power of the result.  Stack: [ 0^(n-⌊√n⌋²) ]
        p    # print.

Lệnh lũy thừa dccủa Note ^cho 0 0 = 1 và 0 n = 0, trong đó n> 0.


Đẹp! +1 để sử dụng dctrong thời trang khéo léo như vậy.
tự đại diện

6

Võng mạc , 18 byte

.+
$*
(^1?|11\1)+$

Hãy thử trực tuyến! Không biết xấu hổ thích nghi với câu trả lời của @ MartinEnder cho số này có phải là hình tam giác không? nhưng với chuyển đổi cơ sở được bao gồm với chi phí là 6 byte.

Lưu ý rằng số này có phải là hình tam giác không? không phải vì một số lý do không thể giải thích được yêu cầu hỗ trợ số 0 dưới dạng số tam giác, do đó, một phần của sự thích ứng là thêm một ?để làm cho 1 tùy chọn hàng đầu, cho phép nhóm khớp với chuỗi trống và do đó, đầu vào bằng không. Tuy nhiên, bây giờ đã khớp với chuỗi rỗng, +toán tử dừng lặp lại, để tránh vòng lặp vô hạn sẽ xảy ra nếu nó tiếp tục khớp với chuỗi trống (sau tất cả, ^1?chắc chắn sẽ tiếp tục khớp). Điều này có nghĩa là nó thậm chí không cố gắng khớp với lựa chọn thay thế khác trong nhóm, do đó tránh kết hợp 2, 6, 12, v.v. Như @MartinEnder chỉ ra, một cách đơn giản hơn để tránh điều đó trong khi vẫn khớp với chuỗi trống là neo trận đấu khi bắt đầu trong khi làm cho nhóm tùy chọn cho cùng một số byte : ^(^1|11\1)*$.


Mong muốn được giải thích của bạn tại sao điều này không phù hợp 2, 6hoặc các số khác có dạng n^2-n. ;) (Một cách để tránh lời giải thích đó cho cùng một số byte sẽ có ^(^1|11\1)*$.)
Martin Ender

@MartinEnder Lý do tương tự mà bạn không thể sử dụng (^|1\1)+$, tôi nghĩ vậy?
Neil

Vâng đúng rồi. Chỉ cần nghĩ rằng nó có thể là tốt để đề cập bởi vì hầu hết mọi người có thể đã không đọc nhận xét của tôi về câu trả lời tam giác (và trong trường hợp này nó thực sự có liên quan đến lý do tại sao giải pháp là chính xác, trái ngược với lý do tại sao nó không thể được đánh gôn thêm ).
Martin Ender

Đối với bản ghi, +cũng sẽ dừng vòng lặp nếu không còn thay thế trống, ví dụ trong trường hợp ((?(1)11\1|1?))+. Khi đã có một lần lặp trống, nó sẽ không thử bất kỳ lần lặp nào nữa, bất kể chúng có thể trống hay không.
Martin Ender

@MartinEnder Thật vậy, tôi có nghĩa là "bây giờ đã khớp" thay vì "đã khớp ngay lập tức". Đã sửa.
Neil


6

MATL , 5 4 byte

Cảm ơn Luis vì đã giảm mã dài hơn một byte của tôi xuống hai byte, biến nó thành mã ngắn nhất.

t:Um

Dùng thử trực tuyến

Giải trình:

         % Implicit input
t        % Duplicate it
 :       % Range from 1 to input value
  U      % Square the range, to get 1 4 9 ... 
   m     % ismember, Checks if the input is a member of the range of perfect squares

Câu trả lời cũ:

X^1\~

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

        % Implicit input
X^      % Square root of input
  1\    % Modulus 1. All perfect squares will have 0, the rest will have decimal value
     ~  % Negate, so the 0 becomes 1, and the decimal values become 0

@Mego Tôi không đồng ý. MATL thậm chí không thể làm được mod(2**127-, 1000). Trừ khi bốn chữ số cuối cùng là 0 ....
Stewie Griffin

Bạn cũng có thể sử dụng t:Um. Điều đó hoạt động cho các đầu vào lên đến2^53 , do độ chính xác giới hạn dấu phẩy động
Luis Mendo

Bây giờ tôi thấy điều này tương tự với chỉnh sửa của bạn, chỉ ngắn hơn một chút :-)
Luis Mendo

Cũng ẩn lệnh vuông! U: str2num / string to array / square. Tôi biết rằng phải có một hàm vuông, nhưng tôi không thể tìm thấy nó ...
Stewie Griffin

1
@cairdcoinheringaahing đó là một phần về mục đích. Tôi có hai giải pháp, một là 5 byte, một là 6 byte. Luis đánh gôn hai byte từ một với 6. Vì vậy, tôi đã tiết kiệm được hai byte nhờ anh ấy, nhưng tôi chỉ lưu một byte về điểm số ...
Stewie Griffin

6

Python 3 , 40 38 byte

Cảm ơn mực đã tiết kiệm 2 byte!

lambda n:n in(i*i for i in range(n+1))

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

Quá chậm để trả lời một câu trả lời 2147483647trong một khoảng thời gian hợp lý. (Nhưng được viết bằng cách sử dụng một trình tạo để tiết kiệm bộ nhớ, vì nó không tốn bất kỳ byte nào.)

Cũng hoạt động trong Python 2, mặc dù có OverflowErrorkhả năng là do rangenếu bạn thử nó với đầu vào lớn. (A MemoryErrorcũng có khả năng trong Python 2, cũng do range.)


5

Perl 5 , 14 byte

13 byte mã + -pcờ.

$_=sqrt!~/\./

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

Tính toán căn bậc hai và xem nếu đó là một số nguyên (chính xác hơn, nếu nó không chứa dấu chấm ( /\./).


5

Chẳng hạn, không hoạt động với số lượng lớn4111817668062926054213257208
Emigna

@Emigna Oh vì nó được coi là lâu? Tôi nghĩ rằng 05AB1E sử dụng Python 3.
Erik the Outgolfer

Thất bại cho đầu vào lớn ( đầu vào đã cho là 2**127-1, một số nguyên tố Mersenne).
Mego

Nó không sử dụng python 3. Vấn đề là căn bậc hai cho các lỗi làm tròn cho số lượng lớn.
Emigna

@Emigna Oh ... Tôi đoán tôi sẽ phải tìm ra một cách khác sau đó, không nên khó khăn.
Erik the Outgolfer

5

Python 3 , 19 byte

lambda n:n**.5%1==0

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


Thất bại cho đầu vào lớn, ví dụ 4111817668062926054213257208.
L3viathan

Đã sửa trong 25 byte:lambda n:int(n**.5)**2==n
L3viathan

4
@ L3viathan Điều đó (cùng với bất kỳ giải pháp nào liên quan sqrt) đều thất bại đối với các giá trị nằm ngoài phạm vi của một số kép, như thế nào 2**4253-1.
Mego

@totallyhuman nổi sau đó %1là chắc chắn <1, vì vậy đề xuất của bạn sẽ trả lại đúng cho tất cả các đầu vào. Lưu ý đó n**.5là một cái phao.
Rò rỉ Nun

5

SageMath , 9 byte

is_square

Dùng thử trực tuyến

Hàm tích hợp thực hiện chính xác những gì nó nói trên hộp thiếc. Do Sage sử dụng tính toán tượng trưng, ​​nên nó không có lỗi chính xác về mặt tính toán gây ra lỗi nổi cho IEEE-754.


5

Japt , 3 byte

¬v1

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

Có vẻ như hoạt động tốt 2**54-2trong Phiên dịch Japt nhưng không thành công trên TIO vì một số lý do ...


Thất bại cho đầu vào lớn (đầu vào là 2**127-1, một số nguyên tố Mersenne).
Mego

@Mego, không phải là tiêu chuẩn mà các giải pháp không cần xử lý số lượng lớn hơn ngôn ngữ có khả năng xử lý?
Xù xì

@Shaggy Japt dựa trên JavaScript, sử dụng các số float chính xác kép. 2**127-1là trong phạm vi của một đôi.
Mego

2
@Mego Không phải là int an toàn tối đa cho JavaScript 2**53-1?
Tom

3
@Mego Nhưng số của JavaScript chỉ có độ chính xác 53 bit, do đó, JS không thể biểu thị chính xác giá trị 2**127-1dưới dạng số. Gần nhất nó có thể nhận được là 2**127.
Sản phẩm ETH


5

Prolog (SWI) , 27 byte

+N:-between(0,N,I),N=:=I*I.

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

Giải trình

Tìm kiếm thông qua tất cả các số lớn hơn hoặc bằng 0và nhỏ hơn hoặc bằng Nvà kiểm tra xem số đó bình phương có bằng không N.


1
@DLosc đã xong !
0 '

5

MathGolf , 1 byte

°

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

Tôi không nghĩ cần một lời giải thích. Tôi thấy sự cần thiết của một nhà điều hành "là hình vuông hoàn hảo" trước khi tôi thấy thách thức này, vì ngôn ngữ được thiết kế để xử lý các thách thức golf liên quan đến toán học. Trả về 0 hoặc 1, vì MathGolf sử dụng các số nguyên để biểu diễn booleans.


4

PHP, 21 byte

<?=(-1)**$argn**.5<2;

Nếu căn bậc hai không phải là số nguyên, (-1)**$argn**.5NAN.


Làm thế nào để tôi chạy cái này?
Tít

@Titus Với -Fcờ và đường ống : echo 144 | php -F script.php.
dùng63956

Ah tôi fcực khoái bức thư đó. Cảm ơn.
Tít

4

Ruby, 25 byte

Math.sqrt(gets.to_i)%1==0

Có lẽ có một cách ngắn hơn nhưng đó là tất cả những gì tôi tìm thấy.

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


Chào mừng bạn đến với PPCG :) Bạn có thể thêm TIO (hoặc tương đương) vào đây không?
Xù xì

Cảm ơn vì đã thêm TIO, tuy nhiên, điều này dường như không trả lại bất kỳ đầu ra nào.
Xù xì

Xấu của tôi, tôi đã cập nhật nó
Gregory

Không, vẫn không làm việc.
Shaggy

3

CJam , 8 byte

ri_mQ2#=

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

Giải trình

Số nguyên căn bậc hai, bình phương, so sánh với số gốc.


Tôi đoán theo điều này , bạn không cần 2 byte đầu tiên
Chromium

Và, thay vào đó, bằng cách sử dụng ý tưởng của câu trả lời này , bạn có thể thực hiện mq1%0=, đó cũng là 6 byte
Chromium

@Chromium Cảm ơn, nhưng trong trường hợp đó tôi cần {... }để biến mã thành một hàm, cùng một số byte
Luis Mendo

Thật ra, tôi hơi bối rối không biết có nên thêm niềng răng xoăn hay không. Vì nếu bạn không thêm chúng, đây thực sự là một chương trình được phép.
Chromium

@Chromium Một chương trình cần lấy đầu vào của nó, vì vậy ribắt buộc phải có trong trường hợp đó
Luis Mendo

3

Toán học, 13 byte

AtomQ@Sqrt@#&

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


Không được xây dựng trong? Lạ ....
TheLethalCoder

1
Bạn có thể sử dụng AtomQthay vì IntegerQ.
Martin Ender

1
tất nhiên là
xấu hổ

1
Bạn vẫn có thể sử dụng @*.
Martin Ender

4
AtomQ@*Sqrtlà một từ đồng nghĩa với AtomQ@Sqrt@#&. Ví dụ, AtomQ@*Sqrt@4trả lại TrueAtomQ@*Sqrt@5trả lại False. (Vì được ưu tiên, AtomQ@*Sqrt[4]không hoạt động đúng, quay trở lại AtomQ@*2.)
Greg Martin


3

AWK , 27 + 2 byte

{x=int($0^0.5);$0=x*x==$1}1

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

Thêm +2byte để sử dụng -Mcờ cho độ chính xác tùy ý. Ban đầu tôi sử dụng so sánh chuỗi vì số lượng lớn so sánh bằng nhau, mặc dù chúng không có, nhưng sqrtcũng trả về các giá trị không chính xác. 2^127-2không nên là một hình vuông hoàn hảo


3

T-SQL, 38 byte

SELECT IIF(SQRT(a)LIKE'%.%',0,1)FROM t

Tìm kiếm một dấu thập phân trong căn bậc hai. IIFlà dành riêng cho MS SQL, đã được thử nghiệm và hoạt động trong MS SQL Server 2012.

Đầu vào nằm trong cột a của bảng t có sẵn , theo quy tắc đầu vào của chúng tôi .


3

, 2 byte

Ʋ

Sử dụng CP-437mã hóa.

Giải trình

Đầu vào tiềm ẩn -> Tích hợp hình vuông hoàn hảo -> Đầu ra tiềm ẩn ...


3

Java 8, 20 byte

n->Math.sqrt(n)%1==0

Đầu vào là một int.

Hãy thử nó ở đây.


Không phải bàn cãi: câu hỏi nói rõ ràng "Cho một số nguyên n (trong đó n> = 0)". Câu trả lời ngắn nhất là tốt nhất. Chỉnh sửa: sẽ không +1 cho đến khi câu trả lời ngắn nhất không phải là câu đầu tiên: p
Olivier Grégoire

@ OlivierGrégoire Hmm, đó là một cách tốt để xem xét nó. Nhưng bạn vẫn sẽ không biết cho dù đó là một int, long, short. Và với những câu hỏi họ yêu cầu số nguyên nhưng định dạng đầu vào linh hoạt, đôi khi tôi sử dụng đầu vào Chuỗi để lưu một số byte. Cá nhân tôi nghĩ rằng sử dụng n->là tốt, và bạn chỉ nên nói loại đó là gì, nhưng dường như không phải ai cũng đồng ý với điều này. Mặt khác, xuất phát từ một lịch sử câu trả lời Java 7, đi từ int c(int n){return ...;}để (int n)->...làm cho ý nghĩa hơn n->...(mặc dù cá nhân tôi thích thứ hai kể từ ngắn dĩ nhiên).
Kevin Cruijssen

2
@ OlivierGrégoire Ok, tôi đã thay đổi nó. Sau khi đọc thảo luận trong câu trả lời này , tôi đã đi đến kết luận rằng việc nêu đầu vào là một số nguyên trong Java, không có gì khác biệt so với việc nêu đầu vào là danh sách hai Chuỗi trong CJam hoặc một chuỗi các chuỗi trong MATL .
Kevin Cruijssen


3

Thêm ++ , 24 13 11 byte

+?
S
%1
N
O

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

Tôi đã loại bỏ hàm clunky ở đầu và viết lại nó vào phần thân của câu hỏi để loại bỏ 11 byte.

Vì phần đầu tiên đã được giải thích bên dưới, chúng ta chỉ tìm hiểu cách phần mới hoạt động

S   Square root
%1  Modulo by 1. Produced 0 for integers and a decimal for floats
N   Logical NOT

Phiên bản cũ, 24 byte

D,i,@,1@%!
+?
^.5
$i,x
O

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

Hàm ở trên cùng ( D,i,@,1@%!) là phần chính của chương trình, vì vậy chúng ta hãy đi vào chi tiết hơn.

D,     Create a function...
  i,   ...called i...
  @,   ...that takes 1 argument (for this example, let's say 3.162 (root 10))
    1  push 1 to the stack; STACK = [1, 3.162]
    @  reverse the stack;   STACK = [3.162, 1]
    %  modulo the stack;    STACK = [0.162]
    !  logical NOT;         STACK = [False]

+?     Add the input to accumulator (x)
^.5    Square root (exponent by 0.5)
$i,x   Apply function i to x
O      Output the result

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.