直观地解释勾股定理


36

勾股定理的常见视觉解释如下:

3盒

正方形用来表示边长的平方,以及的面积a + b = c,就像毕达哥拉斯定理所说的那样。

这部分是您必须显示的。

你的任务

  • 您将获得两个整数作为输入,表示整数ab直角三角形(例如3, 4)。
  • 然后,您将方块出长度ab以及c走出的#人物。例如这里是3:
###
###
###
  • 然后,将它们格式化为一个数学方程式,以解释特定的毕达哥拉斯三联体:
             #####
      ####   #####
###   ####   #####
###   ####   #####
### + #### = #####
  • 请注意=+符号在两边都留有空格,而所有内容都在底部。
  • 你永远不会了解get值ab使c非整。
  • 这是因此以字节为单位的最短代码胜出!

测试用例

(一旦我有时间,就会有更多东西来,这些真的很难手工制作)

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

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

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

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

3
@bmarks“您将永远不会获得使c变为非整数的a和b的值。”
马蒂森(Maltysen)2015年

2
@RetoKoradi很好的广场区域 a+b=c
Maltysen,2015年

1
如果ab并且c被定义为正方形的区域,那么例子是不正确的。
Reto Koradi

2
你应该添加一个漂亮的测试案例,如5 + 12 = 13
mbomb007

7
注意:这不是“勾股定理的视觉解释”。这是毕达哥拉斯的定理 它最初是完全按照这种方式制定的:几何上的。他们甚至不知道平方根,更有趣的是,毕达哥拉斯本人不相信无理数的存在。这意味着毕达哥拉斯认为sqrt(2)可以由两个有限整数的除法来精确表示。原始定理就是我们现在所说的“视觉表示”
vsz 2015年

Answers:



12

CJam,49个字节

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

CJam解释器中在线尝试。

怎么运行的

" +   = "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,134100字节

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

在线尝试。

该程序将输入作为逗号分隔的整数,使用Python的内置复数计算斜边,然后从该值开始向下循环,计算并打印每一行。主要的高尔夫诀窍是使用替代条件语句的字符串索引选择#/ +/ =VS空间。

编辑:第一个版本是某些严重过度设计的受害者-这个版本既简单又短得多。


我刚刚得到了同样的东西,花了一段时间才意识到,重复"# "[i>a]*a而不是对每个变量都这样做要短一些。
xnor 2015年

11

利亚,121个 114 112字节

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

取消高尔夫:

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节省了2个字节。


11

JavaScript的ES6,155个 134 140 129字节

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

我用重写了此内容for。还有很多高尔夫...

如果有任何问题,请通知我。我会在早上修复。

每晚在Safari上测试

取消高尔夫:

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

说明:

(未更新),但仍然足够准确。

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

演示

ES5版本输入必须是有效的数字集

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,但是OP所说的是一个小问题:“请注意,=和+符号在两边都留有空格,而所有内容都在底部。”
莱奥榄

1
该代码段不适用于Firefox 40.0.3(Windows 7x64 SP1)。
Ismael Miguel

1
代码段在Chromium 44 Linux x64中
不起作用

2
@IsmaelMiguel那些后一种情况对于正确处理不是必需的,但是:“您将永远不会获得值,a并且b这些值将成为c非整数。”
DLosc

2
+1很好地使用eval。提示:(z<b?'#':' ')->' #'[z<b|0]
edc65'9

7

Pyth,51 49字节

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

期望以形式输入[3,4]

在这里尝试

AQ -将输入分配给 G, H

Js.a,GH -计算斜边为 J

Lj*b]*b\#;-定义y(b)为尺寸的平方b(在代码中的其他地方,b表示换行符)

j_MCm_.[d\ Jcj[yJb\=byHb\+byG))b -创建正方形,带有空格的填充并转置

感谢Maltysen,节省了两个字节。


我不确切知道您的代码做什么,但是我很确定它可以从.interlace而不是所有这些列表中受益。
Maltysen 2015年

@Maltysen对于您的最后一条评论,实际上我不能,因为的首次出现J是在lambda内部,该lambda J首次使用得到评估。
Ypnypn

啊,没看到。另一件事:*]可以用m
Maltysen

3

红宝石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}}

简单的逐行方法。

在下面的测试程序中,将符号更改为@,以帮助避免与#{....}用于将表达式插入字符串的语法(“字符串插值”)混淆。每个输入都应在不同的行上给出。

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,但是我猜这可能会变得更短,因为Ruby解决方案通常会胜过Python解决方案(以我的轶事经验)。对于初学者,a*a+b*b应从的计算中减去两个字节c
DLosc

3

C,176字节

C不会赢得这场胜利,但是乐趣是值得的。

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

漂亮印刷:

#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(一组环境变量),因此我们可以利用它来达到目的。

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

相当于

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

因为scanf返回成功扫描的参数数。


2

PHP,178个 170 168字节

输入是GET参数xy。不幸的是,我似乎无法打那些重复的弦。

<?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).~õ;
  • 通过反转所有字符串并删除引号节省了8个字节。
  • 通过更换条件保存2个字节$i>0$i

不知道为什么PHP不喜欢,@echo所以我不得不用牺牲1个字节@print

如果SE搞砸了编码,则意味着它应在Windows-1252(而不是UTF8)中进行编码。



嗯,这很有道理。谢谢!
DankMemes'9

2

APL(Dyalog扩展)33 29 字节SBCS

-3由于我对Dyalog APL的扩展。

匿名前缀lambda:

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

在线尝试!

{…… } “ dfn”;是参数(边长)

⍵*2 广场

+/ 和

 平方根

⍵, 前置论证

{ 对每个应用以下匿名lambda

  # 根名称空间

   格式化为文本

  ⍵ ⍵⍴ 使用参数两次ř ESHAPE与这些尺寸矩阵。

 列入

' ++=', 将这三个字符放在三行之前

, ravel(将行合并到列表中)

 格式化为文本

 上下翻转


1

CJam,78个字节

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

它首先计算斜边(H),然后对于每一边(S),构建由以下各项组成的S行数组:H-S空格+ S破折号。最后,它转置矩阵。

演示版


1

Lua5.2, 257 241 227 222字节

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
  • 编辑1:简化阅读
  • Edit2:删除了更多的空格
  • Edit3:别名的io功能抽象受另一个答案的启发

1

木炭,24字节

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

在线尝试!链接是详细版本的代码。将输入作为两个元素的数组。说明:

⊞θ₂ΣXθ²

将斜边附加到输入。

F =+«

以相反的顺序循环显示在每个正方形右侧的字符。

←←←ι←

向左打印该字符。

G↑←↓⊟θ#

从数组中弹出最后一个数字,并打印#该大小的s 平方。


1
@KevinCruijssen哇,真是个疏忽!现在应该修复。
尼尔

1

PowerShell中139个 137 135字节

-2多亏了ASCII码
-2多亏了Mazzy

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

在线尝试!

计算$ c的伤害,可能有更好的方法有条件地在#和之间进行交换。建立块列表并将它们连接在一起,同时有条件地添加符号。


1
中有多余的括号$m=(" ","#")在线尝试!
凌晨

@mazzy哈哈,
哎呀

0

Japt,28个字节

将输入作为整数数组。

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

试试吧

                    :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 个字节

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

将输入作为两个数字的列表(即[3,4])。

在线尝试验证所有测试用例

说明:

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}ø»是我的尝试,直到我注意到+=
魔术章鱼缸

@MagicOctopusUrn呀,这三个空间,+并且=确实是负责代码的大部分。顺便说一句,你可以打高尔夫球2个字节中更换你的方法DnOt©)˜nOt©ª,正如我在回答目前没有。:)我喜欢您对的使用.D
凯文·克鲁伊森

0

Perl 6,99个字节

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

在线尝试!

匿名代码块,它包含两个数字,并返回完整的字符串,并带有前导换行符,三个前导空格以及每行尾随一个。

如果我们可以改用其他字符#,那么我可以通过更换保存一个字节'#'\*


0

C#(.NET核心)221,194个字节

感觉太久了。这个版本只是循环来构造字符串。

编辑:仅使用字符串构造函数的串行字符添加,一个不错的-27字节golf的Ascii!另外,要指出我正在使用Math.Sqrt而不是System.Math.Sqrt。这已经调整了!

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

在线尝试!


1
记住不需要结束分号,也System.Math不会Math,如果你不使用交互式
ASCII-仅



一件事,我将删除所有使用指令,以确保我没有
ASCII纯

1
哦,由于您不再拥有三元版本,所以我不认为您应该再提及它了
仅ASCII的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.