Triángulos cuadrados

23

Un entero positivo x es un número de triángulo cuadrado si hay dos enteros positivos diferentes, y y z , que son más pequeños que x, de modo que todas las sumas

x + y

x + z

y + z

Son cuadrados perfectos.

Por ejemplo, 30 es un número de triángulo cuadrado porque

30 + 6 = 6 2

30 + 19 = 7 2

6 + 19 = 5 2


Su tarea es escribir algún código que tome un entero positivo como entrada y determine si es o no un número de triángulo cuadrado. Debe generar uno de dos valores distintos, uno si la entrada es un número de triángulo cuadrado y el otro en caso contrario.

Este es el por lo que las respuestas se puntuarán en bytes, con menos bytes mejor.

Casos de prueba

Aquí están todos los números de triángulos cuadrados menores de 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

Asistente de trigo
fuente
66
Este es OEIS A242445 .
Sr. Xcoder
@ Mr.Xcoder Gracias! Probablemente debería haber revisado el OEIS primero. Agregaré eso al cuerpo para que sea más fácil de buscar.
Wheat Wizard
A efectos de clarificación, "... si y sólo si hay dos números enteros positivos diferentes, Y y Z, que son más pequeños que x ..." significa que y < xy z < xo que y+z < x?
J. Sallé
2
@ J.Sallé The first
Wheat Wizard
Aquí el caso de prueba con entrada y salida está ausente
RosLuP

Respuestas:

7

Jalea , 12 bytes

R²_fṖŒcS€Æ²Ẹ

Pruébalo en línea!

Cómo funciona

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.
Dennis
fuente
7

Python 2 , 93 87 86 bytes

-1 byte gracias a Dennis

lambda n:{0}in[{m**.5%1for m in[x+y,n+x,n+y]}for x in range(1,n)for y in range(1+x,n)]

Pruébalo en línea!

Barra
fuente
7

Brachylog , 19 bytes

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

Pruébalo en línea!

También 19 bytes: ~hṪ>₁ℕ₁ᵐ≜{⊇Ċ+}ᶠ~^₂ᵐ

Explicación

~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
Fatalizar
fuente
4

PowerShell , 150 bytes

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

Pruébalo en línea! o verificar algunos casos de prueba

Toma entrada $x. Establece un filter(aquí equivalente a una función) en dos entradas $a,$b, que devuelve un valor booleano verdadero si la [math]::sqrtde $a+$bes -equal a la Floorde esa raíz cuadrada (es decir, es una raíz cuadrada entera).

El resto es la carne del programa. Doblamos para el ciclo de arriba 1a $x-1. Cada iteración, se comprueba si $yes -not equal a $_(es decir, $ z), y si la función es cierto para todas las combinaciones de $x, $yy $_. Si es así, $ose incrementa en uno (lo que hace que no sea cero).

Finalmente, al final, negamos el doble booleano $o, que se convierte 0en Falsey no en cero True. Eso queda en la tubería y la salida es implícita.

AdmBorkBork
fuente
4

Haskell , 75 69 bytes

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

Pruébalo en línea!

Probablemente podría mejorarse si alguien conoce una forma más corta de probar si un número es cuadrado. Estoy bastante seguro de que el uso sqrttermina siendo más largo porque floorconvierte el resultado en un tipo integral, por lo que debe colocarlo fromIntegralen algún lugar antes de poder compararlo con el original.

EDITAR: ¡Gracias @Wheat Wizard por despegar 6 bytes!

usuario1472751
fuente
4

JavaScript (ES7), 75 71 bytes

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>

Neil
fuente
Parece que me has hecho un ninja por 2 minutos. :) Nuestras respuestas son muy cercanas, ¿debo eliminar las mías?
Arnauld
@Arnauld No, estoy seguro de que llegó a su solución de forma independiente.
Neil
4

05AB1E , 18 bytes

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

Pruébalo en línea!

¡Gracias a Emigna por  -3  -1 byte y una solución !

Sr. Xcoder
fuente
No necesita los 2 como ambos ny Ovectoriza. Esto tampoco funciona, ya que los 2 bytes finales devolverán verdadero para cualquier lista con al menos 1 valor, incluso si solo contiene valores falsos. Esto se puede arreglar (y acortar) usando en su Zlugar.
Emigna
@Emigna ¡Gracias! (Por cierto que hice necesidad €Oy por eso el enfoque anterior hizo el trabajo con )
Sr. Xcoder
Sin embargo, no funcionó. Compruebe, por ejemplo 45, que debería devolver falso.
Emigna
Um huh, ok De todos modos, actualizado ahora. Gracias
Sr. Xcoder
@Sanchises Fixed. Gracias
Sr. Xcoder
3

R , 79 bytes

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

Pruébalo en línea!

calcula todos los valores de y,zwith y<-(z=s-x)[z>0&z<x], luego calcula todas sus sumas con outer(y,y,"+"). Esto produce una matriz cuadrada donde las entradas fuera de la diagonal son potencialmente cuadrados, como y==zsolo si están en la diagonal. Por lo tanto, diag(S)=0establece las diagonales en cero, que no son cuadrados perfectos, y probamos para ver si el anyelemento de Ses %in%s.

Giuseppe
fuente
3

SWI-Prolog , 88 bytes

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

Pruébalo en línea!

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) es la regla que toma un número entero como parámetro y muestra si es un número de triángulo cuadrado (verdadero / falso).

mercator
fuente
2

JavaScript (ES7), 72 bytes

Devoluciones 0o 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)

Manifestación

Arnauld
fuente
2

C, 113 bytes

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

Devuelve 0si el número es triángulo cuadrado, de lo 1contrario.

Pruébalo en línea!

Steadybox
fuente
Supongo que return(int)sqrt(n)==sqrt(n)se está analizando return((int)sqrt(n))==sqrt(n)en lugar de lo más obvio return(int)(sqrt(n)==sqrt(n)). Si no, ¿puedes explicar qué pestá haciendo?
MD XF
@MDXF Type cast tiene mayor precedencia que ==, por lo que la expresión se analiza como ((int)sqrt(n))==sqrt(n)adivinó.
Steadybox el
2

Jalea , 15 bytes

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

Pruébalo en línea!

¿Cómo?

ṖŒc; € ŒcS € ƲẠƊ € Ẹ || Programa completo
                ||
Ṗ || Rango reventado. Rendimientos [1, N) ∩ ℤ.
 Œc || Pares (combinaciones de dos elementos).
   ; € || Añadir N a cada uno.
            Ɗ € || Para cada una de las listas, verifique si:
           Ạ || ... Todos ...
       S € || ... Las sumas de cada uno de sus ...
     Œc || ... pares disjuntos
         Ʋ || ... Son cuadrados perfectos.
              Ẹ || Pruebe si hay algún valor que satisfaga lo anterior.    
Sr. Xcoder
fuente
1

Julia 0.6 , 61 bytes

Comience a leer desde la función all. El primer argumento es una función anónima que comprueba que la raíz cuadrada de un número es un número entero, esto se aplica a cada valor en el segundo argumento. El argumento único para anyes un Generatorcon dos bucles for, que para cada iteración contiene la salida de la allfunción.

Gracias al Sr. Xcoder por -2 bytes.

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

Pruébalo en línea!

gggg
fuente
1

Pyt , 63 bytes

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

Prueba todas las combinaciones posibles de y, z de modo que 1≤z <y <x

Devuelve 1 si x es un número de triángulo cuadrado, 0 de lo contrario

Pruébalo en línea!

mudkip201
fuente
1

MATL , 20 19 18 bytes

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

Pruébalo en línea! Devuelve 1 para falsey, 0 para verdadero.

Casos de prueba hasta 500: ¡ Pruébelo en línea! (usando en Hlugar de G). El tiempo de ejecución es cuadrático en el tamaño de entrada, por lo que enumerar los casos de prueba de 1a se nejecuta O(n^3), razón por la cual se enumeran todos los casos de prueba hasta 1000 veces en TIO.

  • -1 byte y una conjetura menos gracias a @LuisMendo
  • -1 byte mediante una comprobación más inteligente de enteros.

La eliminación qgenera una secuencia con la secuencia deseada como un subconjunto, pero sin la restricción de que yy zsea ​​estrictamente menor que x. Un ejemplo es 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.
Sanchises
fuente
@LuisMendo Gracias. Lástima, esperaba una respuesta a mi conjetura, pero no puedo preguntarla en Math.SE sin mostrar algún esfuerzo por una prueba ...
Sanchises
1
qchu.wordpress.com/2009/07/02/… aquí tienes
mudkip201
-1

NARS APL, 340 bytes

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

prueba

      :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 
RosLuP
fuente