Segitiga Persegi

23

Bilangan bulat positif x adalah bilangan segitiga persegi jika ada dua bilangan bulat positif yang berbeda, y dan z , yang lebih kecil dari x sehingga semua jumlah

x + y

x + z

y + z

adalah kotak yang sempurna.

Misalnya 30 adalah angka segitiga persegi karena

30 + 6 = 6 2

30 + 19 = 7 2

6 + 19 = 5 2


Tugas Anda adalah menulis beberapa kode yang mengambil bilangan bulat positif sebagai input dan menentukan apakah itu angka segitiga persegi atau bukan. Anda harus menampilkan salah satu dari dua nilai yang berbeda, satu jika inputnya adalah angka segitiga persegi dan yang lainnya sebaliknya.

Ini adalah sehingga jawaban akan dicetak dalam byte dengan lebih sedikit byte yang lebih baik.

Testcases

Berikut adalah semua angka segitiga persegi di bawah 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

Wisaya Gandum
sumber
6
Ini adalah OEIS A242445 .
Tn. Xcoder
@ Mr.Xcoder Terima kasih! Saya mungkin harus memeriksa OEIS dulu. Saya akan menambahkan itu ke badan untuk membuatnya lebih mudah dicari.
Wheat Wizard
Untuk tujuan klarifikasi, "... jika ada dua bilangan bulat positif yang berbeda, y dan z, yang lebih kecil dari x ..." berarti itu y < xdan z < xatau itu y+z < x?
J. Sallé
2
@ J.Sallé Mantan
Wheat Wizard
Di sini test case dengan input dan output tidak ada
RosLuP

Jawaban:

7

Jelly , 12 byte

R²_fṖŒcS€Æ²Ẹ

Cobalah online!

Bagaimana itu bekerja

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

Python 2 , 93 87 86 byte

-1 byte terima kasih kepada 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)]

Cobalah online!

tongkat
sumber
7

Brachylog , 19 byte

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

Cobalah online!

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

Penjelasan

~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
Fatalisasi
sumber
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

Cobalah online! atau Verifikasi beberapa kasus uji

Mengambil input $x. Menetapkan filter(di sini setara dengan fungsi) pada dua input $a,$b, yang mengembalikan benar Boolean jika dan hanya jika [math]::sqrtdari $a+$badalah -equal dengan Flooritu akar kuadrat (yaitu, itu integer akar kuadrat).

Sisanya adalah daging program. Kami menggandakan untuk pengulangan dari 1ke $x-1. Setiap iterasi, kita cek apakah $yadalah -not equal ke $_(yaitu, $ z), dan apakah fungsi ini berlaku untuk semua kombinasi $x, $ydan $_. Jika memang,$o akan bertambah satu (yang membuatnya tidak nol).

Akhirnya, pada akhirnya, kita double-Boolean-negate $o, yang berubah 0menjadi Falsedan bukan nol menjadi True. Yang tersisa pada pipa dan output tersirat.

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

Cobalah online!

Mungkin bisa ditingkatkan jika seseorang tahu cara yang lebih pendek untuk menguji apakah angka itu kuadrat. Saya cukup yakin menggunakan sqrtakhirnya menjadi lebih lama karena floormengubah hasilnya menjadi tipe integral sehingga Anda perlu memasukkannya ke fromIntegralsuatu tempat sebelum Anda dapat membandingkannya dengan yang asli.

EDIT: Terima kasih @Wheat Wizard untuk melepas 6 byte!

pengguna1472751
sumber
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>

Neil
sumber
Sepertinya Anda sudah ninja saya 2 menit. :) Jawaban kami sangat dekat, jadi haruskah saya menghapus jawaban saya?
Arnauld
@Arnauld Tidak, saya yakin Anda sampai pada solusi Anda secara mandiri.
Neil
4

05AB1E , 18 byte

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

Cobalah online!

Terima kasih kepada Emigna untuk  -3  -1 byte dan perbaikan !

Tuan Xcoder
sumber
Anda tidak perlu 2 karena keduanya ndan Ovectorizes. Ini juga tidak berfungsi karena 2 byte terakhir akan mengembalikan true untuk daftar apa pun dengan setidaknya 1 nilai, meskipun hanya berisi nilai-nilai palsu. Ini dapat diperbaiki (dan disingkat) dengan menggunakan Zsebagai gantinya.
Emigna
@Emigna Terima kasih! (BTW saya lakukan kebutuhan €Odan itulah mengapa pendekatan sebelumnya melakukan pekerjaan dengan )
Mr. Xcoder
Tapi itu tidak berhasil. Periksa misalnya 45, yang seharusnya mengembalikan false.
Emigna
Um huh, baiklah. Pokoknya, perbarui sekarang. Terima kasih
Tn. Xcoder
@Sanchises Diperbaiki. Terima kasih
Tn. Xcoder
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)}

Cobalah online!

menghitung semua nilai y,zdengan y<-(z=s-x)[z>0&z<x], lalu menghitung semua jumlah mereka dengan outer(y,y,"+"). Ini menghasilkan matriks persegi di mana entri off-diagonal berpotensi kuadrat, y==zhanya jika mereka berada di diagonal. Oleh karena itu, diag(S)=0tetapkan diagonal ke nol, yang bukan kuadrat sempurna, dan kami menguji untuk melihat apakah anyelemen dari Sadalah%in%s .

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

Cobalah 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) adalah aturan yang mengambil bilangan bulat sebagai parameter dan menampilkan apakah bilangan segitiga persegi (benar / salah).

mercator
sumber
2

JavaScript (ES7), 72 byte

Pengembalian 0atau 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

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

Mengembalikan 0jika jumlahnya segitiga persegi, 1jika tidak.

Cobalah online!

Steadybox
sumber
Saya menduga return(int)sqrt(n)==sqrt(n)sedang diurai return((int)sqrt(n))==sqrt(n)sebagai lawan yang lebih jelas return(int)(sqrt(n)==sqrt(n))? Jika tidak dapatkah Anda menjelaskan apa yang psedang dilakukan?
MD XF
@MDXF Type cast memiliki prioritas lebih tinggi daripada ==, jadi ekspresi diurai ((int)sqrt(n))==sqrt(n)seperti yang Anda duga.
Steadybox
2

Jelly , 15 byte

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

Cobalah online!

Bagaimana?

ṖŒc; € ŒcS € ƲẠƊ € Ẹ || Program lengkap.
                ||
Ṗ || Kisaran muncul. Hasil [1, N) ∩ ℤ.
 Œc || Pasangan (kombinasi dua elemen).
   ; € || Tambahkan N ke masing-masing.
            Ɗ € || Untuk masing-masing daftar, periksa apakah:
           Ạ || ... Semua ...
       S € || ... Jumlah masing-masing ...
     Œc || ... Pasangan yang terpisah
         Ʋ || ... Apakah kotak yang sempurna.
              Ẹ || Uji apakah ada nilai yang memenuhi hal di atas.    
Tuan Xcoder
sumber
1

Bersih , 95 88 86 byte

import StdEnv
@x#l=[1..x-1]
=or[all(\n=or[i^2==n\\i<-l])[x+y,y+z,z+x]\\y<-l,z<-l|y<>z]

Cobalah online!

Suram
sumber
1

Ruby , 73 byte

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

Cobalah online!

GB
sumber
1

Julia 0,6 , 61 byte

Mulai membaca dari fungsi all. Argumen pertama adalah fungsi anonim yang memeriksa bahwa akar kuadrat dari angka adalah bilangan bulat, ini diterapkan untuk setiap nilai dalam argumen kedua. Argumen tunggal anyadalah dengan Generatordengan dua untuk loop, yang untuk setiap iterasi berisi output dari allfungsi.

Terima kasih kepada Tuan Xcoder untuk -2 byte.

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

Cobalah online!

gggg
sumber
1

Pyt , 63 byte

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

Tes semua kemungkinan kombinasi y, z sedemikian sehingga 1≤z <y <x

Mengembalikan 1 jika x adalah angka segitiga persegi, 0 sebaliknya

Cobalah online!

mudkip201
sumber
1

MATL , 20 19 18 byte

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

Cobalah online! Mengembalikan 1 untuk falsey, 0 untuk truey.

Testcases hingga 500: Cobalah online! (menggunakan Hbukan G). Runtime adalah kuadrat dalam ukuran input, sehingga menghitung testcases dari 1untuk nberjalan O(n^3), itulah sebabnya mengapa menghitung semua testcases hingga 1000 kali keluar pada TIO.

  • -1 byte dan dugaan kurang berkat @LuisMendo
  • -1 byte dengan pemeriksaan integer-ness yang lebih pintar.

Menghapus qmenghasilkan urutan dengan urutan yang diinginkan sebagai bagian, tetapi tanpa kendala itu ydan zmenjadi lebih kecil dari x. Contohnya adalah 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
sumber
@LuisMendo Terima kasih. Sayang sekali, saya berharap jawaban atas dugaan saya, tetapi saya tidak bisa menanyakannya di Math.SE tanpa menunjukkan upaya untuk membuktikan ...
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

uji

      :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
sumber