Triangles carrés

23

Un entier positif x est un triangle carré ssi il y a deux entiers positifs différents, y et z , qui sont plus petits que x tels que toutes les sommes

x + y

x + z

y + z

sont des carrés parfaits.

Par exemple, 30 est un nombre de triangle carré car

30 + 6 = 6 2

30 + 19 = 7 2

6 + 19 = 5 2


Votre tâche consiste à écrire du code qui prend en entrée un entier positif et détermine s'il s'agit ou non d'un nombre triangulaire carré. Vous devez sortir l'une des deux valeurs distinctes, une si l'entrée est un nombre de triangle carré et l'autre sinon.

Il s'agit de donc les réponses seront notées en octets avec moins d'octets mieux.

Cas de test

Voici tous les nombres de triangles carrés inférieurs à 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

Assistant de blé
la source
6
Il s'agit d' OEIS A242445 .
M. Xcoder
@ Mr.Xcoder Merci! J'aurais probablement dû vérifier l'OEIS en premier. Je vais ajouter cela au corps pour le rendre plus consultable.
Wheat Wizard
À des fins de clarification, "... ssi il y a deux entiers positifs différents, y et z, qui sont plus petits que x ..." signifie cela y < xet z < xou cela y+z < x?
J. Sallé
2
@ J.Sallé The former
Wheat Wizard
Ici, le cas de test avec entrée et sortie est absent
RosLuP

Réponses:

7

Gelée , 12 octets

R²_fṖŒcS€Æ²Ẹ

Essayez-le en ligne!

Comment ça marche

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
la source
7

Brachylog , 19 octets

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

Essayez-le en ligne!

Aussi 19 octets: ~hṪ>₁ℕ₁ᵐ≜{⊇Ċ+}ᶠ~^₂ᵐ

Explication

~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
Fatalize
la source
4

PowerShell , 150 octets

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

Essayez-le en ligne! ou vérifier certains cas de test

Prend des informations $x. Établit un filter(ici équivalent à une fonction) sur deux entrées $a,$b, qui renvoie un vrai booléen si le [math]::sqrtde $a+$best -equal au Floorde cette racine carrée (c'est-à-dire, c'est une racine carrée entière).

Le reste est la viande du programme. Nous doublons la boucle de 1à $x-1. Chaque itération, nous vérifions si $yest -not equal à $_(c. -à- $ z), et si la fonction est vrai pour toutes les combinaisons de $x, $yet $_. Si c'est,$o est incrémenté de un (ce qui le rend non nul).

Enfin, à la fin, nous double-booléen-négation $o, qui se transforme 0en Falseet non nul en True. Cela reste sur le pipeline et la sortie est implicite.

AdmBorkBork
la source
4

Haskell , 75 69 octets

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

Essayez-le en ligne!

Pourrait probablement être amélioré si quelqu'un connaît un moyen plus court de tester si un nombre est carré. Je suis sûr que l'utilisation sqrtfinit par être plus longue, car elle floortransforme le résultat en un type intégral, vous devez donc mettrefromIntegral quelque part avant de pouvoir le comparer à l'original.

EDIT: Merci @Wheat Wizard pour avoir décollé 6 octets!

user1472751
la source
4

JavaScript (ES7), 75 71 octets

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
la source
On dirait que tu m'as ninja de 2 minutes. :) Nos réponses sont très proches, dois-je donc supprimer les miennes?
Arnauld
@Arnauld Non, je suis sûr que vous êtes arrivé à votre solution indépendamment.
Neil
4

05AB1E , 18 octets

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

Essayez-le en ligne!

Merci à Emigna pour  -3  -1 octet et un correctif !

M. Xcoder
la source
Vous n'avez pas besoin des 2 comme des deux net Ovectorise. Cela ne fonctionne pas non plus car les 2 derniers octets renverront true pour toute liste avec au moins 1 valeur, même si elle ne contient que de fausses valeurs. Cela peut être corrigé (et raccourci) en utilisant à la Zplace.
Emigna
@Emigna Merci! (BTW je l' ai besoin €Oet c'est pourquoi l'approche précédente a fait le travail avec )
M. Xcoder
Mais cela n'a pas fonctionné. Vérifiez par exemple 45, cela devrait retourner faux.
Emigna
Hum, ok. Quoi qu'il en soit, mis à jour maintenant. Merci
M. Xcoder
@Sanchises Fixed. Merci
M. Xcoder
3

R , 79 octets

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

Essayez-le en ligne!

calcule toutes les valeurs de y,zavec y<-(z=s-x)[z>0&z<x], puis calcule toutes leurs sommes avec outer(y,y,"+"). Cela donne une matrice carrée où les entrées hors diagonale sont potentiellement des carrés, comme y==zseulement si elles sont sur la diagonale. Par conséquent, diag(S)=0met les diagonales à zéro, qui ne sont pas des carrés parfaits, et nous testons pour voir si l' anyélément de Sest %in%s.

Giuseppe
la source
3

SWI-Prolog , 88 octets

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

Essayez-le en ligne!

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) est la règle qui prend un entier comme paramètre et affiche s'il s'agit d'un triangle carré (vrai / faux).

mercator
la source
2

JavaScript (ES7), 72 octets

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

Démo

Arnauld
la source
2

C, 113 octets

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

Renvoie 0si le nombre est un triangle carré, 1sinon.

Essayez-le en ligne!

Steadybox
la source
Je suppose que l'analyse return(int)sqrt(n)==sqrt(n)est analysée return((int)sqrt(n))==sqrt(n)par opposition à la plus évidente return(int)(sqrt(n)==sqrt(n))? Si non, pouvez-vous expliquer ce qui pse passe?
MD XF
La conversion de type @MDXF a une priorité plus élevée que ==, donc l'expression est analysée ((int)sqrt(n))==sqrt(n)comme vous l'avez deviné.
Steadybox
2

Gelée , 15 octets

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

Essayez-le en ligne!

Comment?

ṖŒc; € ŒcS € ƲẠƊ € Ẹ || Programme complet.
                ||
Ṗ || Gamme sautée. Rendements [1, N) ∩ ℤ.
 Œc || Paires (combinaisons à deux éléments).
   ; € || Ajoutez N à chacun.
            Ɗ € || Pour chacune des listes, vérifiez si:
           Ạ || ... Tout ...
       S € || ... Les sommes de chacun de leurs ...
     Œc || ... Paires disjointes
         Ʋ || ... Sont des carrés parfaits.
              Ẹ || Testez s'il existe une valeur qui satisfait à ce qui précède.    
M. Xcoder
la source
1

Rubis , 73 octets

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

Essayez-le en ligne!

GB
la source
1

Julia 0.6 , 61 octets

Commencez à lire à partir de la fonction all. Le premier argument est une fonction anonyme vérifiant que la racine carrée d'un nombre est un entier, ceci est appliqué à chaque valeur du deuxième argument. Le seul argument de anyest unGenerator avec deux boucles for, qui pour chaque itération contient la sortie de la allfonction.

Merci à M. Xcoder pour -2 octets.

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

Essayez-le en ligne!

gggg
la source
1

Pyt , 63 octets

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

Teste toutes les combinaisons possibles de y, z telles que 1≤z <y <x

Renvoie 1 si x est un triangle carré, 0 sinon

Essayez-le en ligne!

mudkip201
la source
1

MATL , 20 19 18 octets

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

Essayez-le en ligne! Renvoie 1 pour falsey, 0 pour véridique.

Testcases jusqu'à 500: essayez-le en ligne! (en utilisant Hau lieu de G). Le temps d'exécution est quadratique dans la taille d'entrée, donc l'énumération des cas de test de 1à ns'exécute O(n^3), c'est pourquoi l'énumération de tous les cas de test jusqu'à 1000 fois sur TIO.

  • -1 octet et une conjecture en moins grâce à @LuisMendo
  • -1 octet par une vérification plus intelligente de l'entier-ness.

La suppression qgénère une séquence avec la séquence souhaitée en tant que sous-ensemble, mais sans la contrainte qui yet zêtre strictement inférieure à x. Un exemple est 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
la source
@LuisMendo Merci. Dommage, j'espérais une réponse à ma conjecture, mais je ne peux pas simplement la demander à Math.SE sans montrer un peu d'effort pour une preuve ...
Sanchises
-1

APL NARS, 340 octets

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

tester

      :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
la source