Tam giác vuông


23

Số nguyên dương x là số tam giác vuông iff có hai số nguyên dương khác nhau, yz , nhỏ hơn x sao cho tất cả các tổng

x + y

x + z

y + z

là những hình vuông hoàn hảo.

Ví dụ 30 là số tam giác vuông vì

30 + 6 = 6 2

30 + 19 = 7 2

6 + 19 = 5 2


Nhiệm vụ của bạn là viết một số mã lấy số nguyên dương làm đầu vào và xác định xem đó có phải là số tam giác vuông hay không. Bạn nên xuất một trong hai giá trị riêng biệt, một giá trị nếu đầu vào là số tam giác vuông và mặt khác.

Đây là vì vậy câu trả lời sẽ được tính bằng byte với ít byte hơn.

Tủ thử

Dưới đây là tất cả các số tam giác vuông dưới 1000

30,44,47,48,60,66,69,70,78,86,90,92,94,95,96,98,108,113,116,118,120,122,124,125,126,132,138,142,147,150,152,154,156,157,158,159,160,165,170,176,180,182,185,186,188,190,192,194,195,196,197,198,200,207,212,214,216,218,221,222,224,227,230,232,234,236,237,238,239,240,246,248,253,258,260,264,266,267,268,270,273,274,275,276,278,280,281,282,283,284,285,286,290,296,298,302,303,306,308,310,312,314,317,318,320,322,323,324,326,328,329,330,331,332,333,334,335,336,338,340,344,347,350,351,352,356,357,360,362,364,368,370,371,372,374,376,377,378,380,382,384,385,386,387,388,389,390,392,394,396,402,405,408,410,413,414,415,418,420,422,423,424,426,429,430,432,434,435,436,438,440,442,443,444,445,446,447,448,449,452,456,458,462,464,466,467,468,470,472,476,477,479,480,482,484,485,488,490,491,492,494,496,497,498,500,501,502,503,504,505,506,507,508,509,510,512,515,516,518,522,523,524,527,528,530,533,536,538,540,542,543,546,548,549,550,551,552,554,557,558,560,562,563,564,566,568,569,570,571,572,573,574,575,576,578,579,582,585,588,590,592,593,594,598,600,602,603,604,605,606,608,610,612,613,614,615,616,618,620,621,623,624,626,627,628,630,632,633,634,636,638,639,640,641,642,643,644,645,646,650,652,656,657,658,659,660,662,666,667,668,670,672,674,677,678,680,682,683,686,687,689,690,692,694,695,696,698,700,701,702,704,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,722,723,726,728,730,734,737,739,740,742,744,745,746,750,752,755,756,758,760,762,764,765,767,768,770,772,773,774,776,778,779,780,782,783,784,785,786,788,789,790,791,792,793,794,795,796,797,798,800,802,803,804,805,810,812,814,816,817,818,819,820,822,825,826,827,828,829,830,832,833,834,836,837,838,840,842,846,847,848,849,850,851,852,854,855,856,858,860,861,862,863,864,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,882,884,888,890,891,893,896,897,898,902,903,904,905,908,912,913,914,915,916,918,920,923,924,926,927,928,929,931,932,933,935,936,938,940,941,942,944,946,947,948,950,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,970,972,974,976,978,980,981,984,986,987,988,992,993,995,996,998

OEIS A242445


6
Đây là OEIS A242445 .
Ông Xcoder

@ Mr.Xcoder Cảm ơn! Tôi có lẽ nên kiểm tra OEIS trước. Tôi sẽ thêm nó vào cơ thể để làm cho nó dễ tìm kiếm hơn.
Phù thủy lúa mì

Đối với mục đích làm rõ, "... iff có hai số nguyên dương khác nhau, y và z, nhỏ hơn x ..." có nghĩa là y < xz < xhay y+z < x?
J. Sallé

2
@ J.Sallé Cựu
Phù thủy lúa mì

Ở đây trường hợp thử nghiệm với đầu vào và đầu ra không có
RosLuP

Câu trả lời:



7

Thạch , 12 byte

R²_fṖŒcS€Æ²Ẹ

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

Làm thế nào nó hoạt động

R²_fṖŒcS€Æ²Ẹ  Main link. Argument: x

R             Range; yield [1, 2, ..., x].
 ²            Square; yield [1², 2², ..., x²].
  _           Subtract; yield [1²-x, 2²-x, ..., x²-x].
    Ṗ         Pop; yield [1, 2, ..., x-1].
   f          Filter; keep those values of n²-x that lie between 1 and x-1.
              This list contains all integers n such that n+x is a perfect square.
              We'll try to find suitable values for y and z from this list.
     Œc       Yield all 2-combinations [y, z] of these integers.
       S€     Take the sum of each pair.
         Ʋ   Test each resulting integer for squareness.
           Ẹ  Any; check is the resulting array contains a 1.


7

Brachylog , 19 byte

~hṪ>₁ℕ₁ᵐ≜¬{⊇Ċ+¬~^₂}

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

Ngoài ra 19 byte: ~hṪ>₁ℕ₁ᵐ≜{⊇Ċ+}ᶠ~^₂ᵐ

Giải trình

~hṪ                    Ṫ = [Input, A, B]
  Ṫ>₁                  Ṫ is strictly decreasing (i.e. Input > A > B)
  Ṫ  ℕ₁ᵐ               All members of Ṫ are in [1, +∞)
  Ṫ     ≜              Assign values to A and B that fit those constraints
  Ṫ      ¬{       }    It is impossible for Ṫ…
           ⊇Ċ            …that one of its 2-elements subset…
            Ċ+           …does not sum…
              ¬~^₂       …to a square

4

PowerShell , 150 byte

param($x)filter f($a,$b){($c=[math]::Sqrt($a+$b))-eq[math]::Floor($c)}1..($i=$x-1)|%{$y=$_;1..$i|%{$o+=+($y-ne$_)*(f $x $y)*(f $x $_)*(f $y $_)}};!!$o

Hãy thử trực tuyến! hoặc Xác minh một số trường hợp thử nghiệm

Đưa đầu vào $x. Thiết lập một filter(ở đây tương đương với một chức năng) vào hai đầu vào $a,$b, mà trả về một sự thật Boolean iff [math]::sqrtcủa $a+$b-equal đến Floorđó căn bậc hai (tức là, nó là một số nguyên căn bậc hai).

Phần còn lại của nó là thịt của chương trình. Chúng tôi tăng gấp đôi cho vòng lặp lên 1đến $x-1. Mỗi lần lặp, chúng tôi kiểm tra xem $y-not equal đến $_(ví dụ, $ z), và cho dù chức năng là đúng cho tất cả các kết hợp của $x, $y$_. Nếu có, $ođược tăng thêm một (làm cho nó khác không).

Cuối cùng, cuối cùng, chúng ta nhân đôi Boolean-negate $o, biến 0thành Falsevà khác không thành True. Đó là còn lại trên đường ống và đầu ra là ẩn.


4

Haskell , 75 69 byte

f x=or[all(`elem`map(^2)[1..x])[x+y,x+z,y+z]|y<-[1..x-1],z<-[1..y-1]]

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

Có lẽ có thể được cải thiện nếu ai đó biết một cách ngắn hơn để kiểm tra nếu một số là hình vuông. Tôi khá chắc chắn rằng việc sử dụng sqrtkết thúc lâu hơn bởi vì floorbiến kết quả thành một loại không thể tách rời nên bạn cần đặt fromIntegralvào đâu đó trước khi bạn có thể so sánh với bản gốc.

EDIT: Cảm ơn @Wheat Wizard đã gỡ 6 byte!


4

JavaScript (ES7), 75 71 byte

f=
n=>(g=i=>i?--j?[n+i,i+j,j+n].some(e=>e**.5%1)?g(i):1:g(j=i-1):0)(j=n-1)
<input type=number min=1 oninput=o.textContent=f(+this.value)><pre id=o>


Có vẻ như bạn ninja tôi 2 phút. :) Câu trả lời của chúng tôi rất gần, vậy tôi có nên xóa câu trả lời của mình không?
Arnauld

@Arnauld Không, tôi chắc chắn rằng bạn đã đến giải pháp của mình một cách độc lập.
Neil

4

05AB1E , 18 byte

Lns-IL¨Ãæ2ù€OŲO0›

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

Cảm ơn Emigna  -3  -1 byte và một bản sửa lỗi !


Bạn không cần cả 2 nvà cả hai O. Điều này cũng không hoạt động vì 2 byte cuối cùng sẽ trả về true cho bất kỳ danh sách nào có ít nhất 1 giá trị, ngay cả khi chỉ chứa các giá trị sai. Điều này có thể được sửa chữa (và rút ngắn) bằng cách sử dụng Zthay thế.
Emigna

@Emigna Cảm ơn bạn! (BTW tôi đã làm nhu cầu €Ovà đó là lý do tại sao các phương pháp trước đó đã làm việc với )
Ông Xcoder

Nó đã không làm việc mặc dù. Kiểm tra ví dụ 45, sẽ trả về false.
Emigna

Ừm, ok. Dù sao, cập nhật ngay bây giờ. Cảm ơn
Ông Xcoder

@Sanchise Đã sửa. Cảm ơn
Ông Xcoder

3

R , 79 byte

function(x){s=(1:x)^2
S=outer(y<-(z=s-x)[z>0&z<x],y,"+")
diag(S)=0
any(S%in%s)}

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

tính tất cả các giá trị y,zvới y<-(z=s-x)[z>0&z<x], sau đó tính tất cả các tổng của chúng với outer(y,y,"+"). Điều này mang lại một ma trận vuông trong đó các mục ngoài đường chéo là các hình vuông có khả năng, như y==zchỉ khi chúng nằm trên đường chéo. Do đó, diag(S)=0đặt các đường chéo thành 0, không phải là hình vuông hoàn hảo và chúng tôi kiểm tra xem liệu anyphần tử có phải S%in%s.


3

SWI-Prolog , 88 byte

s(A,B,C):-between(A,B,C),C<B,between(1,B,X),B+C=:=X*X.
g(X):-s(1,X,Y),s(Y,X,Z),s(Y,Z,Y).

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

s(A, B, C) :-
    between(A, B, C), % Find an integer C between A and B (inclusive),
    C < B,            % which is less than B.
    between(1, B, X), % Find an integer X between 1 and B (inclusive),
    B+C =:= X*X.      % of which (B+C) is the square.
g(X) :-
    s(1, X, Y), % Find Y: 1 <= Y < X, and X+Y is a perfect square
    s(Y, X, Z), % Find Z: Y <= Z < X, and X+Z is a perfect square
    s(Y, Z, Y). % Make sure that Z > Y and Y+Z is a perfect square

g(X) là quy tắc lấy một số nguyên làm tham số và xuất ra cho dù đó là số tam giác vuông (đúng / sai).


2

JavaScript (ES7), 72 byte

Trả về 0hoặc 1.

x=>(g=y=>z?y>z?![x+y,x+z,y+z].some(n=>n**.5%1)|g(y-1):g(x-1,z--):0)(z=x)

Bản giới thiệu


2

C, 113 byte

p(n){return(int)sqrt(n)==sqrt(n);}f(x,y,z,r){for(r=y=0;++y<x;)for(z=y;++z<x;p(x+y)&p(x+z)&p(z+y)&&++r);return!r;}

Trả về 0nếu số là tam giác vuông,1 nếu không.

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


Tôi đoán return(int)sqrt(n)==sqrt(n)là đang được phân tích cú pháp return((int)sqrt(n))==sqrt(n)trái ngược với rõ ràng hơn return(int)(sqrt(n)==sqrt(n))? Nếu không bạn có thể giải thích những gì pđang làm?
MD XF

@MDXF Kiểu cast có độ ưu tiên cao hơn ==, vì vậy biểu thức được phân tích cú pháp ((int)sqrt(n))==sqrt(n)như bạn đoán.
Steadybox


2

Thạch , 15 byte

ṖŒc;€ŒcS€Æ²ẠƊ€Ẹ

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

Làm sao?

ṖŒc; € cS € ²ẠƊ € Ẹ || Chương trình đầy đủ.
                | |
| | | Phạm vi xuất hiện. Năng suất [1, N).
 | C | | Cặp (kết hợp hai yếu tố).
   ; € || Nối N vào mỗi.
            Ɗ € | | Đối với mỗi danh sách, hãy kiểm tra xem:
           Ạ | | ... Tất cả các ...
       S € | | ... Số tiền của mỗi ...
     | C | | ... Ghép cặp
         Ʋ | | ... Là những hình vuông hoàn hảo.
              | | | Kiểm tra xem có bất kỳ giá trị thỏa mãn ở trên.    



1

Julia 0,6 , 61 byte

Bắt đầu đọc từ chức năng all. Đối số đầu tiên là một hàm ẩn danh kiểm tra rằng căn bậc hai của một số là một số nguyên, điều này được áp dụng cho mỗi giá trị trong đối số thứ hai. Đối số duy nhất anylà một Generatorvới hai vòng lặp for, cho mỗi lần lặp chứa đầu ra của allhàm.

Cảm ơn Mr Xcoder cho -2 byte.

x->any(all(x->√x%1==0,[x+y,x+z,y+z])for y=1:x-1for z=1:y-1)

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


1

Pyt , 63 byte

0←Đ⁻Đ`⁻Đ3ȘĐ3Ș+√ĐƖ=4ȘĐ3ȘĐ3Ș+√ĐƖ=4ȘĐ3ȘĐ3Ș+√ĐƖ=4Ș6Ș**4Ș↔+↔łŕ⁻Đłŕŕŕ

Kiểm tra tất cả các kết hợp có thể có của y, z sao cho 1≤z <y <x

Trả về 1 nếu x là số tam giác vuông, 0 nếu không

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


1

MATL , 20 19 18 byte

q:2XN!tG+wsvX^1\aA

Hãy thử trực tuyến! Trả về 1 cho falsey, 0 cho sự thật.

Testcase lên đến 500: Hãy thử trực tuyến! (sử dụng Hthay vì G). Thời gian chạy là bậc hai trong kích thước đầu vào, do đó, liệt kê các testcase từ 1để nchạy vào O(n^3), đó là lý do tại sao liệt kê tất cả các testcase lên đến 1000 lần trên TIO.

  • -1 byte và một phỏng đoán ít hơn nhờ @LuisMendo
  • -1 byte bằng cách kiểm tra số nguyên thông minh hơn.

Việc loại bỏ qsẽ tạo ra một chuỗi với chuỗi mong muốn dưới dạng tập hợp con, nhưng không có ràng buộc đó yznhỏ hơn hoàn toàn x. Một ví dụ là x=18, y=7, z=18.

q:    % Push 1...n-1
2XN   % Generate all permuations of choosing 2 numbers from the above.
!     % Transpose to take advantage of column-wise operators later on.
 G+   % Add n to these combinations, to have all combos of x+y and x+z
t  ws % Duplicate the combinations, swap to the top of the stack and sum to get y+z.
v     % Concatenate vertically. The array now contains columns of [x+y;x+z;y+z].
X^    % Element-wise square root of each element
1\    % Get remainder after division by 1.
a     % Check if any have remainders, columnwise. If so, it is not a square triangle.
A     % Check whether all combinations are not square triangle.

@LuisMendo Cảm ơn. Quá tệ, tôi đã hy vọng có câu trả lời cho phỏng đoán của mình, nhưng tôi không thể chỉ hỏi nó ở Math.SE mà không thể hiện một số nỗ lực cho một bằng chứng ...
Sanchises


-1

APL NARS, 340 byte

r←h n;i;j;k
   r←¯1⋄→0×⍳(n≤0)∨n≥9E9
   l←(-n)+2*⍨(⌈√n)..⌊√¯1+2×n
   l←(l>0)/l
   r←1⋄i←0⋄k←⍴l
A: →C×⍳k≤i+←1⋄j←i+1
B: →A×⍳j>k⋄→0×⍳0=1∣√(i⊃l)+j⊃l⋄j+←1⋄→B
C: r←0

kiểm tra

      :for i :in ⍳100⋄k←h i⋄:if 1=k⋄⍞←' ',i⋄:endif⋄:endfor⋄⎕←' '
  30  44  47  48  60  66  69  70  78  86  90  92  94  95  96  98 
      (¯5..5),¨h¨¯5..5
 ¯5 ¯1  ¯4 ¯1  ¯3 ¯1  ¯2 ¯1  ¯1 ¯1  0 ¯1  1 0  2 0  3 0  4 0  5 0 
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.