Pisagor Teoremini Görsel Olarak Açıklayın


36

Pisagor teoreminin ortak görsel açıklaması şöyledir:

3 kutu

Kareler, yan uzunluktaki kareyi a + b = cve Pisagor teoreminin dediği gibi alanları temsil etmek içindir .

Bu kısım göstermen gereken şey.

Senin görevin

  • Yanları ave bdik bir üçgeni temsil etmek için giriş olarak iki tam sayı elde edersiniz (örn. 3, 4).
  • Daha sonra uzunluklarda dışına kareler yapacak a, bve cdışarı #karakteri. Örneğin burada 3:
###
###
###
  • Daha sonra bunları Pisagor'un üçlüsünü açıklayan bir matematik denklemine biçimlendireceksiniz:
             #####
      ####   #####
###   ####   #####
###   ####   #####
### + #### = #####
  • Uyarı nasıl =ve +işaretler her iki tarafta boşluk ve nasıl her şeyi alt üzerindedir.
  • Sen değerlerini asla ave bmakyaj o colmayan ayrılmaz.
  • Bu yani bayt cinsinden en kısa kod kazanır!

Test Kılıfları

(daha çok vaktim geldiğinde, bunları elle yapmak gerçekten zor)

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

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

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

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

3
@bmarks "Asla c'yi integral yapan a ve b için değerler elde edemezsiniz."
Maltysen

2
@RetoKoradi meydanların alanlarını iyia+b=c
Maltysen

1
Eğer a, bve ckareler alanlar olarak tanımlanır, daha sonra örnek yanlıştır.
Reto Koradi,

2
Başka bir güzel test durumu eklemelisiniz, 5 + 12 = 13 gibi.
mbomb007 01:15 '

7
Not: Bu "Pisagor teoreminin görsel bir açıklaması" değildir. Bu Pisagor teoremi. Başlangıçta tam olarak bu şekilde formüle edildi: geometrik olarak. Karekökleri bile bilmiyorlardı, daha da ilginç, Pisagor'un kendisi irrasyonel sayıların varlığına inanmıyordu. Bu, Pisagor'un sqrt'nin (2) tam olarak iki sonlu tamsayının bölünmesiyle temsil edilebileceğini düşündüğü anlamına gelir. Orijinal teorem, şimdi "görsel temsil" olarak
adlandırdığımız şeydir

Yanıtlar:


17

Pyth, 35 32 31 30 bayt

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

Çevrimiçi deneyin.


Bunun .iyerine boş satırları eklemek için bir bayt kaydedebilirsiniz :j_.ts.i.imm*d\#d+Qs.aQ"+="mk4d
isaacg

12

CJam, 49 bayt

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

CJam tercümanında çevrimiçi olarak deneyin .

Nasıl çalışır

" +   = "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 bayt

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

Çevrimiçi deneyin.

Program, virgülle ayrılmış tamsayılar olarak girdi alır, Python'un yerleşik karmaşık sayılarını kullanarak hipotenusu hesaplar, sonra giderken her satırı hesaplar ve yazdırır. Ana golf oyunu, #/ +/ =vs uzayı seçmek için koşul yerine dizgi indekslemesini kullanıyor .

Düzenleme: İlk versiyon ciddi bir aşırı mühendislik kurbanıydı - bu hem daha basit hem de daha kısa.


Aynı şeyi yeni öğrendim, "# "[i>a]*aher değişken için yapmak yerine sadece tekrar etmenin daha kısa olduğunu fark etmek biraz zaman aldı.
xnor

11

Julia, 121 114 112 bayt

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

Ungolfed:

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

Glen O sayesinde sorun düzeltildi ve 2 bayt kurtarıldı


11

JavaScript ES6, 155 134 140 129 bayt

(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`")

Bunu ile yeniden yazdım for. Bir sürü golf hala ...

Bir şey çalışmıyorsa, bana bildirin. Sabah düzelteceğim.

Safari Gecesi'nde test edildi

Ungolfed:

(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`
   `

Açıklama:

(Güncellenmedi) ancak yine de yeterince doğru.

(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

ES5 sürümü Giriş geçerli sayı kümeleri olmalıdır :

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, ancak OP'nin dediği gibi küçük bir sorun var: "= ve + işaretlerinin her iki tarafta da boşluk bıraktığını ve altta her şeyin nasıl olduğuna dikkat edin."
Léo Lam

1
Snippet, Firefox 40.0.3'te çalışmıyor (Windows 7x64 SP1).
Ismael Miguel,

1
Snippet Chromium 44 Linux'ta çalışmayan x64
Nenotlep

2
@IsmaelMiguel Bu son durumların doğru bir şekilde ele alınması gerekli değildir: “Asla değer alamazsınız ave bbu cbirleşik olmaz.”
DLosc

2
+1 değerlendirmenin iyi kullanımı. İpucu: (z<b?'#':' ')->' #'[z<b|0]
edc65

7

Pyth, 51 49 bayt

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

Formdaki girişi bekliyor [3,4].

Burada dene

AQ - girişi atar G, H

Js.a,GH - hipotenüsü olarak hesaplar J

Lj*b]*b\#;- y(b)bir büyüklük karesi yapmak olarak tanımlar b(kodun başka bir yerinde, bnewline anlamına gelir)

j_MCm_.[d\ Jcj[yJb\=byHb\+byG))b - Kareleri oluşturur, boşlukları doldurur ve transpoze eder

Maltysen sayesinde iki bayt kurtarıldı.


Kodunuzun tam olarak ne yaptığını bilmiyorum, ancak .itüm bu listeler yerine nterlace'den yararlanabileceğinden eminim .
Maltysen

@Maltysen Son yorumunuz için, aslında yapamam, çünkü ilk görünüşü ilk kullanımdan sonraJ değerlendirilen bir lambda içindedir . J
Ypnypn

ah, bunu görmedim. Başka bir şey: *]ile değiştirilebilirm
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}}

tek tek satır yaklaşımı.

Test programında Aşağıda, #{....}bir dizgede ifadeler eklemek için kullanılan sözdizimi ("string interpolation") ile karıştırılmaması için sembol @ ile değiştirilmiştir . Her giriş farklı bir satırda verilmelidir.

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)

Ruby'yi tanımıyorum, ancak Ruby'nin çözümleri Python çözümlerini sık sık çektiği için (kısmi deneyimlerime göre) bunun daha kısa olacağını tahmin ediyorum. Yeni başlayanlar için, a*a+b*bhesaplamasından iki bayt kesmeli c.
DLosc

3

C, 176 bayt

C bunu kazanmayacak, ama eğlence buna değer.

#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,)}}

Oldukça basılmış:

#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, main'e üçüncü parametreyi (bir dizi çevre değişkeni) geçirmemizi sağlar, bu yüzden amacımız için kullanmamızdan faydalanırız.

The

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

eşdeğer olurdu

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

çünkü scanfbaşarıyla taranan parametrelerin sayısını döndürür.


2

PHP, 178 170 168 bayt

Giriş GET parametreleridir xve y. Maalesef yinelenen ipleri golf oynayamıyorum.

<?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).~õ;
  • Tüm dizelerimi tersine çevirerek ve tırnak bırakarak 8 bayt kurtardı.
  • Durumunu değiştirerek 2 bayt Kaydedilen $i>0ile$i

PHP neden hoşlanmadığından emin değilim @echobu yüzden 1 byte feda etmek zorunda kaldım @print.

SE kodlamayı bozduğunda, bunun Windows-1252'de (UTF8 değil) kodlanmış olması gerekir.



Ah bu mantıklı. Teşekkürler!
DankMemes

2

APL (Dyalog Genişletilmiş) , 33 29 bayt SBCS

-3, Dyalog APL uzantılarımdan dolayı.

Anonim önek lambda:

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

Çevrimiçi deneyin!

{} "Dfn"; argüman (yan uzunluklar)

⍵*2 kare

+/ toplam

 kare kök

⍵, tartışma hazırla

{ Her birine aşağıdaki isimsiz lambayı uygulayın.

  # kök ad alanı

   metin olarak biçimlendir

  ⍵ ⍵⍴ iki kez bağımsız değişken kullanmak r bu boyutlara sahip matris içine eshape.

 sütun haline getirmek

' ++=', bu üç karakteri üç satıra hazırla

, ravel (satırları listede birleştir)

 metin olarak biçimlendir

 ters çevir


1

CJam, 78 bayt

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

İlk önce hipotenusu (H) hesaplar, sonra her taraf için (S), bunlardan oluşan bir S satırı dizisi oluşturur: H-Sspaces + Stire. Son olarak, matrisi iletir.

gösteri


1

Lua5.2, 257 241 227 222 bayt

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
  • Düzenleme1: Basitleştirilmiş okuma
  • Düzen2: Daha fazla boşluk kaldı
  • Edit3: takma isimlerden başka bir cevaptanio esinlenerek fonksiyonların soyutlanması

1

Kömür , 24 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Girdiyi iki eleman dizisi olarak alır. Açıklama:

⊞θ₂ΣXθ²

Hipotenusu girdilere ekleyin.

F =+«

Her karenin sağında görünen karakterleri ters sırada çevirin.

←←←ι←

Bu karakteri boşlukla sola doğru yazdırın.

G↑←↓⊟θ#

Dizideki son numarayı aç ve #bu boyutta bir kare kareyi yazdır


1
@KevinCruijssen Whoa, ne bir gözetim! Şimdi düzeltilmeli.
Neil

1

PowerShell , 139 137 135 bayt

-2 sadece ASCII
sayesinde -2 Mazzy sayesinde

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

Çevrimiçi deneyin!

$ C'nin zararını hesaplamak ve muhtemelen koşullu olarak #ve arasında geçiş yapmanın daha iyi bir yolu vardır . Bir parça listesi oluşturur ve şartlı olarak işaretleri eklerken bunları birleştirir.


1
Yedekli parantez içinde var $m=(" ","#"): Çevrimiçi deneyin!
mazzy

@mazzy Ha ha,
ağlar

0

Japt, 28 bayt

Bir tamsayı dizisi olarak girdiyi alır.

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

Dene

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

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

Girişi iki sayının listesi (yani [3,4]) olarak alır.

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

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}ø»+ve fark edene kadar benim girişimdi =.
Magic Octopus Urn

Evet @MagicOctopusUrn, bu üç boşluklar ve +ve =aslında kod çoğunlukla sorumludur. Btw yapabilirsiniz golf 2 değiştirerek yaklaşımında bayt DnOt©)˜ile nOt©ªbenim şimdiki cevap olduğu gibi. :) .DYine de kullanımınızı seviyorum .
Kevin Cruijssen

0

Perl 6 , 99 bayt

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

Çevrimiçi deneyin!

İki sayı alan ve tam dizgeyi bir satır başı satırına, üç satır satırına ve her satırda bir satır sonuna döndüren adsız kod bloğu.

Bunun yerine diğer karakterleri kullanabilirsiniz olursa #, o zaman değiştirerek byte kaydedebilirsiniz '#'ile \*.


0

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

Bu çok uzun sürüyor. Bu sürüm sadece dize oluşturmak için döngüler.

EDIT: Ascii-Sadece seri char eklemeler için dize yapıcı kullanarak güzel -27 bayt golf ile! Ayrıca, işaret için ty Ben System.Math.Sqrt değil Math.Sqrt kullanıyordum. Bu ayarlandı!

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

Çevrimiçi deneyin!


1
Bitiş noktalı virgül gerekli olmadığını ve etkileşimli kullanmıyorsanız da System.MathunutmayınMath
ASCII-yalnızca



Bir şey, bir hata yapmadığımdan emin olmak için tüm yönergeleri
ASCII-

1
Oh ve artık üçlü versiyona sahip olmadığınızdan, artık bahsetmeniz gerektiğini sanmıyorum
ASCII-sadece
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.