ピタゴラスの定理を視覚的に説明する


36

ピタゴラスの定理の一般的な視覚的説明は次のとおりです。

3箱

正方形はa + b = c、ピタゴラスの定理が言うように、辺の長さの2乗との面積を表すことを意図しています。

この部分はあなたが見せなければならないものです。

あなたのタスク

  • 入力として2つの整数を取得します。これは、辺ab直角三角形(例:)を表すためのもの3, 4です。
  • その後、長さのうちの正方形を作るだろうabcのうちの#文字。たとえば、ここは3です。
###
###
###
  • 次に、これらを特定のピタゴラスのトリプレットを説明する数式にフォーマットします。
             #####
      ####   #####
###   ####   #####
###   ####   #####
### + #### = #####
  • =+記号の両側にスペースがあり、すべてが下にあることに注意してください。
  • あなたは、の値を取得することはありませんabのメイクというc非整数。
  • これはので、バイト単位の最短コードが勝ちです!

テストケース

(時間ができたらもっと来る、これらは手で作るのは本当に難しい)

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

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

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

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

3
@bmarks「cを非整数にするaとbの値を取得することはありません。」
マルティセン

2
@RetoKoradi 広場エリアa+b=c
Maltysen

1
場合ab及びc正方形の領域として定義され、その後の実施例は、間違っています。
レトコラディ

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、134の 100バイト

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

グレン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 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が言うように小さな問題があります:「=および+記号の両側にスペースがあり、すべてが下にあることに注意してください。」
レオラム

1
このスニペットは、Firefox 40.0.3(Windows 7x64 SP1)では機能しません。
イスマエルミゲル

1
スニペットがChromium 44 Linux x64で機能しない
ネノトレップ

2
これらの後者の例はかかわらず、正しく処理するために必要ありません@IsmaelMiguel:「あなたはの値を取得することはありませんaし、bそのメイクc。非整数」
DLosc

2
evalの素晴らしい使用法を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あなたの最後のコメントに、実際にはできません。なぜなら、の最初の出現は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)

私はRubyを知りませんが、RubyソリューションはPythonソリューションに打ち勝つことが多いので、これが短くなる可能性があると思います(私の事例では)。まず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を使用すると、3番目のパラメーターを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

-3 Dyalog APLの拡張機能のため。

匿名プレフィックスラムダ:

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

オンラインでお試しください!

{} "dfn"; 引数(サイドの長さ)

⍵*2 平方

+/ 和

 平方根

⍵, 引数を追加

{ 次の匿名ラムダをそれぞれに適用します

  # ルート名前空間

   テキストとしてフォーマット

  ⍵ ⍵⍴ 2回の引数を使用してRのこれらの次元の行列にeshape。

 列にする

' ++=', これらの3文字を3行に追加します

, 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)について、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
  • 編集1:読みを簡素化
  • Edit2:空白を削除しました
  • Edit3:別の答えにio触発された関数のエイリアス抽象化

1

、24バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。入力を2つの要素の配列として受け取ります。説明:

⊞θ₂ΣXθ²

入力に斜辺を追加します。

F =+«

各正方形の右側に表示される文字を逆順にループします。

←←←ι←

その文字をスペースを空けて左に印刷します。

G↑←↓⊟θ#

配列から最後の数値をポップし、#そのサイズのsの正方形を出力します。


1
@KevinCruijssenおっ、なんて見落とした!今すぐ修正する必要があります。
ニール

1

PowerShell139 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ハハ、おっと
Veskah

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„=+`.;

入力を2つの数値のリスト(つまり[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}ø»+とに気付くまでは私の試みでした=
マジックタコop

うん@MagicOctopusUrn、これらの3つのスペースと+し、=実際のコードの大部分を担当しています。ところで、現在の回答で行ったように、に置き換えることDnOt©)˜nOt©ª、アプローチで2バイトをゴルフできます。:)の使用が好き.Dです。
ケビンクルーイッセン

0

Perl 6、99バイト

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

オンラインでお試しください!

2つの数値を受け取り、先頭の改行と3つの先頭のスペースと各行の末尾に1つを含む完全な文字列を返す匿名コードブロック。

の代わりに他の文字を使用できる場合は#、に置き換えること'#'でバイトを保存できます\*


0

C#(.NETコア)221、194のバイト

これは長すぎます。このバージョンは、単にループして文字列を作成します。

編集:シリアル文字の追加に文字列コンストラクターを使用した素敵な-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のみの



一つのこと、私がしたいすべてのusingディレクティブを削除し、私はミスをしなかったことを確認する
ASCIIのみ

1
あなたは、もはや私は考えていない三元バージョンを持っていないので、ああ、あなたはもうそれを言及する必要があります
ASCIIのみの
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.