Wyjaśnij wizualnie twierdzenie Pitagorasa


36

Częstym wizualnym wyjaśnieniem twierdzenia Pitagorasa jest:

3 pudełka

Kwadraty mają reprezentować kwadrat długości boku i obszary a + b = c, tak jak mówi twierdzenie Pitagorasa.

Ta część jest tym, co musisz pokazać.

Twoje zadanie

  • Otrzymasz dwie liczby całkowite jako dane wejściowe, które mają reprezentować boki ai btrójkąta prostokątnego (np.3, 4 ).
  • Będziesz wtedy zrobić kwadraty z długości a, boraz cz #charakterem. Na przykład tutaj jest 3:
###
###
###
  • Następnie sformatujesz je w równanie matematyczne, które wyjaśnia konkretną triplet Pitagorasa:
             #####
      ####   #####
###   ####   #####
###   ####   #####
### + #### = #####
  • Zauważ, że znaki =i +mają spacje po obu stronach i jak wszystko jest na dole.
  • Nigdy nie dostanie wartości ai bże make cnon-integralną.
  • To jest więc wygrywa najkrótszy kod w bajtach !

Przypadki testowe

(więcej pojawi się, gdy będę miał czas, naprawdę trudno je wykonać ręcznie)

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

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

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

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

3
@bmarks „Nigdy nie otrzymasz wartości dla aib, które sprawią, że c nie będzie całką.”
Maltysen

2
@RetoKoradi oraz obszary placów a+b=c
Maltysen

1
Jeśli a, bi csą określane jako obszary kwadratów, a przykłady są nieprawidłowe.
Reto Koradi

2
Powinieneś dodać kolejny fajny przypadek testowy, na przykład 5 + 12 = 13.
mbomb007

7
Uwaga: nie jest to „wizualne wyjaśnienie twierdzenia Pitagorasa”. To twierdzenie Pitagorasa. Pierwotnie został sformułowany dokładnie w ten sposób: geometrycznie. Nie wiedzieli nawet o pierwiastkach kwadratowych, a nawet bardziej interesujący, sam Pitagoras nie wierzył w istnienie liczb niewymiernych. Oznacza to, że Pitagoras uważał, że sqrt (2) może być dokładnie reprezentowany przez podział dwóch skończonych liczb całkowitych. Pierwotne twierdzenie nazywamy teraz „reprezentacją wizualną”
vsz

Odpowiedzi:



12

CJam, 49 bajtów

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

Wypróbuj online w interpretatorze CJam .

Jak to działa

" +   = "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 bajtów

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

Wypróbuj online.

Program pobiera dane jako liczby całkowite oddzielone przecinkami, oblicza przeciwprostokątną za pomocą wbudowanych liczb zespolonych Pythona, a następnie zapętla się od tej wartości, obliczając i wypisując każdą linię w miarę upływu czasu. Główną sztuczką golfową jest indeksowanie łańcuchów zamiast instrukcji warunkowych, aby wybrać #/ +/= vs spacji.

Edycja: Pierwsza wersja była ofiarą poważnej nadmiernej inżynierii - ta jest zarówno prostsza, jak i znacznie krótsza.


Właśnie dostałem tę samą rzecz, ponieważ uświadomiłem sobie, że krótsze jest powtarzanie "# "[i>a]*azamiast robienia tego dla każdej zmiennej.
xnor

11

Julia, 121 114 112 bajtów

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

Nie golfowany:

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

Naprawiono problem i zapisano 2 bajty dzięki Glen O.


11

JavaScript ES6, 155 134 140 129 bajtów

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

Przepisałem to z for. Wciąż dużo golfa ...

Jeśli coś nie działa, daj mi znać. Naprawię to rano.

Testowane na Safari Nightly

Nie golfowany:

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

Wyjaśnienie:

(Nie zaktualizowano), ale wciąż wystarczająco dokładne.

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

PRÓBNY

Wersja ES5 Dane wejściowe muszą być poprawnymi zestawami liczb :

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, ale jest mały problem, jak mówi PO: „Zauważ, że znaki = i + mają spacje po obu stronach i jak wszystko jest na dole”.
Léo Lam,

1
Fragment nie działa w przeglądarce Firefox 40.0.3 (Windows 7x64 SP1).
Ismael Miguel

1
Fragment nie działa w systemie Chromium 44 Linux x64
Nenotlep,

2
@IsmaelMiguel Te ostatnie przypadki nie są konieczne do prawidłowej obsługi, jednak: „Nigdy nie otrzymasz wartości dla, aa bto powoduje, że cnie są całkami”.
DLosc

2
+1 miłe użycie eval. Wskazówka: (z<b?'#':' ')->' #'[z<b|0]
edc65

7

Pyth, 51 49 bajtów

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

Oczekuje danych wejściowych w formularzu [3,4].

Wypróbuj tutaj

AQ - przypisuje dane wejściowe do G, H

Js.a,GH - oblicza przeciwprostokątną jako J

Lj*b]*b\#;- definiuje y(b)jako tworzenie kwadratu wielkości b(w innym miejscu kodu,b oznacza )

j_MCm_.[d\ Jcj[yJb\=byHb\+byG))b - Tworzy kwadraty, podkładki ze spacjami i transponuje

Zaoszczędź dwa bajty dzięki Maltysen.


Nie wiem dokładnie, co robi twój kod, ale jestem prawie pewien, że może korzystać z .interlace zamiast wszystkich tych list.
Maltysen

@Maltysen Do twojego ostatniego komentarza, tak naprawdę nie mogę, ponieważ pierwsze pojawienie się Jjest w lambda, które jest oceniane po J pierwszym użyciu.
Ypnypn

ah, nie widziałem tego. Kolejna rzecz: *]można zastąpićm
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}}

proste podejście linia po linii.

Poniżej w programie testowym, z symbolem zmienionym na @, aby uniknąć konfliktu ze składnią #{....}(„interpolacja łańcucha”) używaną do wstawiania wyrażeń w łańcuch. Każde wejście należy podać w innym wierszu.

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)

Nie znam Ruby, ale przypuszczam, że może się to skrócić, ponieważ rozwiązania Ruby często pokonują rozwiązania Python (z mojego anegdotycznego doświadczenia). Na początek a*a+b*bnależy wyciąć dwa bajty z obliczeń c.
DLosc

3

C, 176 bajtów

C nie wygra, ale zabawa jest tego warta.

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

Dość drukowane:

#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 pozwala nam przekazać trzeci parametr do main (tablica zmiennych środowiskowych), więc wykorzystujemy go, aby użyć go do naszych celów.

The

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

byłoby równoważne z

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

ponieważ scanfzwraca liczbę pomyślnie przeskanowanych parametrów.


2

PHP, 178 170 168 bajtów

Dane wejściowe to parametry GET xi y. Niestety nie mogę grać w golfa w te powtarzające się struny.

<?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).~õ;
  • Zaoszczędziłem 8 bajtów, odwracając wszystkie moje ciągi i upuszczając cudzysłowy.
  • Zapisano 2 bajty, zastępując warunek $i>0słowem$i

Nie jestem pewien, dlaczego PHP nie lubi, @echowięc musiałem poświęcić 1 bajt @print.

W przypadku, gdy SE zepsuje kodowanie, jest to przeznaczone do zakodowania w Windows-1252 (nie UTF8).



Ach, to ma sens. Dzięki!
DankMemes,

2

APL (Dyalog Extended) , 33 29 bajtów SBCS

-3 z powodu moich rozszerzeń Dyalog APL.

Anonimowy przedrostek lambda:

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

Wypróbuj online!

{} „Dfn”; jest argumentem (długości boczne)

⍵*2 plac

+/ suma

 pierwiastek kwadratowy

⍵, poprzedzać argument

{  Zastosuj dla każdego następującą anonimową lambdę

  # główna przestrzeń nazw

   sformatuj jako tekst

  ⍵ ⍵⍴ użyj argumentu dwa razy, aby r eshape w matrycy o tych wymiarach.

 zrobić w kolumnie

' ++=', wstaw te trzy znaki do trzech wierszy

, ravel (łącz wiersze w listę)

 sformatuj jako tekst

 odwróć do góry nogami


1

CJam, 78 bajtów

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

Najpierw oblicza przeciwprostokątną (H), a następnie dla każdej strony (S) buduje tablicę S linii składających się z: H-Sspacji +S myślników. Wreszcie transponuje macierz.

Próbny


1

Lua5.2, 257 241 227 222 bajty

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
  • Edycja1: Uproszczony odczyt
  • Edycja2: Usunięto więcej białych znaków
  • Edycja3: aliasy abstrakcyjne iofunkcji inspirowane inną odpowiedzią

1

Węgiel drzewny , 24 bajty

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

Wypróbuj online! Link jest do pełnej wersji kodu. Pobiera dane wejściowe jako tablicę dwóch elementów. Wyjaśnienie:

⊞θ₂ΣXθ²

Dołącz przeciwprostokątną do wejść.

F =+«

Pętla nad znakami wyświetlanymi po prawej stronie każdego kwadratu w odwrotnej kolejności.

←←←ι←

Wydrukuj tę postać w lewo z odstępami.

G↑←↓⊟θ#

Usuń ostatnią liczbę z tablicy i wydrukuj kwadrat #s tego rozmiaru.


1
@KevinCruijssen Whoa, co za przeoczenie! Powinien zostać teraz naprawiony.
Neil

1

PowerShell , 139 137 135 bajtów

-2 dzięki tylko ASCII
-2 dzięki Mazzy

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

Wypróbuj online!

Obliczanie $ c boli i prawdopodobnie jest lepszy sposób na warunkową zamianę między #a . Tworzy listę fragmentów i łączy je razem, warunkowo dodając znaki.


1
w nawiasach klamrowych znajduje się $m=(" ","#"): Wypróbuj online!
mazzy

@mazzy Ha ha,
ups

0

Japt, 28 bajtów

Pobiera dane wejściowe jako tablicę liczb całkowitych.

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

Spróbuj

                    :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 bajtów

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

Pobiera dane wejściowe jako listę dwóch liczb (tj [3,4].).

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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}ø»była moja próba, dopóki nie zauważyłem +i =.
Magic Octopus Urn

@MagicOctopusUrn Tak, te trzy przestrzenie i +i =rzeczywiście są odpowiedzialne za większą część kodu. Btw, możesz grać w golfa 2 bajty w swoim podejściu, zastępując DnOt©)˜je nOt©ª, tak jak ja w mojej obecnej odpowiedzi. :) Lubię jednak twoje użycie .D.
Kevin Cruijssen

0

Perl 6 , 99 bajtów

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

Wypróbuj online!

Anonimowy blok kodu, który przyjmuje dwie liczby i zwraca pełny ciąg z wiodącą nową linią i trzema wiodącymi spacjami oraz jedną końcową w każdej linii.

Jeśli zamiast tego możemy użyć innych znaków #, mogę zapisać bajt, zastępując '#'go \*.


0

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

To wydaje się zbyt długie. Ta wersja po prostu zapętla się, aby utworzyć ciąg.

EDYCJA: Ascii-Tylko z ładnym-27-bajtowym golfem przy użyciu konstruktora ciągów do szeregowego dodawania znaków! Również za wskazanie, że korzystałem z Math.Sqrt, a nie System.Math.Sqrt. To zostało dostosowane!

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

Wypróbuj online!


1
pamiętaj, że końcowy średnik nie jest potrzebny, a także System.Mathnie, Mathjeśli nie używasz interaktywnego
tylko ASCII



Po pierwsze, usunąłem wszystkie za pomocą dyrektyw, aby upewnić się, że nie popełniłem błędu
tylko ASCII,

1
Aha, a skoro nie masz już wersji trójskładnikowej, nie sądzę, że powinieneś już o tym wspominać
tylko ASCII,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.