Triângulos quadrados

23

Um número inteiro positivo x é um número de triângulo quadrado se houver dois números inteiros positivos diferentes, y e z , menores que x, de modo que todas as somas

x + y

x + z

y + z

são quadrados perfeitos.

Por exemplo 30 é um número de triângulo quadrado porque

30 + 6 = 6 2

30 + 19 = 7 2

6 + 19 = 5 2


Sua tarefa é escrever um código que use um número inteiro positivo como entrada e determine se é ou não um número de triângulo quadrado. Você deve gerar um de dois valores distintos, um se a entrada for um número de triângulo quadrado e o outro caso contrário.

Isso é então as respostas serão pontuadas em bytes, com menos bytes sendo melhores.

Casos de teste

Aqui estão todos os números de triângulos quadrados abaixo 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

Assistente de Trigo
fonte
6
Este é o OEIS A242445 .
Mr. Xcoder
@ Mr.Xcoder Obrigado! Eu provavelmente deveria ter verificado o OEIS primeiro. Vou acrescentar isso ao corpo para torná-lo mais pesquisável.
Assistente de trigo
Para fins de esclarecimento, "... se houver dois inteiros positivos diferentes, y e z, menores que x ..." significa isso y < xe z < xou aquilo y+z < x?
J. Sallé
2
@ J.Sallé O antigo
Assistente de trigo
Aqui caso de teste com entrada e saída estão ausentes
RosLuP

Respostas:

7

Gelatina , 12 bytes

R²_fṖŒcS€Æ²Ẹ

Experimente online!

Como 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
fonte
7

Python 2 , 93 87 86 bytes

-1 byte graças 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)]

Experimente online!

Cajado
fonte
7

Braquilog , 19 bytes

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

Experimente online!

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

Explicação

~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
fonte
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

Experimente online! ou Verifique alguns casos de teste

Recebe entrada $x. Estabelece um filter(aqui equivalente a uma função) em duas entradas $a,$b, que retorna um verdadeiro booleana sse o [math]::sqrtde $a+$bé -equal à Floorde que raiz quadrada (ou seja, é uma raiz quadrada inteiro).

O resto é a carne do programa. Dobramos o loop for de 1até $x-1. A cada iteração, verificamos se qual $yé -not equal $_(ou seja, $ z) e se a função é verdadeira para todas as combinações de $x, $ye $_. Se for, $oé incrementado por um (o que o torna diferente de zero).

Finalmente, no final, negamos o valor booleano $o, que se transforma 0em Falsee não em zero True. Isso é deixado no pipeline e a produção está implícita.

AdmBorkBork
fonte
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]]

Experimente online!

Provavelmente poderia ser melhorado se alguém souber uma maneira mais curta de testar se um número é quadrado. Tenho certeza de que o uso sqrtacaba sendo mais longo, porque floortransforma o resultado em um tipo integral, para que você precise colocar fromIntegralem algum lugar antes de poder comparar com o original.

EDIT: Obrigado @Wheat Wizard para tirar 6 bytes!

user1472751
fonte
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
fonte
Parece que você me matou por 2 minutos. :) Nossas respostas são muito próximas, então devo excluir as minhas?
Arnauld
@ Arnauld Não, tenho certeza que você chegou à sua solução de forma independente.
Neil
4

05AB1E , 18 bytes

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

Experimente online!

Graças a Emigna por  -3  -1 byte e uma correção !

Mr. Xcoder
fonte
Você não precisa dos 2 como ambos ne Ovetoriza. Isso também não funciona, pois os 2 bytes finais retornarão true para qualquer lista com pelo menos 1 valor, mesmo que contenha apenas valores falsos. Isso pode ser corrigido (e reduzido) usando-o Z.
Emigna
@Emigna Obrigado! (BTW eu fiz necessidade €Oe é por isso que a abordagem anterior fez um trabalho com )
Mr. Xcoder
Não deu certo. Verifique, por exemplo 45, que retorne false.
Emigna
Hum, ok. Enfim, atualizado agora. Obrigado
Sr. Xcoder
@Sanchises Fixed. Obrigado
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)}

Experimente online!

calcula todos os valores de y,zcom y<-(z=s-x)[z>0&z<x]e calcula todas as suas somas com outer(y,y,"+"). Isso gera uma matriz quadrada em que as entradas fora da diagonal são potencialmente quadrados, como y==zse estivessem na diagonal. Portanto, diag(S)=0define as diagonais como zero, que não são quadrados perfeitos, e testamos para ver se o anyelemento de Sé %in%s.

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

Experimente online!

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) é a regra que usa um número inteiro como parâmetro e gera se é um número de triângulo quadrado (verdadeiro / falso).

mercator
fonte
2

JavaScript (ES7), 72 bytes

Retorna 0ou 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)

Demo

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

Retorna 0se o número for triângulo quadrado, 1caso contrário.

Experimente online!

Steadybox
fonte
Eu estou supondo que o return(int)sqrt(n)==sqrt(n)está sendo analisado return((int)sqrt(n))==sqrt(n)em oposição ao mais óbvio return(int)(sqrt(n)==sqrt(n))? Se não, você pode explicar o que pestá fazendo?
MD XF
A conversão de tipo @MDXF tem precedência mais alta do que ==, portanto, a expressão é analisada ((int)sqrt(n))==sqrt(n)como você adivinhou.
Steadybox
2

Gelatina , 15 bytes

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

Experimente online!

Quão?

ṖŒc; € ŒcS € ² | € || Programa completo.
                ||
Ṗ || Intervalo estourado. Rende [1, N) ∩ ℤ.
 Œc || Pares (combinações de dois elementos).
   ; € || Acrescente N a cada um.
            | € || Para cada uma das listas, verifique se:
           Ạ || ... Todos ...
       S € || ... As somas de cada um de seus ...
     Œc || ... Pares disjuntos
         Ʋ || ... São quadrados perfeitos.
              Ẹ || Teste se existe algum valor que satisfaça o acima.    
Mr. Xcoder
fonte
1

Limpo , 95 88 86 bytes

import StdEnv
@x#l=[1..x-1]
=or[all(\n=or[i^2==n\\i<-l])[x+y,y+z,z+x]\\y<-l,z<-l|y<>z]

Experimente online!

Furioso
fonte
1

Ruby , 73 bytes

->n{(1...n).any?{|b|(1...b).any?{|c|[n+b,b+c,n+c].all?{|r|r**0.5%1==0}}}}

Experimente online!

GB
fonte
1

Julia 0,6 , 61 bytes

Comece a ler a partir da função all. O primeiro argumento é uma função anônima que verifica se a raiz quadrada de um número é um número inteiro; isso é aplicado a cada valor no segundo argumento. O argumento único para anyé a Generatorcom dois para loops, que para cada iteração contém a saída da allfunção.

Obrigado ao 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)

Experimente online!

gggg
fonte
1

Pyt , 63 bytes

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

Testa todas as combinações possíveis de y, z, de modo que 1≤z <y <x

Retorna 1 se x for um número de triângulo quadrado, 0 caso contrário

Experimente online!

mudkip201
fonte
1

MATL , 20 19 18 bytes

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

Experimente online! Retorna 1 para falsey, 0 para verdade.

Testes até 500: Experimente online! (usando em Hvez de G). O tempo de execução é quadrático no tamanho da entrada, portanto, enumera os casos de teste de 1para né executado O(n^3), e é por isso que enumerar todos os casos de teste com até 1000 vezes no TIO.

  • -1 byte e uma conjectura a menos graças a @LuisMendo
  • -1 byte por uma verificação mais inteligente do número inteiro.

Removendo qgera uma sequência com a sequência desejada como um subconjunto, mas sem a limitação de que ye zser estritamente menor do que x. Um exemplo é 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
fonte
@LuisMendo Thanks. Muito ruim, eu estava esperando por uma resposta à minha conjectura, mas eu não pode simplesmente pedir-lo em Math.SE sem mostrar algum esforço para uma prova ...
Sanchises
1
qchu.wordpress.com/2009/07/02/... aqui vai
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

teste

      :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
fonte