Kwadratowe Trójkąty

23

Dodatnia liczba całkowita x jest kwadratowym numerem trójkąta iff istnieją dwie różne dodatnie liczby całkowite, y i z , które są mniejsze niż x, tak że wszystkie sumy

x + y

x + z

y + z

są idealne kwadraty.

Na przykład 30 to kwadratowy numer trójkąta, ponieważ

30 + 6 = 6 2

30 + 19 = 7 2

6 + 19 = 5 2


Twoim zadaniem jest napisanie kodu, który przyjmuje dodatnią liczbę całkowitą jako dane wejściowe i określa, czy jest to kwadratowy numer trójkąta. Powinieneś wypisać jedną z dwóch różnych wartości, jedną, jeśli wejście jest kwadratowym numerem trójkąta, a drugą w przeciwnym razie.

To jest więc odpowiedzi będą liczone w bajtach, przy czym mniej bajtów będzie lepszych.

Przypadki testowe

Oto wszystkie liczby kwadratowych trójkątów poniżej 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

Kreator pszenicy
źródło
6
To jest OEIS A242445 .
Pan Xcoder,
@ Mr.Xcoder Thanks! Prawdopodobnie powinienem najpierw sprawdzić OEIS. Dodam to do ciała, aby ułatwić wyszukiwanie.
Wheat Wizard
Dla celów wyjaśnienia „... iff istnieją dwie różne liczby całkowite dodatnie, y i z, które są mniejsze niż x ...” oznacza to y < xi z < xtamto y+z < x?
J. Sallé,
2
@ J.Sallé Były
Wheat Wizard
Tutaj nie ma przypadku testowego z
danymi

Odpowiedzi:

7

Galaretka , 12 bajtów

R²_fṖŒcS€Æ²Ẹ

Wypróbuj online!

Jak to działa

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
źródło
7

Python 2 , 93 87 86 bajtów

-1 bajt dzięki Dennisowi

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

Wypróbuj online!

Pręt
źródło
7

Brachylog , 19 bajtów

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

Wypróbuj online!

Również 19 bajtów: ~hṪ>₁ℕ₁ᵐ≜{⊇Ċ+}ᶠ~^₂ᵐ

Wyjaśnienie

~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
Fatalizować
źródło
4

PowerShell , 150 bajtów

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

Wypróbuj online! lub Zweryfikuj niektóre przypadki testowe

Pobiera dane wejściowe $x. Ustanawia filter(tutaj odpowiednik funkcji) na dwóch wejściach $a,$b, która zwraca wartość logiczną prawda IFF [math]::sqrto $a+$bto -eqseksualnego do Floortego pierwiastka (to znaczy, że jest to liczba całkowita pierwiastek kwadratowy).

Reszta to mięso programu. Podwoimy liczbę pętli od 1do $x-1. W każdej iteracji sprawdzamy, czy $yjest -not eQual do $_(tj. $ Z) i czy funkcja jest prawdziwa dla wszystkich kombinacji $x, $yi $_. Jeśli to jest,$o jest zwiększany o jeden (co powoduje, że jest niezerowy).

Na koniec podwoimy Boolean-negate $o, który zamienia się 0w Falsei niezerowy w True. Pozostaje to w potoku, a dane wyjściowe są niejawne.

AdmBorkBork
źródło
4

Haskell , 75 69 bajtów

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

Wypróbuj online!

Prawdopodobnie można to poprawić, jeśli ktoś zna krótszy sposób sprawdzenia, czy liczba jest kwadratowa. Jestem pewien, że używanie sqrtkończy się dłużej, ponieważ floorzamienia wynik w typ integralny, więc musisz go umieścićfromIntegral gdzieś zanim będziesz mógł porównać z oryginałem.

EDYCJA: Dzięki @Wheat Wizard za zdjęcie 6 bajtów!

użytkownik1472751
źródło
4

JavaScript (ES7), 75 71 bajtów

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
źródło
Wygląda na to, że ninja mnie o 2 minuty. :) Nasze odpowiedzi są bardzo blisko, więc czy mam usunąć moje?
Arnauld
@Arnauld Nie, jestem pewien, że samodzielnie dotarłeś do swojego rozwiązania.
Neil
4

05AB1E , 18 bajtów

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

Wypróbuj online!

Dzięki Emigna za  -3  -1 bajtów i poprawkę !

Pan Xcoder
źródło
Nie potrzebujesz 2 jako obu ni Owektoryzacji. To również nie działa, ponieważ ostatnie 2 bajty zwrócą wartość true dla dowolnej listy o co najmniej 1 wartości, nawet jeśli zawierają tylko wartości fałszywe. Można to naprawić (i skrócić), używając Zzamiast tego.
Emigna,
@Emigna Dziękujemy! (BTW zrobiłem potrzebę €Oi dlatego poprzedni podejście nie działa z )
Pan Xcoder
Ale to nie zadziałało. Sprawdź na przykład 45, czy to powinno zwrócić false.
Emigna
Ok, ok. W każdym razie zaktualizowane teraz. Dzięki
Pan Xcoder,
@ Sanchises Naprawiono. Dzięki
Pan Xcoder,
3

R , 79 bajtów

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

Wypróbuj online!

oblicza wszystkie wartości y,zz y<-(z=s-x)[z>0&z<x], a następnie oblicza wszystkie ich sumy z outer(y,y,"+"). Daje to macierz kwadratową, w której wejścia poza przekątną są potencjalnie kwadratami, tak y==zjakby były na przekątnej. Dlatego diag(S)=0ustawia przekątne na zero, które nie są idealnymi kwadratami, i sprawdzamy, czy anyelement Sjest %in%s.

Giuseppe
źródło
3

SWI-Prolog , 88 bajtów

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

Wypróbuj 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) jest regułą, która przyjmuje liczbę całkowitą jako parametr i wyświetla, czy jest to kwadratowy numer trójkąta (prawda / fałsz).

mercator
źródło
2

JavaScript (ES7), 72 bajty

Zwraca 0lub 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)

Próbny

Arnauld
źródło
2

C, 113 bajtów

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

Zwraca, 0jeśli liczba jest kwadratowym trójkątem, w 1przeciwnym razie.

Wypróbuj online!

Steadybox
źródło
Zgaduję, że return(int)sqrt(n)==sqrt(n)jest analizowany return((int)sqrt(n))==sqrt(n)w przeciwieństwie do bardziej oczywistych return(int)(sqrt(n)==sqrt(n))? Jeśli nie, możesz wyjaśnić, co psię dzieje?
MD XF,
@MDXF Rzutowanie typu ma wyższy priorytet niż ==, więc wyrażenie jest analizowane tak, ((int)sqrt(n))==sqrt(n)jak zgadłeś.
Steadybox
2

Galaretka , 15 bajtów

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

Wypróbuj online!

W jaki sposób?

;C; € Œ cS € ƲẠƊ € Ẹ || Pełny program
                ||
Ṗ || Wyskoczył zakres. Wydajności [1, N) ∩ ℤ.
 ||c || Pary (kombinacje dwuelementowe).
   ; € || Dołącz N do każdego.
            || EUR || Dla każdej z list sprawdź, czy:
           Ạ || ... Wszystko ...
       S € || ... Sumy każdego z ...
     ||c || ... Rozłączne pary
         Ʋ || ... są idealnymi kwadratami.
              Ẹ || Sprawdź, czy jest jakaś wartość, która spełnia powyższe wymagania.    
Pan Xcoder
źródło
1

Rubinowy , 73 bajty

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

Wypróbuj online!

GB
źródło
1

Julia 0.6 , 61 bajtów

Rozpocznij czytanie z funkcji all. Pierwszy argument jest anonimową funkcją sprawdzającą, czy pierwiastek kwadratowy z liczby jest liczbą całkowitą, jest to stosowane do każdej wartości w drugim argumencie. Pojedynczym argumentem anyjest a Generatorz dwoma pętlami for, które dla każdej iteracji zawierają dane wyjściowe allfunkcji.

Dzięki Mr Xcoder za -2 bajty.

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

Wypróbuj online!

gggg
źródło
1

Pyt , 63 bajty

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

Testuje wszystkie możliwe kombinacje y, z tak, że 1 ≤ z <y <x

Zwraca 1, jeśli x jest kwadratowym numerem trójkąta, w przeciwnym razie 0

Wypróbuj online!

mudkip201
źródło
1

MATL , 20 19 18 bajtów

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

Wypróbuj online! Zwraca 1 za falsey, 0 za prawda.

Testy do 500: wypróbuj online! (używając Hzamiast G). Środowisko wykonawcze jest kwadratowe pod względem wielkości wejściowej, dlatego wyliczanie zestawów testowych od 1do jest nuruchamiane O(n^3), dlatego też wyliczanie wszystkich zestawów testowych do 1000 razy w TIO.

  • -1 bajtów i mniej przypuszczeń dzięki @LuisMendo
  • -1 bajt dzięki bardziej sprytnemu sprawdzeniu liczby całkowitej.

Usuwanie qgeneruje sekwencję o pożądanej sekwencji jako podklasa, ale bez ograniczeń, że yi zściśle mniejszy od x. Przykładem jest 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
źródło
@LuisMendo Thanks. Szkoda, liczyłem na odpowiedź na moje przypuszczenie, ale nie mogę po prostu zapytać go w Math.SE bez okazania jakiegoś wysiłku na dowód ...
Sanchises,
1
qchu.wordpress.com/2009/07/02/… proszę bardzo
mudkip201
-1

APL NARS, 340 bajtów

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 
RosLuP
źródło