Jelaskan Teorema Pythagoras secara Visual


36

Penjelasan visual umum dari teorema Pythagoras adalah sebagai berikut:

3 kotak

Kotak dimaksudkan untuk mewakili kuadrat sisi panjang, dan bidang a + b = c , seperti teorema Pythagoras.

Bagian ini yang harus Anda tunjukkan.

Tugas Anda

  • Anda akan mendapatkan dua bilangan bulat sebagai input, yang dimaksudkan untuk mewakili sisi adan bsegitiga siku-siku (mis.3, 4 ).
  • Anda kemudian akan membuat kotak dari panjang a, bdan ckeluar dari #karakter. Contohnya di sini adalah 3:
###
###
###
  • Anda kemudian akan memformat ini menjadi persamaan matematika yang menjelaskan triplet Pythagoras tertentu:
             #####
      ####   #####
###   ####   #####
###   ####   #####
### + #### = #####
  • Perhatikan bagaimana tanda =dan +memiliki ruang di kedua sisi dan bagaimana semuanya ada di bagian bawah.
  • Anda tidak akan pernah mendapatkan nilai untuk adan bitu membuat cnon-integral.
  • Ini adalah sehingga kode terpendek dalam byte menang!

Uji Kasus

(Lebih banyak datang begitu saya punya waktu, ini sangat sulit dibuat dengan tangan)

3, 4
             #####
      ####   #####
###   ####   #####
###   ####   #####
### + #### = #####

6, 8
                    ##########
                    ##########
         ########   ##########
         ########   ##########
######   ########   ##########
######   ########   ##########
######   ########   ##########
######   ########   ##########
######   ########   ##########
###### + ######## = ##########

4, 3
             #####
####         #####
####   ###   #####
####   ###   #####
#### + ### = #####

5, 12
                       #############
        ############   #############
        ############   #############
        ############   #############
        ############   #############
        ############   #############
        ############   #############
        ############   #############
#####   ############   #############
#####   ############   #############
#####   ############   #############
#####   ############   #############
##### + ############ = #############

3
@ marka "Anda tidak akan pernah mendapatkan nilai untuk a dan b yang membuat c non-integral."
Maltysen

2
@RetoKoradi juga area kotak a+b=c
Maltysen

1
Jika a, bdan cdidefinisikan sebagai area kotak, maka contohnya salah.
Reto Koradi

2
Anda harus menambahkan test case yang bagus, seperti 5 + 12 = 13.
mbomb007

7
Catatan: ini bukan "penjelasan visual dari teorema Pythagoras". Ini adalah yang teorema Pythagoras. Awalnya dirumuskan persis seperti ini: geometris. Mereka bahkan tidak tahu tentang akar kuadrat, bahkan lebih menarik, Pythagoras sendiri tidak percaya pada keberadaan bilangan irasional. Ini berarti Pythagoras berpikir bahwa sqrt (2) dapat secara tepat diwakili oleh pembagian dua bilangan bulat terbatas. Teorema asli adalah apa yang sekarang kita sebut "representasi visual"
vsz

Jawaban:


17

Pyth, 35 32 31 30 byte

j_.ts.i.imm*d\#d+Qs.aQ"+="mk4d

Cobalah online.


Anda dapat menyimpan byte dengan menggunakan .iuntuk menambahkan baris kosong sebagai gantinya:j_.ts.i.imm*d\#d+Qs.aQ"+="mk4d
isaacg

12

CJam, 49 byte

" +   = "S/3/[q~_2$mh:H]_'#f*:a.*.\:+SH*f.e|zW%N*

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

" +   = "S/3/ e# Split at spaces, the into chunks of length 3.
              e# This pushes [["" "+" ""] ["" "=" ""]].
[             e#
  q~          e# Read and interpret all input from STDIN.
  _2$         e# Copy both integers.
  mh          e# Calculate the hypotenuse of the triangle with those catheti.
  :H          e# Save the result in H.
]             e# Collect catheti and hypotenuse in an array.
_'#f*         e# Copy and replace each length with a string of that many hashes.
:a            e# Wrap each string in an array.
.*            e# Vectorized repetition. Turns strings into square arrays.
.\            e# Interleave with the string of operators.
:+            e# Concatenate to form an array of strings.
SH*           e# Push a string of spaces of length H.
f.e|          e# Mapped vectorized logical OR; pads all strings with spaces to
              e# length H.
zW%           e# Zip and reverse; rotates the array.
N*            e# Join the strings, separating by linefeeds.

11

Python 2, 134 100 byte

a,b=input()
i=c=int(abs(a+b*1j))
while i:print"# "[i>a]*a," +"[i<2],"# "[i>b]*b," ="[i<2],"#"*c;i-=1

Cobalah online.

Program ini mengambil input sebagai bilangan bulat yang dipisahkan koma, menghitung hipotenus menggunakan bilangan kompleks Python, lalu loop dari nilai tersebut dengan menghitung dan mencetak setiap baris saat berjalan. Trik golf utama adalah menggunakan pengindeksan string sebagai pengganti conditional untuk memilih #/ +/= vs ruang.

Sunting: Versi pertama adalah korban dari beberapa rekayasa berlebihan yang serius - versi ini lebih sederhana dan lebih pendek.


Saya baru saja mendapatkan hal yang sama, setelah beberapa saat menyadari bahwa ini lebih singkat untuk hanya mengulangi "# "[i>a]*adaripada melakukannya untuk setiap variabel.
xnor

11

Julia, 121 114 112 byte

f(a,b)=for i=1:(c=isqrt(a^2+b^2)) g(x,t)=(i>c-x?"#":" ")^x*(i<c?"  ":t)" ";println(g(a," +")g(b," =")g(c,""))end

Tidak Disatukan:

function f(a,b)
    # Compute the hypotenuse length
    c = isqrt(a^2 + b^2)

    # Write the lines in a loop
    for i = 1:c
        # Make a function for constructing the blocks
        g(x,t) = (i <= c - x ? " " : "#")^x * (i < c ? "  " : t) " "

        println(g(a," +") g(b," =") g(c,""))
    end
end

Memperbaiki masalah dan menyimpan 2 byte berkat Glen O.


11

JavaScript ES6, 155 134 140 129 byte

(n,m)=>eval("for(o='',q=(b,s)=>' #'[z<b|0].repeat(b)+(z?'   ':s),z=i=Math.hypot(n,m);z--;)o+=q(n,' + ')+q(m,' = ')+q(i,'')+`\n`")

Saya sudah menulis ulang ini dengan for. Banyak golf masih ...

Jika ada yang tidak berhasil, beri tahu saya. Saya akan memperbaikinya di pagi hari.

Diuji di Safari Nightly

Tidak Disatukan:

(n,m)=>
   Array(
     z=Math.hypot(n,m)
   ).fill()
   .map((l,i)=>
      (q=(j,s)=>
        (z-i<=j?'#':' ')
        .repeat(j)+
         (z-i-1?' ':s)
      )
      (n,`+`)+
      q(m,`=`)+
      q(z,'')
   ).join`
   `

Penjelasan:

(Tidak diperbarui) tetapi masih cukup akurat.

(n,m)=> // Function with two arguments n,m
   Array( // Create array of length...
    z=Math.hypot(n,m) // Get sqrt(n^2+m^2) and store in z
   ).fill() // Fill array so we can loop
   .map((l,i) => // Loop z times, take l, and i (index)
     (q=j=>( // Create function q with argument j
      z-i<=j? // If z-i is less than or equal to j...
        '#' // Use '#'
      : // OR
        ' ' // Use space
      ).repeat(j) // Repeat the character j times
     )(n) // Run with n
   + // Add to string
   ` ${ // Space
      (b=z-i-1)? // If this isn't the last line...
       ' ' // Return ' '
      : // Otherwise
       '+' // Plus
    } ${ // Space
      q(m) // run function q with arg m
    } ${ // Space
      b? // If b
       ' ' // Return space
      : // Otherwise
        '=' // '='
    }` + // Add to...
    '#'.repeat(z) // Repeat hashtag, z times
  ).join` // Join the new array with new lines
  `

DEMO

Input versi ES5 harus merupakan kumpulan angka yang valid :

function _taggedTemplateLiteral(e,t){return Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var _templateObject=_taggedTemplateLiteral(["\n"],["\n"]),t=function(e,t){return Array(z=Math.sqrt(e*e+t*t)).fill().map(function(r,n){return(q=function(e,t){return(z-n<=e?"#":" ").repeat(e)+(z-n-1?" ":t)})(e,"+")+q(t,"=")+q(z,"")}).join(_templateObject)};
// Demo
document.getElementById('go').onclick=function(){
  document.getElementById('output').innerHTML = t(+document.getElementById('input').value,
                                                 +document.getElementById('input2').value)
};
<div style="padding-left:5px;padding-right:5px;"><h2 style="font-family:sans-serif">Visually Explaining the Pythagorean Theorem</h2><div><div  style="background-color:#EFEFEF;border-radius:4px;padding:10px;"><input placeholder="Number 1" style="resize:none;border:1px solid #DDD;" id="input"><input placeholder="Number 2" style="resize:none;border:1px solid #DDD;" id="input2"><button id='go'>Run!</button></div><br><div style="background-color:#EFEFEF;border-radius:4px;padding:10px;"><span style="font-family:sans-serif;">Output:</span><br><pre id="output" style="background-color:#DEDEDE;padding:1em;border-radius:2px;overflow-x:auto;"></pre></div></div></div>


2
+1, tapi ada masalah kecil seperti kata OP: "Perhatikan bagaimana tanda = dan + memiliki spasi di kedua sisi dan bagaimana semuanya ada di bagian bawah."
Léo Lam

1
Cuplikan tidak berfungsi di Firefox 40.0.3 (Windows 7x64 SP1).
Ismael Miguel

1
Cuplikan tidak berfungsi di Chromium 44 Linux x64
Nenotlep

2
@IsmaelMiguel Kasus-kasus terakhir tidak perlu ditangani dengan benar, meskipun: "Anda tidak akan pernah mendapatkan nilai untuk adan bitu membuat cnon-integral."
DLosc

2
+1 penggunaan bagus eval. Petunjuk: (z<b?'#':' ')->' #'[z<b|0]
edc65

7

Pyth, 51 49 byte

AQJs.aQLj*b]*b\#;j_MCm_.[d\ Jcj[yJb\=byHb\+byG))b

Mengharapkan input dalam formulir [3,4].

Coba di sini

AQ - memberikan input ke G, H

Js.a,GH - Menghitung sisi miring sebagai J

Lj*b]*b\#;- mendefinisikan y(b)sebagai membuat kuadrat ukuran b(di tempat lain dalam kode,b berarti baris baru)

j_MCm_.[d\ Jcj[yJb\=byHb\+byG))b - Membuat kotak, bantalan dengan spasi, dan transpos

Disimpan dua byte berkat Maltysen.


Saya tidak tahu persis apa yang kode Anda lakukan, tetapi saya cukup yakin itu bisa mendapat manfaat dari .interlace daripada semua daftar itu.
Maltysen

@Maltysen Untuk komentar terakhir Anda, sebenarnya saya tidak bisa, karena penampilan pertama Jadalah di dalam lambda, yang akan dievaluasi setelah J digunakan pertama kali.
Ypnypn

ah, tidak melihat itu. Hal lain: *]dapat diganti denganm
Maltysen

3

Ruby, 134

->a,b{c=((a**2+b**2)**0.5).round
c.times{|i|
d=i<c-1?'  ':'+='
puts (c-i>a ?' ':?#)*a+" #{d[0]}  #{(c-i>b ?' ':?#)*b} #{d[1]} "+?#*c}}

pendekatan garis demi garis sederhana.

Di bawah ini dalam program pengujian, dengan simbol berubah menjadi @ untuk membantu menghindari pengerasan dengan sintaksis #{....}("interpolasi string") yang digunakan untuk memasukkan ekspresi ke dalam string. Setiap input harus diberikan pada jalur yang berbeda.

f=->a,b{c=((a**2+b**2)**0.5).round
c.times{|i|
d=i<c-1?'  ':'+='
puts (c-i>a ?' ':?@)*a+" #{d[0]}  #{(c-i>b ?' ':?@)*b} #{d[1]} "+?@*c}}

A=gets.to_i
B=gets.to_i
f.call(A,B)

Saya tidak tahu Ruby, tapi saya kira ini bisa menjadi lebih pendek, karena solusi Ruby sering mengalahkan solusi Python (dalam pengalaman anekdotal saya). Sebagai permulaan, a*a+b*bharus memotong dua byte dari perhitungan c.
DLosc

3

C, 176 byte

C tidak akan memenangkan ini, tapi kesenangan itu sepadan.

#define A(x,y)for(j=x;j--;)putchar("# "[i+1>x]);printf(i?"   ":" "#y" ");
i;j;main(a,b,c){for(c=scanf("%d %d",&a,&b);a*a+b*b>c*c;c++);for(i=c;i--;puts("")){A(a,+)A(b,=)A(c,)}}

Cukup dicetak:

#define A(x,y)for(j=x;j--;)putchar("# "[i+1>x]);printf(i?"   ":" "#y" ");
i;j;
main(a,b,c)
{
    for(c=scanf("%d %d",&a,&b);a*a+b*b>c*c;c++);
    for(i=c;i--;puts(""))
    {
        A(a,+)
        A(b,=)
        A(c,)
    }
}

gcc memungkinkan kita untuk melewatkan parameter ketiga ke utama (array variabel lingkungan), jadi kita memanfaatkannya untuk menggunakannya untuk tujuan kita.

Itu

for(c=scanf("%d %d",&a,&b);a*a+b*b>c*c++;);

akan setara dengan

scanf("%d %d",&a,&b);
for(c=2;a*a+b*b>c*c++;);

karena scanfmengembalikan jumlah parameter yang berhasil dipindai.


2

PHP, 178 170 168 byte

Input adalah parameter GET xdan y. Sayangnya saya tidak bisa bermain-main dengan string yang berulang itu.

<?php for(@$i=$z=hypot($x=$_GET[x],$y=$_GET[y]),@$s=str_repeat;$i;$i--)@print$s($i<=$x?~Ü:~ß,$x).(($l=$i==1)?~ßÔß:~ßßß).$s($i<=$y?~Ü:~ß,$y).($l?~ßÂß:~ßßß).$s(~Ü,$z).~õ;
  • Disimpan 8 byte dengan membalik semua string saya dan menjatuhkan tanda kutip.
  • Disimpan 2 byte dengan mengganti kondisi $i>0dengan$i

Tidak yakin mengapa PHP tidak suka @echojadi saya harus mengorbankan 1 byte@print .

Jika SE mengacaukan penyandian, ini dimaksudkan untuk dikodekan dalam Windows-1252 (bukan UTF8).



Ah itu masuk akal. Terima kasih!
DankMemes

2

APL (Dyalog Extended) , 33 29 byte SBCS

-3 karena ekstensi Dyalog APL saya.

Lambda awalan anonim:

{⊖⍕,' +=',⍪{⍵ ⍵⍴⍕#}¨⍵,√+/⍵*2}

Cobalah online!

{... } "dfn"; adalah argumen (panjang sisi)

⍵*2 kotak

+/ jumlah

 akar pangkat dua

⍵, argumen pertama

{...  terapkan lambda anonim berikut untuk masing-masing

  # root namespace

   format sebagai teks

  ⍵ ⍵⍴ menggunakan argumen dua kali untuk r eshape ke dalam matriks dengan dimensi-dimensi.

 buat menjadi kolom

' ++=', tambahkan tiga karakter ini ke tiga baris

, ravel (gabungkan baris ke dalam daftar)

 format sebagai teks

 flip terbalik


1

CJam, 78 byte

q~_2f#~+mQ+ee_2=~e>f{\~@1$-S*\'#*+_'#e=\a*_0=,S*@"+= "=1$,(S*\+1$a\a@a+++~}zN*

Pertama menghitung hypotenuse (H), kemudian, untuk setiap sisi (S), itu membangun sebuah array dari garis S yang terbuat dari: H-Sspasi +S tanda hubung. Akhirnya, transposes matriks.

Demo


1

Lua5.2, 257 241 227 222 byte

r=io.read
a=r"*n"b=r"*n"c=math.sqrt(a^2+b^2)d=a+b
w=io.write
for i=1,c do
for j=0,d+c+5 do
w((j>d+5 or(i>c-b and j>a+2 and j<d+3)or(i>c-a and j<a))and"#"or(i==c and(j==a+1 and"+"or(j==d+4 and"="or" "))or" "))end
w"\n"end
  • Sunting1: Membaca sederhana
  • Sunting2: Menghapus lebih banyak spasi putih
  • Sunting3: alias abstraksi iofungsi yang terinspirasi oleh jawaban lain

1

Arang , 24 byte

⊞θ₂ΣXθ²F =+«←←←ι←G↑←↓⊟θ#

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil input sebagai array dari dua elemen. Penjelasan:

⊞θ₂ΣXθ²

Tambahkan sisi miring ke input.

F =+«

Ulangi karakter yang muncul di sebelah kanan setiap kotak dalam urutan terbalik.

←←←ι←

Cetak karakter itu ke kiri dengan spasi.

G↑←↓⊟θ#

Pop nomor terakhir dari array dan cetak kuadrat #s ukuran itu.


1
@KevinCruijssen Whoa, sungguh kekhilafan! Harus diperbaiki sekarang.
Neil

1

PowerShell , 139 137 135 byte

-2 Terima kasih untuk ASCII saja
-2 terima kasih kepada Mazzy

param($a,$b)($c=[math]::sqrt($a*$a+$b*$b))..1|%{(($m=" ","#")[$_-le$a]*$a)," +"[$_-eq1],($m[$_-le$b]*$b)," ="[$_-eq1],("#"*$c)-join" "}

Cobalah online!

Menghitung $ c sakit dan mungkin ada cara yang lebih baik untuk bertukar kondisional antara #dan . Buat daftar potongan dan gabungkan bersama-sama sambil menambahkan tanda-tanda.


1
ada tanda kurung yang berlebihan di $m=(" ","#"): Coba online!
mazzy

@mazzy Ha ha, whoops
Veskah

0

Japt, 28 byte

Mengambil input sebagai array bilangan bulat.

pUx²¬)ËÆDç'#
í"+="¬ûR3)c ·z3

Cobalah

                    :Implicit input of array U=[a,b]
pUx²¬)ËÆDç'#
p                   :Push
 U ²                :  Square each element in U
  x                 :  Reduce by addition
    ¬               :  Square root
     )              :End push
      Ë             :Map each D
       Æ            :  Map the range [0,D)
        Dç'#        :    Repeat "#" D times
í"+="¬ûR3)c ·z3
í                   :Interleave
 "+="¬              :  Split the string "+=" to an array of characters
      û             :  Centre pad each
       R3           :    With newlines to length 3
         )          :End interleave
          c         :Flatten
            ·       :Join with newlines
             z3     :Rotate clockwise 270 degrees

0

05AB1E , 38 byte

nOtª©Å10ζíε„ #yè®Rׄ= NĀèð.øý}»R„=+`.;

Mengambil input sebagai daftar dua angka (yaitu [3,4]).

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

n             # Take the square of each value in the (implicit) input-list
              #  i.e. [3,4] → [9,16]
 O            # Take the same of that list
              #  i.e. [9,16] → 25
  t           # Take the square-root of that sum
              #  i.e. 25 → 5.0
   ª          # Append it to the (implicit) input-list
              #  i.e. [3,4] and 5.0 → [3,4,5.0]
    ©         # Store it in the register (without popping)
Å1            # Change each value to an inner list of that amount of 1s
              #  i.e. [3,4,5.0] → [[1,1,1],[1,1,1,1],[1,1,1,1,1]]
  0ζ          # Zip/transpose; swapping rows/columns, with "0" as filler
              #  i.e. [[1,1,1],[1,1,1,1],[1,1,1,1,1]]
              #   → [[1,1,1],[1,1,1],[1,1,1],["0",1,1],["0","0",1]]
    í         # Reverse each inner list
              #  i.e. [[1,1,1],[1,1,1],[1,1,1],["0",1,1],["0","0",1]]
              #   → [[1,1,1],[1,1,1],[1,1,1],[1,1,"0"],[1,"0","0"]]
ε         }   # Map the inner lists to:
  #          #  Push string " #"
    yè        #  Index each inner list value into this string
              #   i.e. " #" and [1,1,"0"] → ["#","#"," "]
      ®R      #  Push the list from the register
        ×     #  Repeat the character that many times
              #   i.e. ["#","#"," "] and [5.0,4,3] → ["#####","####","   "]
 „=           #  Push string "= "
   NĀ         #  Push the map-index trutified (0 remains 0; everything else becomes 1)
              #   i.e. 0 → 0
              #   i.e. 3 → 1
     è        #  Use it to index into the string
              #   i.e. "= " and 0 → "="
              #   i.e. "= " and 1 → " "
      ð.ø     #  Surround it with spaces
              #   i.e. "=" → " = "
              #   i.e. " " → "   "
         ý    #  Join the map-list together with this string as delimiter
              #   i.e. ["#####","####","   "] and "   " → "#####   ####      "
»             # After the map, join everything by newlines
              #  i.e. ["##### = #### = ###","#####   ####   ###","#####   ####   ###","#####   ####      ","#####             "]
              #   → "##### = #### = ###\n#####   ####   ###\n#####   ####   ###\n#####   ####      \n#####             "
 R            # Reverse the string
              #  i.e. "##### = #### = ###\n#####   ####   ###\n#####   ####   ###\n#####   ####      \n#####             "
              #   → "             #####\n      ####   #####\n###   ####   #####\n###   ####   #####\n### = #### = #####"
  „=+`.;      # And replace the first "=" with "+"
              #  i.e. "             #####\n      ####   #####\n###   ####   #####\n###   ####   #####\n### = #### = #####"
              #   → "             #####\n      ####   #####\n###   ####   #####\n###   ####   #####\n### + #### = #####"
              # (and output the result implicitly)

DnOt©)˜ε'#×y.Dðy×®y-.D)R}ø»adalah usaha saya sampai saya perhatikan +dan =.
Guci Gurita Ajaib

@ MagicOctopusUrn Ya, ketiga ruang dan +dan =memang bertanggung jawab untuk sebagian besar kode. Btw, Anda dapat golf 2 byte dalam pendekatan Anda dengan mengganti DnOt©)˜dengan nOt©ª, seperti yang saya lakukan dalam jawaban saya saat ini. :) Saya suka Anda menggunakan .D, meskipun.
Kevin Cruijssen

0

Perl 6 , 99 byte

{$!=sqrt $^a²+$^b²;flip map({map {[' ','#'][$^d>$_]x$d,' =+ '.comb[!$_*++$ ]},$!,$b,$a},^$!)X"
"}

Cobalah online!

Blok kode anonim yang mengambil dua angka dan mengembalikan string penuh dengan baris baru terdepan dan tiga spasi terdepan serta satu mengekor di setiap baris.

Jika kita dapat menggunakan karakter lain bukan #, maka saya dapat menyimpan byte dengan mengganti '#'dengan \*.


0

C # (.NET Core) , 221 , 194 byte

Ini terasa terlalu lama. Versi ini hanya loop untuk membangun string.

EDIT: Ascii-Only dengan golf -27 byte yang bagus menggunakan konstruktor string untuk penambahan karakter serial! Juga, untuk menunjukkan saya menggunakan Math.Sqrt bukan System.Math.Sqrt. Ini sudah disesuaikan!

(a,b)=>{int c=(int)System.Math.Sqrt(a*a+b*b),j=c;var s="";while(j>0)s+=new string(j>a?' ':'#',a)+(j>1?"   ":" + ")+new string(j>b?' ':'#',b)+(j-->1?"   ":" = ")+new string('#',c)+"\n";return s;}

Cobalah online!


1
ingat tanda titik koma tidak diperlukan, dan juga System.Mathtidak Mathjika Anda tidak menggunakan interaktif
ASCII-only



Satu hal, saya akan menghapus semua menggunakan arahan untuk memastikan saya tidak membuat kesalahan
hanya ASCII

1
Oh dan karena Anda tidak lagi memiliki versi ternary, saya tidak berpikir Anda harus menyebutkannya lagi
ASCII-only
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.