方形三角形


23

一个正整数x是一个正方形三角形,如果存在两个不同的正整数yz,则它们小于x,使得所有和

x + y

x + z

y + z

是完美的正方形。

例如30是一个正方形三角形数字,因为

30 + 6 = 6 2

30 + 19 = 7 2

6 + 19 = 5 2


您的任务是编写一些代码,该代码以正整数作为输入,并确定它是否为正三角形。您应该输出两个不同的值之一,如果输入的是正方形三角形,则输出一个,否则输入另一个。

这是因此答案将以字节计分,而字节数越少越好。

测试用例

这是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



@ Mr.Xcoder谢谢!我可能应该先检查OEIS。我将其添加到正文中以使其更易于搜索。
小麦巫师

为了清楚起见,“ ...如果有两个不同的正整数y和z,它们小于x ...” 表示y < xz < xy+z < x
J.Sallé18年

2
@J.Sallé前任
小麦巫师

这里不存在带有输入和输出的测试用例
RosLuP

Answers:



7

果冻,12字节

R²_fṖŒcS€Æ²Ẹ

在线尝试!

怎么运行的

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个字节

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

在线尝试!

同样是19个字节: ~hṪ>₁ℕ₁ᵐ≜{⊇Ċ+}ᶠ~^₂ᵐ

说明

~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字节

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

在线尝试!验证一些测试用例

接受输入$x。建立filter(这里相当于一个函数)的两个输入端$a,$b,它返回一个布尔真当且仅当[math]::sqrt$a+$b-eqUAL到Floor该平方根的(即,它是一个整数平方根)。

剩下的就是程序的内容了。我们对从1到进行双换循环$x-1。每次迭代,我们检查是否$y-nOT eQUAL到$_(即$ Z),以及功能是否为所有组合是真实的$x$y$_。如果是,$o则增加一(使其不为零)。

最后,在结束时,我们仔细布尔否定$o,果然0False非零成True。剩下的就在管道上,输出是隐式的。


4

Haskell75 69字节

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

在线尝试!

如果有人知道测试数字是否为平方的更短方法,可能会得到改进。我很确定使用sqrt最终会更长,因为floor会将结果转换为整数类型,因此您需要将其放入fromIntegral某个位置才能与原始值进行比较。

编辑:感谢@Wheat向导起飞6个字节!


4

JavaScript(ES7),75 71字节

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>


好像您在2分钟内就忍了我。:)我们的答案非常接近,所以我应该删除我的吗?
Arnauld

@Arnauld不,我确定您是独立提出解决方案的。
尼尔

4

05AB1E,18个字节

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

在线尝试!

感谢Emigna提供的 -3  -1个字节和一个修复程序


你并不需要2 的既nO向量化。这也不起作用,因为对于任何至少包含1个值的列表,即使仅包含false值,最后2个字节也将返回true。可以使用来解决(缩短)此问题Z
Emigna

@Emigna谢谢!(顺便说一句我没有必要€O,这就是为什么以前的做法没有工作
Xcoder先生

虽然没有用。例如检查45,应该返回false。
艾米尼亚

嗯嗯 无论如何,现在更新。谢谢
Xcoder先生18年

@Sanchises固定。谢谢
Xcoder先生18年

3

R,79字节

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

在线尝试!

计算y,zwith的所有值y<-(z=s-x)[z>0&z<x],然后计算with的所有和outer(y,y,"+")。这将产生一个方矩阵,其中非对角线入口可能是正方形,y==z仅当它们在对角线上时才是如此。因此,diag(S)=0将对角线设置为零(不是完美的正方形),然后测试是否any元素of S%in%s


3

SWI-Prolog,88字节

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

在线尝试!

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) 是将整数作为参数并输出是否为正三角形的规则(真/假)。


2

JavaScript(ES7),72个字节

返回01

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)

演示版


2

C,113字节

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;}

返回0数字是否为正方形三角形,1则否则。

在线尝试!


我猜return(int)sqrt(n)==sqrt(n)正在解析,return((int)sqrt(n))==sqrt(n)而不是更明显return(int)(sqrt(n)==sqrt(n))?如果不能,您能否解释p正在做什么?
MD XF

@MDXF类型转换的优先级更高==,因此((int)sqrt(n))==sqrt(n)像您猜测的那样解析表达式。
Steadybox '18


2

果冻,15字节

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

在线尝试!

怎么样?

ṖŒc;€ŒcS€Æ²ẠƊ€Ẹ|| 完整程序。
                ||
Ṗ|| 弹出范围。产率[1,N)∩。
 | c || 对(两个元素的组合)。
   ;€|| 将N附加到每个。
            |€|| 对于每个列表,请检查是否:
           Ạ|| ...全部...
       S€|| 他们每个人的总和
     | c || ...不相交的对
         Ʋ|| ...是完美的正方形。
              Ẹ|| 测试是否有满足上述要求的值。    



1

朱莉娅0.6,61字节

从功能开始阅读 all。第一个参数是一个匿名函数,用于检查数字的平方根是否为整数,将其应用于第二个参数中的每个值。的单个参数anyGenerator带有两个for循环的a,每个循环包含all函数的输出。

感谢Xcoder先生提供了-2个字节。

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

在线尝试!


1

Pyt,63 字节

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

测试y,z的所有可能组合,以使1≤z<y <x

如果x是一个正方形三角形,则返回1,否则返回0

在线尝试!


1

MATL20 19 18字节

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

在线尝试!返回1表示错误,0表示真实。

最多500个测试用例:在线试用!(使用H代替G)。运行时在输入尺寸二次,所以从枚举测试用例1n的运行O(n^3),这是为什么枚举所有测试用例多达1000次出来TIO。

  • -1字节和@LuisMendo的猜想少了
  • -1字节通过更巧妙地检查整数性。

删除将q生成一个具有所需序列作为子集的序列,但没有限制,y并且z严格小于x。一个例子是x=18y=7z=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谢谢。太可惜了,我希望能为我的猜想提供答案,但是我不能不付出任何努力就在Math.SE上问这个问题……
Sanchises


-1

APL NARS,340字节

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

测试

      :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 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.