Explicar visualmente o teorema de Pitágoras

36

Uma explicação visual comum do teorema de Pitágoras é a seguinte:

3 caixas

Os quadrados devem representar o comprimento do lado ao quadrado e as áreas de a + b = c, exatamente como o teorema de Pitágoras diz.

Esta parte é o que você tem que mostrar.

Sua tarefa

  • Você receberá dois números inteiros como entrada, destinados a representar lados ae bum triângulo retângulo (ex. 3, 4).
  • Você vai então fazer quadrados fora dos comprimentos a, be cfora do #personagem. Por exemplo, aqui está 3:
###
###
###
  • Você irá formatá-los em uma equação matemática que explica o trigêmeo pitagórico específico:
             #####
      ####   #####
###   ####   #####
###   ####   #####
### + #### = #####
  • Observe como os sinais =e +têm espaços nos dois lados e como tudo está no fundo.
  • Você nunca obterá valores para ae bque cnão sejam integrais.
  • Este é o pelo que o código mais curto em bytes vence!

Casos de teste

(mais chegando quando eu tiver tempo, é muito difícil de fazer à mão)

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

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

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

5, 12
                       #############
        ############   #############
        ############   #############
        ############   #############
        ############   #############
        ############   #############
        ############   #############
        ############   #############
#####   ############   #############
#####   ############   #############
#####   ############   #############
#####   ############   #############
##### + ############ = #############
Maltysen
fonte
3
@bmarks "Você nunca obterá valores para aeb que tornam c não integral."
Maltysen 31/08/2015
2
@RetoKoradi bem as áreas dos quadrados a+b=c
Maltysen
1
Se a, be csão definidas como as áreas dos quadrados, os exemplos estão incorretos.
Reto Koradi 31/08/2015
2
Você deve adicionar outro caso de teste agradável, como 5 + 12 = 13.
mbomb007
7
Nota: esta não é "uma explicação visual do teorema de Pitágoras". Este é o teorema de Pitágoras. Foi originalmente formulado exatamente dessa maneira: geometricamente. Eles nem sabiam sobre raízes quadradas, ainda mais interessantes, o próprio Pitágoras não acreditava na existência de números irracionais. Isso significa que Pitágoras pensou que o sqrt (2) pode ser representado exatamente pela divisão de dois números inteiros finitos. O teorema original é o que chamamos agora de "representação visual"
vsz 01/09/15

Respostas:

17

Pyth, 35 32 31 30 bytes

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

Experimente online.

orlp
fonte
Você pode salvar um byte usando .ipara adicionar as linhas em branco em vez disso:j_.ts.i.imm*d\#d+Qs.aQ"+="mk4d
isaacg
12

CJam, 49 bytes

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

Experimente online no intérprete CJam .

Como funciona

" +   = "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.
Dennis
fonte
11

Python 2, 134 100 bytes

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

Experimente online.

O programa recebe a entrada como números inteiros separados por vírgula, calcula a hipotenusa usando os números complexos internos do Python e, em seguida, desce desse valor calculando e imprimindo cada linha à medida que avançam. O principal truque do golfe é usar a indexação de cordas no lugar de condicionais para selecionar# / +/ =vs espaço.

Edit: A primeira versão foi vítima de um excesso de engenharia grave - esta é mais simples e muito mais curta.

DLosc
fonte
Acabei de ter a mesma coisa, tendo demorado um pouco para perceber que é mais curto repetir em "# "[i>a]*avez de fazê-lo para cada variável.
xnor
11

Julia, 121 114 112 bytes

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

Corrigido o problema e economizamos 2 bytes graças a Glen O.

Alex A.
fonte
11

JavaScript ES6, 155 134 140 129 bytes

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

Eu reescrevi isso com for. Muito golfe ainda ...

Se algo não estiver funcionando, me avise. Vou consertar de manhã.

Testado no Safari Nightly

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

Explicação:

(Não atualizado), mas ainda preciso o suficiente.

(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

Versão ES5 A entrada deve ser um conjunto válido de números :

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>

Downgoat
fonte
2
+1, mas há um pequeno problema, como diz o OP: "Observe como os sinais = e + têm espaços nos dois lados e como tudo está no fundo".
Léo Lam
1
O trecho não está funcionando no Firefox 40.0.3 (Windows 7x64 SP1).
Ismael Miguel
1
Trecho não funciona no Chromium 44 Linux x64
Nenotlep
2
@IsmaelMiguel Esses últimos casos não são necessários para lidar corretamente, no entanto: "Você nunca obterá valores ae bisso torna cnão integral".
DLosc
2
+1 bom uso de eval. Dica: (z<b?'#':' ')->' #'[z<b|0]
edc65
7

Pitão, 51 49 bytes

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

Espera entrada no formulário [3,4].

Experimente aqui

AQ - atribui entrada para G, H

Js.a,GH - calcula a hipotenusa como J

Lj*b]*b\#;- define y(b)como fazer um quadrado de tamanho b(em outra parte do código, bsignifica nova linha)

j_MCm_.[d\ Jcj[yJb\=byHb\+byG))b - Cria quadrados, almofadas com espaços e transpõe

Economizou dois bytes graças a Maltysen.

Ypnypn
fonte
Não sei exatamente o que seu código faz, mas tenho certeza de que ele pode se beneficiar do .interlace em vez de todas essas listas.
Maltysen
@ Maltysen Para o seu último comentário, na verdade não posso, porque a primeira aparição de Jestá dentro de um lambda, que é avaliada depois que J é usada pela primeira vez.
Ypnypn
ah, não vi isso. Outra coisa: *]pode ser substituído porm
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}}

abordagem simples linha a linha.

Abaixo no programa de teste, com o símbolo alterado para @ para ajudar a evitar confusões com a sintaxe #{....}("interpolação de string") usada para inserir expressões em uma string. Cada entrada deve ser fornecida em uma linha diferente.

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)
Level River St
fonte
Não conheço Ruby, mas acho que isso pode ficar mais curto, pois as soluções Ruby geralmente superam as soluções Python (na minha experiência anedótica). Para iniciantes, a*a+b*bdeve cortar dois bytes do cálculo de c.
DLosc
3

C, 176 bytes

C não vai ganhar isso, mas a diversão vale a pena.

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

Bonito impresso:

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

O gcc nos permite passar o terceiro parâmetro para main (uma matriz de variáveis ​​de ambiente), então aproveitamos para usá-lo para nosso propósito.

o

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

seria equivalente a

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

porque scanfretorna o número de parâmetros varridos com sucesso.

pawel.boczarski
fonte
2

PHP, 178 170 168 bytes

A entrada é parâmetros GET xe y. Infelizmente, não consigo jogar golfe aquelas cordas repetidas.

<?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).~õ;
  • Economizei 8 bytes invertendo todas as minhas strings e soltando as aspas.
  • Salva 2 bytes substituindo a condição $i>0por$i

Não sei por que o PHP não gosta, @echoentão tive que sacrificar 1 byte @print.

Caso o SE estrague a codificação, isso deve ser codificado no Windows-1252 (não no UTF8).

DankMemes
fonte
1
echovs print. Veja: stackoverflow.com/questions/7094118/…
MarcDefiant
Ah, isso faz sentido. Obrigado!
DankMemes
2

APL (Dyalog Extended) , 33 29 bytes SBCS

-3 devido às minhas extensões do Dyalog APL.

Prefixo anônimo lambda:

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

Experimente online!

{... } "dfn"; é o argumento (comprimentos laterais)

⍵*2 quadrado

+/ soma

 raiz quadrada

⍵, argumento precedente

{ Aplique a seguinte lambda anônima a cada

  # espaço para nome raiz

   formatar como texto

  ⍵ ⍵⍴ usar argumento duas vezes para r eshape em matriz com essas dimensões.

 transformar em coluna

' ++=', coloque esses três caracteres nas três linhas

, ravel (combinar linhas na lista)

 formatar como texto

 virar de cabeça para baixo

Adão
fonte
1

CJam, 78 bytes

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

Primeiro calcula a hipotenusa (H) e, em seguida, para cada lado (S), constrói uma matriz de S linhas feitas de: H-Sspaces +S traços. Finalmente, transpõe a matriz.

Demo

Razvan
fonte
1

Lua5.2, 257 241 227 222 bytes

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
  • Edit1: Leitura simplificada
  • Edit2: Removidos mais espaços em branco
  • Edit3: aliases abstração de iofunções inspiradas em outra resposta
Jakuje
fonte
1

Carvão , 24 bytes

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

Experimente online! Link é a versão detalhada do código. Recebe entrada como uma matriz de dois elementos. Explicação:

⊞θ₂ΣXθ²

Anexe a hipotenusa às entradas.

F =+«

Passe os caracteres que aparecem à direita de cada quadrado na ordem inversa.

←←←ι←

Imprima esse caractere para a esquerda com espaçamento.

G↑←↓⊟θ#

Retire o último número da matriz e imprima um quadrado de #s desse tamanho.

Neil
fonte
1
@KevinCruijssen Whoa, que supervisão! Deve ser corrigido agora.
Neil
1

PowerShell , 139 137 135 bytes

-2 graças a ASCII-apenas
-2 graças a Mazzy

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

Experimente online!

Calcular $ c doeu e provavelmente existe uma maneira melhor de trocar condicionalmente entre #e . Constrói uma lista de pedaços e os une enquanto adiciona condicionalmente os sinais.

Veskah
fonte
1
existem colchetes redundantes em $m=(" ","#"): Experimente online!
mazzy 16/01
@mazzy Ha ha, whoops
Veskah 16/01
0

Japonês, 28 bytes

Recebe a entrada como uma matriz de números inteiros.

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

Tente

                    :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
Shaggy
fonte
0

05AB1E , 38 bytes

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

Toma a entrada como uma lista de dois números (ou seja [3,4]).

Experimente online ou verifique todos os casos de teste .

Explicação:

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)
Kevin Cruijssen
fonte
DnOt©)˜ε'#×y.Dðy×®y-.D)R}ø»foi minha tentativa até que notei o +e =.
Magic Octopus Urn
@MagicOctopusUrn Sim, esses três espaços e +e =são, de facto responsável pela maior parte do código. Aliás, você pode jogar 2 bytes na sua abordagem substituindo DnOt©)˜por nOt©ª, como fiz na minha resposta atual. :) Eu gosto do seu uso .D, no entanto.
Kevin Cruijssen 17/01
0

Perl 6 , 99 bytes

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

Experimente online!

Bloco de código anônimo que recebe dois números e retorna a cadeia completa com uma nova linha principal e três espaços principais e um à direita em cada linha.

Se pudermos usar outros caracteres em vez de #, posso salvar um byte substituindo '#'por \*.

Brincadeira
fonte
0

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

Isso parece muito longo. Esta versão apenas faz um loop para construir a string.

EDIT: ASCII-Only com um bom golfe de -27 bytes usando o construtor de strings para adições de caracteres em série! Além disso, digite ty para apontar que eu estava usando Math.Sqrt e não System.Math.Sqrt. Isso foi ajustado!

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

Experimente online!

Destroigo
fonte
1
lembre-se que o ponto e vírgula final não é necessário, e também System.Mathnão Mathse você não estiver usando o modo interativo
somente ASCII
211?
somente ASCII
1
187?
somente ASCII
Uma coisa, eu removia todas as diretivas que usam para garantir que não cometi um erro
somente ASCII
1
Ah, e como você não tem mais a versão ternária, acho que não deveria mais mencioná-la
somente ASCII