피타고라스 정리를 시각적으로 설명


36

피타고라스 정리에 대한 일반적인 시각적 설명은 다음과 같습니다.

3 상자

정사각형은 a + b = c피타고라스 정리와 같이 변의 길이를 제곱 한 영역을 나타냅니다 .

이 부분은 당신이 보여 주어야 할 것입니다.

당신의 작업

  • 측면 ab직각 삼각형 을 나타내는 두 개의 정수를 입력으로받습니다 (예 :) 3, 4.
  • 그런 다음 길이에서 사각형을 만들 것 a, b그리고 c의에서 #문자. 예를 들어 다음은 3입니다.
###
###
###
  • 그런 다음 특정 피타고라스 삼중 항을 설명하는 수학 방정식으로 형식을 지정합니다.
             #####
      ####   #####
###   ####   #####
###   ####   #####
### + #### = #####
  • 통지 방법 =+표시는 양쪽에 공백이 어떻게 모든 것은 하단에 있습니다.
  • 당신은 값을 얻을하지 않습니다 ab메이크업의 것을 c비 필수.
  • 이것은 이므로 바이트 단위의 가장 짧은 코드가 승리합니다!

테스트 사례

(시간이 지나면 더 많이옵니다. 손으로 직접 만들기가 어렵습니다)

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

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

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

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

3
@bmarks "c를 비 적분으로 만드는 a와 b의 값은 절대 얻지 못합니다."
Maltysen

2
@RetoKoradi 잘 사각형영역a+b=c
Maltysen

1
경우 a, b그리고 c사각형의 영역으로 정의되며, 다음 예는 올바르지 않습니다.
Reto Koradi

2
5 + 12 = 13과 같은 또 다른 멋진 테스트 사례를 추가해야합니다.
mbomb007

7
참고 : 이것은 "피타고라스 정리에 대한 시각적 설명"이 아닙니다. 이다 피타고라스의 정리. 원래는 이런 식으로 정확히 기하학적으로 만들어졌습니다. 그들은 제곱근에 대해서도 몰랐고, 더 흥미 로웠으며, 피타고라스 자신도 비이성적 인 숫자의 존재를 믿지 않았습니다. 이것은 피타고라스가 sqrt (2)가 2 개의 유한 정수의 나눗셈으로 정확하게 표현 될 수 있다고 생각했음을 의미합니다. 원래 정리는 우리가 지금은 "시각적으로 표시"라고 부릅니다
VSZ

답변:



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

파이썬 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의 내장 복소수를 사용하여 빗변을 계산 한 다음 해당 값에서 아래로 계산하여 각 행을 인쇄하고 인쇄합니다. 주요 골프 트릭은 조건부 대신 문자열 인덱싱을 사용하여 선택하는 것입니다.# / +/ =공간 대.

편집 : 첫 번째 버전은 심각한 오버 엔지니어링의 대상이되었습니다 . 이 버전은 더 간단하고 짧습니다.


방금 똑같은 것을 얻었습니다 "# "[i>a]*a. 각 변수마다 반복하는 대신 반복하는 것이 더 짧다는 것을 깨달았습니다 .
xnor

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

자바 스크립트 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 Nightly에서 테스트

언 골프 드 :

(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가 말한 것처럼 작은 문제가 있습니다. "= 및 + 표시의 양쪽에 공백이 있고 바닥에 모든 것이 어떻게 표시되는지 알 수 있습니다."
Léo Lam

1
이 스 니펫은 Firefox 40.0.3 (Windows 7x64 SP1)에서 작동하지 않습니다.
Ismael Miguel

1
코드 조각이 Chromium 44 Linux x64에서 작동하지 않음
Nenotlep

2
그 후자의 경우가 있지만, 제대로 처리 할 필요가 없습니다 @IsmaelMiguel : "당신은 값을 얻을하지 않습니다 ab확인 용 c.이 아닌 필수"
DLosc

2
평가판 +1 사용. 힌트 : (z<b?'#':' ')->' #'[z<b|0]
edc65

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 덕분에 2 바이트를 절약했습니다.


코드가 정확히 무엇인지 모르지만 .i모든 목록 대신 nterlace 에서 이점을 얻을 수 있다고 확신 합니다.
Maltysen

의 첫 등장이 있기 때문에, 실제로 그럴 수 없어, 당신의 마지막 코멘트에 @Maltysen J평가됩니다 람다, 내부 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)

루비는 모르지만 루비 솔루션은 종종 일화적인 경험으로 파이썬 솔루션을 능가하기 때문에 더 짧아 질 수 있습니다. 우선, a*a+b*b의 계산에서 2 바이트를 잘라야 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 바이트를 절약했습니다.
  • 조건 $i>0을 로 대체하여 2 바이트를 절약 했습니다.$i

왜 PHP가 마음에 들지 않는지 모르겠 @echo으므로 1 바이트를 희생해야했습니다.@print .

SE가 인코딩을 망칠 경우 이것은 Windows-1252 (UTF8 아님)로 인코딩됩니다.



아 맞다. 감사!
DankMemes

2

APL (Dyalog Extended) , 33 29 바이트 SBCS

Dyalog APL의 확장으로 인해 -3입니다.

익명 접두사 람다 :

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

온라인으로 사용해보십시오!

{} "dfn";인수 (측면 길이)

⍵*2 광장

+/ 합집합

 제곱근

⍵, 접두사

{  다음 익명 람다를 각각에 적용하십시오

  # 루트 네임 스페이스

   텍스트 형식

  ⍵ ⍵⍴r에  인수를 두 번 사용 그 치수 매트릭스로 eshape.

 열로 만들다

' ++=', 이 세 문자를 세 행 앞에 추가하십시오

, 라벨 (행을 목록으로 결합)

 텍스트 형식

 거꾸로 뒤집다


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)에 대해 H-S공백 + 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
  • Edit1 : 단순화 된 독서
  • Edit2 : 더 많은 공백 제거
  • Edit3 : 다른 답변에서io 영감을 얻은 함수의 별칭 추상화

1

, 24 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 입력을 두 요소의 배열로 가져옵니다. 설명:

⊞θ₂ΣXθ²

입력에 빗변을 추가하십시오.

F =+«

각 사각형의 오른쪽에 나타나는 문자를 역순으로 반복합니다.

←←←ι←

간격을두고 해당 문자를 왼쪽으로 인쇄하십시오.

G↑←↓⊟θ#

배열에서 마지막 숫자를 꺼내고 #해당 크기의 제곱을 인쇄합니다 .


1
@KevinCruijssen Whoa, 무슨 감독! 지금 수정해야합니다.

1

PowerShell을 , 139 137 135 바이트

ASCII 전용으로 -2
-2 덕분에 Mazzy 덕분에 -2

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

@mazzy Ha ha,
으악

0

apt, 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}ø»+과를 발견 할 때까지 나의 시도였다 =.
매직 문어 Urn

그래 @MagicOctopusUrn,이 세 공간과 +와는 =참으로 코드의 대부분에 대한 책임이 있습니다. Btw, 현재 답변에서 DnOt©)˜nOt©ª같이 으로 대체하여 접근 방식에서 2 바이트를 골프 수 있습니다 . :) 그래도 당신의 사용을 좋아합니다 .D.
Kevin Cruijssen

0

펄 6 , 99 바이트

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

온라인으로 사용해보십시오!

두 개의 숫자를 가져 와서 줄 바꿈과 3 개의 선행 공백 및 각 줄마다 하나의 후행으로 전체 문자열을 반환하는 익명 코드 블록.

우리가 아닌 다른 문자를 사용할 수 있다면 #, 그때 대체하여 바이트를 저장할 수 있습니다 '#'\*.


0

C # (. NET 코어) , 221 , 194 바이트

너무 길다 이 버전은 문자열을 구성하기 위해 반복됩니다.

편집 : ASCII-직렬 문자 추가를 위해 문자열 생성자를 사용하여 멋진 -27 바이트 골프에서만! 또한 지적하기 위해 ty는 System.Math.Sqrt가 아닌 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 전용
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.