Kare Üçgenler


23

Olumlu bir tamsayı x , y ve z olmak üzere, x toplamından daha küçük olan iki farklı pozitif tamsayı varsa, kare bir üçgen sayıdır.

x + y

x + z

y + z

mükemmel kareler.

Örneğin 30 bir kare üçgen numarasıdır çünkü

30 + 6 = 6 2

30 + 19 = 7 2

6 + 19 = 5 2


Göreviniz girdi olarak pozitif bir tamsayı alan bazı kodlar yazmak ve bunun kare bir üçgen sayı olup olmadığını belirliyor. Girdi bir kare üçgen numarasıysa, diğeri ise iki ayrı değerden birini vermelisiniz.

Bu bu nedenle cevaplar daha az byte'ın daha iyi olmasıyla byte olarak puanlanacaktır.

testcases

İşte 1000'in altındaki tüm kare üçgen sayıları

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



@ Mr.Xcoder Teşekkürler! Muhtemelen ilk önce OEIS'i kontrol etmeliydim. Bunu daha aranabilir yapmak için vücuda ekleyeceğim.
Buğday Sihirbazı

Açıklama amaçlı için "... iki farklı pozitif tamsayılar, y ve z var IFF ... x daha küçüktür ki" araçlarının y < xve z < xya o y+z < x?
J. Sallé

2
@ J.Sallé Eski
Buğday Sihirbazı,

Burada giriş ve çıkış ile test durumu yoktur
RosLuP

Yanıtlar:



7

Jöle , 12 bayt

R²_fṖŒcS€Æ²Ẹ

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

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

Çevrimiçi deneyin!

Ayrıca 19 bayt: ~hṪ>₁ℕ₁ᵐ≜{⊇Ċ+}ᶠ~^₂ᵐ

açıklama

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

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

Çevrimiçi deneyin! veya Bazı test durumlarını doğrulayın

Girdi alır $x. Bir oluşturur filteriki girdilere (bir işleve burada eşdeğeri) $a,$bIFF bir Boole true döndürür [math]::sqrtait $a+$bolduğunu -eqiçin ual Flooro kare kökünün (yani, bir tamsayı karekök var).

Bunun geri kalanı programın etidir. Biz çift-için döngü yukarıya 1kadar $x-1. Her yineleme, biz kontrol $yolduğunu -not equal için $_(yani $ z) ve fonksiyon tüm kombinasyonları için gerçek olup olmadığı $x, $yve $_. Öyleyse, $obir artırılır (sıfır olmayan yapar).

Son olarak, sonunda biz çift-Boole-olumsuzlamak $o, dönüşler 0içine Falseve sıfırdan içine True. Bu, boru hattında bırakılan ve çıktının kapalı olduğu.


4

Haskell , 75 69 bayt

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

Çevrimiçi deneyin!

Birisi kare olup olmadığını sınamak için daha kısa bir yol varsa, muhtemelen geliştirilebilir. sqrtSonları daha uzun kullanmaya floorbaşladığımdan eminim, çünkü sonucu bir integral türüne dönüştürür, böylece fromIntegralorijinaliyle karşılaştırmadan önce bir yere koymanız gerekir .

EDIT: 6 bayt ayırdığınız için teşekkürler @Wheat Wizard!


4

JavaScript (ES7), 75 71 bayt

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>


Görünüşe göre 2 dakikalığına beni ninja ediyor. :) Cevaplarımız çok yakın, benimkini mi sileyim?
Arnauld

@Arnauld Hayır, çözümünüze bağımsız olarak ulaştığınızdan eminim.
Neil

4

05AB1E , 18 bayt

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

Çevrimiçi deneyin!

 -3  -1 bayt ve bir düzeltme için Emigna için teşekkürler !


İkisinin de olduğu gibi ikisine de ihtiyacınız yok nve Ovektörler. Bu aynı zamanda, son 2 bayt, yalnızca yanlış değerler içeriyor olsa bile, en az 1 değeri olan herhangi bir liste için doğru olarak döneceğinden çalışmaz. Bunun yerine bu düzeltilebilir (ve kısaltılabilir) Z.
Emigna

@Emigna Teşekkürler! (BTW ihtiyacını yaptım €Ove önceki yaklaşım yüzden çalışma yaptı birlikte )
Sayın Xcoder

Yine de işe yaramadı. Örneğin 45yanlış dönmesi gerektiğini kontrol et .
Emigna

Hım, tamam. Neyse, şimdi güncellendi. Teşekkürler
Bay Xcoder

@Sanchises Sabit. Teşekkürler
Bay Xcoder

3

R , 79 bayt

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

Çevrimiçi deneyin!

bütün değerlerini hesaplar y,zile y<-(z=s-x)[z>0&z<x], daha sonra tüm toplamları hesaplar outer(y,y,"+"). Bu, diyagonal olmayan girişlerin, y==zyalnızca köşegen üzerindeymiş gibi potansiyel olarak kareler olduğu bir kare matris verir . Dolayısıyla, diag(S)=0mükemmel kareler değildir sıfıra köşegenleri, ayarlar ve biz olmadığını test anyunsuru Solduğunu %in%s.


3

SWI-Prolog , 88 bayt

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

Çevrimiçi deneyin!

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) parametre olarak bir tamsayı alan ve bir kare üçgen numarası olup olmadığına (true / false) verilen kuraldır.


2

JavaScript (ES7), 72 bayt

0Veya döndürür 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)

gösteri


2

C, 113 bayt

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

İade 0numarası, kare üçgen ise 1aksi.

Çevrimiçi deneyin!


Sanırım daha belirgin olarak return(int)sqrt(n)==sqrt(n)ayrıştırılıyor ? Değilse ne yaptığını açıklayabilir misin ? return((int)sqrt(n))==sqrt(n)return(int)(sqrt(n)==sqrt(n))p
MD XF

@ MDXF Type cast öncekinden daha yüksek önceliğe sahiptir ==, bu nedenle ifade ((int)sqrt(n))==sqrt(n)tahmin ettiğiniz gibi ayrıştırılır .
Steadybox


2

Jöle , 15 bayt

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

Çevrimiçi deneyin!

Nasıl?

Œc; € ŒcS € ƲẠƊ € Ẹ || Tam program
                ||
Ṗ || Attı aralığı. Verimler [1, N) ∩ ℤ.
 ||c || Çiftler (iki elemanlı kombinasyonlar).
   ; € || Her birine N ekleyin.
            Ɗ € || Listelerin her biri için şunları kontrol edin:
           Ạ || ... Herşey ...
       S € || ... her birinin toplamı ...
     ||c || ... Ayrık çiftleri
         Ʋ || ... mükemmel kareler var.
              Ẹ || Yukarıdakileri karşılayan herhangi bir değer olup olmadığını test edin.    



1

Julia 0.6 , 61 bayt

İşlevden okumaya başlayın all. İlk argüman, bir sayının karekökünün bir tamsayı olduğunu kontrol eden anonim bir işlevdir, bu ikinci argümandaki her değere uygulanır. Tek bağımsız değişken anya, Generatorher yineleme için çıktısını içerir döngüler için iki ileall işlevin .

Bay Xcoder'a -2 bayt için teşekkürler.

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

Çevrimiçi deneyin!


1

Pyt , 63 bayt

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

Tüm olası y, z kombinasyonlarını test eder, böylece 1≤z <y <x

Eğer x bir kare üçgen ise 1, aksi takdirde 0 döndürür

Çevrimiçi deneyin!


1

MATL , 20 19 18 bayt

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

Çevrimiçi deneyin!Falsey için 1, truthy için 0 döndürür.

500'e kadar test testleri: Çevrimiçi deneyin! ( Hyerine kullanarak G). Süre böylece gelen testcases numaralandırma, giriş boyutunda kuadratik olduğu 1için nde ishal O(n^3)neden TIO üzerinde 1000 kere bütün testcases kadar numaralandırılıyor, hangi.

  • @LuisMendo sayesinde -1 bayt ve daha az tahmin
  • -1 bayt daha akıllı bir tamsayı denetimi tarafından.

Çıkarma q, bir alt küme olarak istenen diziye sahip bir diziyi oluşturur, ancak kısıtlama olmaksızın yve zkesinlikle daha küçüktür x. Bir örnek olarak 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 Teşekkürler. Çok kötü, varsayımıma cevap vermeyi umuyordum, ancak bir kanıt için çaba göstermeden sadece Math.SE'den soramam ...
Sanchises


-1

APL NARS, 340 bayt

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

Ölçek

      :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 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.