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
                       #############
        ############   #############
        ############   #############
        ############   #############
        ############   #############
        ############   #############
        ############   #############
        ############   #############
#####   ############   #############
#####   ############   #############
#####   ############   #############
#####   ############   #############
##### + ############ = #############

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.


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.

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.


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.


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>


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.


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)

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.


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



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


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


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

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.


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.


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

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)

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 \*.


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!


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



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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.