Triangoli quadrati


23

Un numero intero positivo x è un numero di triangolo quadrato se ci sono due diversi numeri interi positivi, y e z , che sono più piccoli di x in modo tale che tutte le somme

x + y

x + z

y + z

sono quadrati perfetti.

Ad esempio 30 è un numero di triangolo quadrato perché

30 + 6 = 6 2

30 + 19 = 7 2

6 + 19 = 5 2


Il tuo compito è quello di scrivere del codice che accetta un numero intero positivo come input e determina se si tratta o meno di un numero di triangolo quadrato. Dovresti generare uno di due valori distinti, uno se l'input è un numero di triangolo quadrato e l'altro in caso contrario.

Si tratta di quindi le risposte verranno classificate in byte con un numero inferiore di byte migliori.

Casi test

Ecco tutti i numeri dei triangoli quadrati inferiori a 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
Questo è OEIS A242445 .
Mr. Xcoder,

@ Mr.Xcoder Grazie! Probabilmente avrei dovuto verificare prima l'OEIS. Lo aggiungerò al corpo per renderlo più ricercabile.
Wheat Wizard

Per chiarire, "... sse esistono due differenti numeri interi positivi, yez, che non raggiungono x ..." significa che y < xe z < xo che y+z < x?
J. Sallé

2
@ J.Sallé The ex
Wheat Wizard

Qui sono assenti i casi di test con input e output
RosLuP

Risposte:



7

Gelatina , 12 byte

R²_fṖŒcS€Æ²Ẹ

Provalo online!

Come funziona

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

Python 2 , 93 87 86 byte

-1 byte grazie 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)]

Provalo online!


7

Brachylog , 19 byte

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

Provalo online!

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

Spiegazione

~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

Provalo online! oppure Verifica alcuni casi di test

Accetta input $x. Stabilisce un filter(qui equivalente a una funzione) su due input $a,$b, che restituisce un valore booleano vero se il [math]::sqrtdi $a+$bè -equal al Floordi quella radice quadrata (cioè è una radice quadrata intera).

Il resto è la carne del programma. Doppio per loop up da 1a $x-1. Ogni iterazione, si controlla se $yè -not equal a $_(cioè, $ z), e se la funzione è vero per tutte le combinazioni di $x, $ye$_ . Se lo è, $oviene incrementato di uno (il che lo rende diverso da zero).

Alla fine, alla fine, raddoppiamo il booleano negando $o, che si trasforma 0in Falsee diverso da zero in True. Rimane in cantiere e l'output è implicito.


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

Provalo online!

Probabilmente potrebbe essere migliorato se qualcuno conosce un modo più breve per verificare se un numero è quadrato. Sono abbastanza sicuro che usare sqrtfinisce per essere più lungo perchéfloor trasforma il risultato in un tipo integrale, quindi è necessario inserirlo fromIntegralda qualche parte prima di poterlo confrontare con l'originale.

EDIT: Grazie alla procedura guidata @Wheat per il decollo di 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>


Sembra che tu mi abbia fatto ninja di 2 minuti. :) Le nostre risposte sono molto vicine, quindi devo eliminare la mia?
Arnauld,

@Arnauld No, sono sicuro che sei arrivato alla tua soluzione in modo indipendente.
Neil,

4

05AB1E , 18 byte

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

Provalo online!

Grazie a Emigna per  -3  -1 byte e una correzione !


Non hai bisogno dei 2 come entrambi ne Ovettorializzati. Anche questo non funziona poiché gli ultimi 2 byte restituiranno true per qualsiasi elenco con almeno 1 valore, anche se contiene solo valori falsi. Questo può essere risolto (e abbreviato) usando Zinvece.
Emigna,

@Emigna Grazie! (BTW ho avuto bisogno €Oe questo è il motivo per cui l'approccio precedente ha fatto il lavoro con )
Mr. Xcoder

Non ha funzionato però. Controlla, ad esempio 45, che dovrebbe restituire false.
Emigna,

Ehm, ok. Comunque, aggiornato ora. Grazie
Mr. Xcoder il

@ Franchising risolto. Grazie
Mr. Xcoder il

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

Provalo online!

calcola tutti i valori di y,zcon y<-(z=s-x)[z>0&z<x], quindi calcola tutte le loro somme con outer(y,y,"+"). Ciò produce una matrice quadrata in cui le voci fuori diagonale sono potenzialmente quadrate, come y==zsolo se si trovano sulla diagonale. Quindi, diag(S)=0imposta le diagonali su zero, che non sono quadrati perfetti, e testiamo per vedere se l' anyelemento di 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).

Provalo 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) è la regola che accetta un numero intero come parametro e genera se si tratta di un numero di triangolo quadrato (vero / falso).


2

JavaScript (ES7), 72 byte

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

dimostrazione


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

Restituisce 0se il numero è un triangolo quadrato, 1altrimenti.

Provalo online!


Sto indovinando che return(int)sqrt(n)==sqrt(n)viene analizzato return((int)sqrt(n))==sqrt(n)rispetto al più ovvio return(int)(sqrt(n)==sqrt(n))? In caso contrario, puoi spiegare cosa psta facendo?
MD XF,

@MDXF Il cast di tipo ha una precedenza maggiore rispetto a ==, quindi l'espressione viene analizzata ((int)sqrt(n))==sqrt(n)come hai indovinato.
Steadybox


2

Gelatina , 15 byte

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

Provalo online!

Come?

ṖŒc; € ŒcS € ƲẠƊ € Ẹ || Programma completo.
                ||
Ṗ || Gamma spuntata. Resa [1, N) ∩ ℤ.
 ||c || Coppie (combinazioni di due elementi).
   ; € || Aggiungi N a ciascuno.
            Ɗ € || Per ciascuno degli elenchi, controlla se:
           Ạ || ... Tutti ...
       S € || ... Le somme di ciascuno dei loro ...
     ||c || ... coppie disgiunte
         Ʋ || ... sono quadrati perfetti.
              Ẹ || Verifica se esiste un valore che soddisfi quanto sopra.    



1

Julia 0.6 , 61 byte

Inizia a leggere dalla funzione all. Il primo argomento è una funzione anonima che verifica che la radice quadrata di un numero sia un numero intero, questo viene applicato a ciascun valore nel secondo argomento. Il singolo argomento anyè a Generatorcon due per i cicli, che per ogni iterazione contiene l'output della allfunzione.

Grazie a Mr Xcoder per -2 byte.

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

Provalo online!


1

Pyt , 63 byte

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

Verifica tutte le possibili combinazioni di y, z in modo tale che 1≤z <y <x

Restituisce 1 se x è un numero di triangolo quadrato, 0 altrimenti

Provalo online!


1

MATL , 20 19 18 byte

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

Provalo online! Restituisce 1 per falsey, 0 per truey.

Test fino a 500: provalo online! (usando Hinvece di G). Il tempo di esecuzione è quadratico nella dimensione di input, quindi l'enumerazione dei testcase da 1a nviene eseguito O(n^3), motivo per cui enumerando tutti i testcase fino a 1000 volte su TIO.

  • -1 byte e una congettura in meno grazie a @LuisMendo
  • -1 byte da un controllo più intelligente dell'intero.

Rimozione qgenera una sequenza con la sequenza desiderata come un sottoinsieme, ma senza il vincolo che ye zessere rigorosamente più piccolo x. Un esempio è 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 Grazie. Peccato, speravo in una risposta alla mia congettura, ma non posso semplicemente chiederlo a Math.SE senza mostrare alcuno sforzo per una prova ...
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

test

      :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 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.