Quadratische Dreiecke


23

Eine positive ganze Zahl x ist eine quadratische Dreieckzahl, wenn es zwei verschiedene positive ganze Zahlen gibt, y und z , die kleiner als x sind, so dass alle Summen

x + y

x + z

y + z

sind perfekte Quadrate.

Zum Beispiel ist 30 eine quadratische Dreieckszahl, weil

30 + 6 = 6 2

30 + 19 = 7 2

6 + 19 = 5 2


Ihre Aufgabe ist es, Code zu schreiben, der eine positive Ganzzahl als Eingabe verwendet und feststellt, ob es sich um eine quadratische Dreieckszahl handelt oder nicht. Sie sollten einen von zwei unterschiedlichen Werten ausgeben, einen, wenn die Eingabe eine quadratische Dreieckszahl ist, und einen anderen.

Dies ist daher werden die Antworten in Bytes bewertet, wobei weniger Bytes besser sind.

Testfälle

Hier sind alle quadratischen Dreieckszahlen unter 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
Dies ist OEIS A242445 .
Mr. Xcoder

@ Mr.Xcoder Danke! Ich hätte wahrscheinlich zuerst das OEIS überprüfen sollen. Ich werde das dem Body hinzufügen, um es durchsuchbarer zu machen.
Weizen-Zauberer

Zur Verdeutlichung bedeutet "... wenn es zwei verschiedene positive ganze Zahlen gibt, y und z, die kleiner als x sind ..." das y < xund z < xoder das y+z < x?
J. Sallé

2
@ J.Sallé Der ehemalige
Weizen-Assistent

Hier fehlen Testfälle mit Input und Output
RosLuP

Antworten:



7

Gelee , 12 Bytes

R²_fṖŒcS€Æ²Ẹ

Probieren Sie es online!

Wie es funktioniert

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 Bytes

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

Probieren Sie es online!

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

Erläuterung

~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

Probieren Sie es online! oder Überprüfen Sie einige Testfälle

Übernimmt die Eingabe $x. Richtet filteran zwei Eingängen eine (hier einer Funktion äquivalent) ein $a,$b, die einen booleschen Wert true zurückgibt, wenn das [math]::sqrtvon mit der Quadratwurzel dieser Quadratwurzel identisch $a+$bist (dh es ist eine ganzzahlige Quadratwurzel).-eqFloor

Der Rest ist das Fleisch des Programms. Wir verdoppeln für eine Schleife von 1bis $x-1. Jede Iteration, prüfen wir , ob $yist -not equal zu $_(dh $ z), und ob die Funktion gilt für alle Kombinationen von $x, $yund $_. Wenn dies der Fall ist, $owird es um eins inkrementiert (wodurch es nicht null wird).

Schließlich verdoppeln wir am Ende die Boolesche Negation $o, die sich 0in eine FalseNicht-Null -Negation verwandelt True. Das bleibt in der Pipeline und die Ausgabe ist implizit.


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

Probieren Sie es online!

Könnte wahrscheinlich verbessert werden, wenn jemand einen kürzeren Weg kennt, um zu testen, ob eine Zahl quadratisch ist. Ich bin mir ziemlich sicher, dass die Verwendung sqrtlänger dauert, da floordas Ergebnis zu einem ganzzahligen Typ wird, den Sie fromIntegralirgendwo einfügen müssen, bevor Sie mit dem Original vergleichen können.

EDIT: Danke @Wheat Wizard für das Abheben von 6 Bytes!


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>


Scheint, als hättest du mich um 2 Minuten erledigt. :) Unsere Antworten sind sehr nah, also soll ich meine löschen?
Arnauld

@Arnauld Nein, ich bin sicher, Sie sind unabhängig zu Ihrer Lösung gekommen.
Neil

4

05AB1E , 18 Bytes

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

Probieren Sie es online!

Danke an Emigna für  -3  -1 Byte und einen Fix !


Sie brauchen nicht die 2 als beide nund Ovektorisiert. Dies funktioniert auch nicht, da die letzten 2 Bytes für jede Liste mit mindestens 1 Wert true zurückgeben, auch wenn sie nur falsche Werte enthält. Dies kann durch Verwendung von behoben (und verkürzt) werden Z.
Emigna

@Emigna Danke! (BTW habe ich Notwendigkeit €Ound deshalb der bisherige Ansatz funktioniert mit )
Herrn Xcoder

Es hat aber nicht funktioniert. Überprüfen Sie zum Beispiel 45, dass false zurückgegeben werden soll.
Emigna

Ähm, ok. Wie auch immer, jetzt aktualisiert. Vielen Dank
Mr. Xcoder

@Sanchises behoben. Vielen Dank
Mr. 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)}

Probieren Sie es online!

berechnet alle Werte von y,zmit y<-(z=s-x)[z>0&z<x]und berechnet dann alle ihre Summen mit outer(y,y,"+"). Dies ergibt eine quadratische Matrix, in der Einträge außerhalb der Diagonale potenzielle Quadrate sind, so als y==zob sie sich auf der Diagonale befinden. Setzt daher diag(S)=0die Diagonalen auf Null, was keine perfekten Quadrate sind, und wir testen, ob das anyElement von Sist %in%s.


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

Probieren Sie es 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) ist die Regel, die eine Ganzzahl als Parameter verwendet und ausgibt, ob es sich um eine quadratische Dreieckszahl handelt (wahr / falsch).


2

JavaScript (ES7), 72 Byte

Rückgabe 0oder 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


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

Gibt zurück, 0ob die Zahl ein quadratisches Dreieck ist.1 andernfalls.

Probieren Sie es online!


Ich vermute, das return(int)sqrt(n)==sqrt(n)wird analysiert, return((int)sqrt(n))==sqrt(n)im Gegensatz zum Offensichtlichen return(int)(sqrt(n)==sqrt(n))? Wenn nicht, können Sie uns erklären, was pwir tun?
MD XF

@MDXF Typumwandlung hat eine höhere Priorität als ==, daher wird der Ausdruck so analysiert, ((int)sqrt(n))==sqrt(n)wie Sie es vermutet haben.
Steadybox


2

Gelee , 15 Bytes

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

Probieren Sie es online!

Wie?

ṖŒc; € ŒcS € Æ²Æ € Ẹ || Volles Programm.
                ||
Ṗ || Geknallte Reichweite. Ausbeuten [1, N) ∩ ∩.
 Œc || Paare (Zweielementkombinationen).
   ; € || Fügen Sie jeweils N hinzu.
            Ɗ € || Überprüfen Sie für jede der Listen, ob:
           Ạ || ... Alle ...
       S € || ... Die Summen von jedem ihrer ...
     Œc || ... disjunkte Paare
         Ʋ || ... sind perfekte Quadrate.
              Ẹ || Prüfen Sie, ob es einen Wert gibt, der den obigen Anforderungen entspricht.    



1

Julia 0,6 , 61 Bytes

Beginnen Sie mit dem Lesen der Funktion all . Das erste Argument ist eine anonyme Funktion, die überprüft, ob die Quadratwurzel einer Zahl eine Ganzzahl ist. Dies wird auf jeden Wert im zweiten Argument angewendet. Das einzige Argument für anyist a Generatormit zwei for-Schleifen, die für jede Iteration die Ausgabe der allFunktion enthalten.

Vielen Dank an Herrn Xcoder für -2 Bytes.

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

Probieren Sie es online!


1

Pyt , 63 Bytes

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

Prüft alle möglichen Kombinationen von y, z so, dass 1 ≤ z <y <x ist

Gibt 1 zurück, wenn x eine quadratische Dreieckszahl ist, andernfalls 0

Probieren Sie es online!


1

MATL , 20 19 18 Bytes

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

Probieren Sie es online! Gibt 1 für Falsey, 0 für Truthy zurück.

Testfälle bis zu 500: Probieren Sie es online! (mit Hanstelle von G). Runtime ist quadratisch in der Eingangsgröße, Aufzählen so die Testfälle von 1bis nläuft in O(n^3), weshalb alle Testfälle wird Aufzählen bis zu 1000 mal heraus TIO.

  • -1 Byte und eine Vermutung weniger dank @LuisMendo
  • -1 Byte durch eine geschicktere Überprüfung der Ganzzahligkeit.

Durch das Entfernen qwird eine Sequenz mit der gewünschten Sequenz als Teilmenge generiert, jedoch ohne die Einschränkung, dass yund zstreng kleiner als x. Ein Beispiel dafür ist 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 Danke. Schade, ich hatte auf eine Antwort auf meine Vermutung gehofft, aber ich kann nicht einfach bei Math.SE danach fragen, ohne einen Beweis zu
erbringen


-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

Prüfung

      :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 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.