ニコマコスの定理を視覚化する


35

ニコママスの定理は、和の二乗を立方体の和に関連付けます。

ニコマコスの定理

美しい幾何学的な視覚化があります:

可視化

課題:この視覚化の2D部分をasciiで作成します。

すべての視覚的な境界が図によって維持されていることを確認する必要があります。これは4つの「色」で行うのが最も簡単ですが、3つだけで実現することもできます(方法については、最後の例を参照してください)。4色では、2つを使用して「ストリップ」内の領域(つまり、単一の立方体を構成する異なる部分)を区別し、2つを使用して隣接するストリップを区別します。必要に応じて、4色以上を使用することもできます。これのいずれかが混乱している場合は、以下の出力例で明確にする必要があります。

入出力

入力は0より大きい単一の整数です。出力は、上記の画像の入力番号の平坦化されたグリッドに対応する、以下の例に類似したASCIIグリッドです。先頭と末尾の空白は問題ありません。

これは標準的なルールを備えたコードゴルフです。

サンプル出力

N = 1

#

N = 2

#oo   
o@@   
o@@   

N = 3

#oo+++
o@@+++
o@@+++
+++###
+++###
+++###

N = 4

#oo+++oooo
o@@+++oooo
o@@+++@@@@
+++###@@@@
+++###@@@@
+++###@@@@
oo@@@@oooo
oo@@@@oooo
oo@@@@oooo
oo@@@@oooo

N = 5

#oo+++oooo+++++
o@@+++oooo+++++
o@@+++@@@@+++++
+++###@@@@+++++
+++###@@@@+++++
+++###@@@@#####
oo@@@@oooo#####
oo@@@@oooo#####
oo@@@@oooo#####
oo@@@@oooo#####
+++++#####+++++
+++++#####+++++
+++++#####+++++
+++++#####+++++
+++++#####+++++

@BruceForteのおかげで、N = 4の3色バージョン:

#oo+++oooo
o##+++oooo
o##+++####
+++ooo####
+++ooo####
+++ooo####
oo####++++
oo####++++
oo####++++
oo####++++

6
4色の定理:D
リーキー修道女

1
N = 5の出力を追加してください。
ウリエル

1
@Uriel完了。編集をご覧ください。
ジョナ

ありがとう!また、N = 4の外側のストリップでのみ@とosを切り替えることはできますか?または、これらのテキストを別の文字セットで厳密に置き換える必要がありますか?
ウリエル

@Urielの切り替えは問題ありません。重要なのは、隣接する色が競合しないため、パターンが見えることです。
ジョナ

回答:


17

MATL30 28 27バイト

t:P"@:s:@/Xk&+@+8MPt&(]30+c

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

ボーナス機能:

  • 以下のために26のバイト、次の修正版を生成するグラフィカル出力

    t:P"@:s:@/Xk&+@+8MPt&(]1YG
    

    MATL Online試しください

  • 画像はある色のために物ggingいをしており、わずか7バイトの費用がかかります:

    t:P"@:s:@/Xk&+@+8MPt&(]1YG59Y02ZG
    

    MATL Online試しください

  • または、より長いバージョン(37バイト)を使用して、文字マトリックスが徐々に構築される方法を確認します。

    t:P"@:s:@/Xk&+@+8MPt&(t30+cD9&Xx]30+c
    

    MATL Online試しください

出力例

入力がの8場合、以下に基本バージョン、グラフィカル出力、およびカラーグラフィカル出力を示します。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

説明

一般的な手順

入力である数値行列は、外側の層から内側の層へとN段階的に構築されNます。各ステップは、前のマトリックスの内側(左上)部分を上書きします。最後に、取得したマトリックスの数値が文字に変更されます。

入力の場合4、最初の行列は

10 10  9  9  9  9  8  8  8  8
10 10  9  9  9  9  8  8  8  8
 9  9  8  8  8  8  7  7  7  7
 9  9  8  8  8  8  7  7  7  7
 9  9  8  8  8  8  7  7  7  7
 9  9  8  8  8  8  7  7  7  7
 8  8  7  7  7  7  6  6  6  6
 8  8  7  7  7  7  6  6  6  6
 8  8  7  7  7  7  6  6  6  6
 8  8  7  7  7  7  6  6  6  6

2番目のステップとして、行列

7 7 7 6 6 6
7 7 7 6 6 6
7 7 7 6 6 6
6 6 6 5 5 5
6 6 6 5 5 5
6 6 6 5 5 5

後者の上半分に上書きされます。その後、同じことが行われます

6 5 5
5 4 4
5 4 4

そして最後に

3

結果の行列は

3 5 5 6 6 6 8 8 8 8
5 4 4 6 6 6 8 8 8 8
5 4 4 6 6 6 7 7 7 7
6 6 6 5 5 5 7 7 7 7
6 6 6 5 5 5 7 7 7 7
6 6 6 5 5 5 7 7 7 7
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6

最後に、30は各エントリに追加され、結果の数値はコードポイントとして解釈され、文字に変換されます(したがって、で始まり、33に対応します!)。

中間行列の構築

入力についてNは、kfromの値を減らすことを検討しNてください1。それぞれに対してk、から整数のベクトル1には、k*(k+1)生成され、その後、各エントリはにより分割されk且つ切り上げ。例として、これは次のようになりk=4ます(k最後を除くすべてのブロックのサイズがあります)。

1 1 1 1 2 2 2 2 3 3

一方k=3、結果の場合(すべてのブロックのサイズはk):

1 1 1 2 2 2

このベクターは、ブロードキャストで要素ごとに、それ自体の転置されたコピーに追加されます。その後k、各エントリに追加されます。k=4これのために与える

6  6  6  6  7  7  7  7  8  8
6  6  6  6  7  7  7  7  8  8
6  6  6  6  7  7  7  7  8  8
6  6  6  6  7  7  7  7  8  8
7  7  7  7  8  8  8  8  9  9
7  7  7  7  8  8  8  8  9  9
7  7  7  7  8  8  8  8  9  9
7  7  7  7  8  8  8  8  9  9
8  8  8  8  9  9  9  9 10 10
8  8  8  8  9  9  9  9 10 10

これは、上記の中間行列の1つですが、水平および垂直に反転される点が異なります。したがって、残っているのは、この行列を反転し、「累積」行列の左上隅に書き込むことk=Nです。これは、最初の()ステップで空の行列に初期化されます。

コード

t       % Implicitly input N. Duplicate. The first copy of N serves as the
        % initial state of the "accumulated" matrix (size 1×1). This will be 
        % extended to size N*(N+1)/2 × N*(N+1)/2 in the first iteration
 :P     % Range and flip: generates vector [N, N-1, ..., 1]
"       % For each k in that vector
  @:    %   Push vector [1, 2, ..., k]
  s     %   Sum of this vector. This gives 1+2+···+k = k*(k+1)/2
  :     %   Range: gives vector [1, 2, ..., k*(k+1)/2]
  @/    %   Divide each entry by k
  Xk    %   Round up
  &+    %   Add vector to itself transposed, element-wise with broadcast. Gives
        %   a square matrix of size k*(k+1)/2 × k*(k+1)/2
  @+    %   Add k to each entry of the this matrix. This is the flipped
        %   intermediate matrix
  8M    %   Push vector [1, 2, ..., k*(k+1)/2] again
  Pt    %   Flip and duplicate. The two resulting, equal vectors are the row and
        %   column indices where the generated matrix will be written. Note that
        %   flipping the indices has the same effect as flipping the matrix
        %   horizontally and vertically (but it's shorter)
  &(    %   Write the (flipped) intermediate matrix into the upper-left
        %   corner of the accumulated matrix, as given by the two (flipped)
        %   index vectors 
]       % End
30+     % Add 30 to each entry of the final accumulated matrix
c       % Convert to char. Implicitly display

MATLはまったくわかりませんが、30を追加して文字に変換するのではなく、mod10を使用してバイトを節約できますか?
user2390246

あるいはMOD4 ...
user2390246

@ user2390246 1桁の数字としてそれらを保持し、charへの変換を避けることを意味しますか?数値マトリックスは数字の間にスペースを入れて印刷されるため、これは機能しません。とにかくアイデアに感謝します:
ルイスメンドー

けっこうだ。n> 226ではどうなりますか?それは有効な文字の範囲外になりませんか?(当然のことながら、タイムアウトにTIO上、私はチェックしませんでしたので)
user2390246

@ user2390246はい、入力数が多い場合は外に出ます。また、ASCII文字を考慮すると、最大コードポイントは127であるため、さらに早く外に出ます。しかし、気づいたように、それが起こる前にメモリが不足します(結果のcharマトリックスが大きすぎます)。とにかく、通常はメモリまたはデータ型の制限のために特定の入力サイズまで作業することが通常許可されます
ルイスメンドー

7

パイソン2187の 178 164 162 152バイト

Mr.Xcoderのおかげで-8バイト
、Stephenのおかげで-1バイト
、Jonathan Frechのおかげで-10バイト

g=lambda y:y>1and[l+y*f(y,i)for i,l in enumerate(g(y-1))]+y*[''.join(f(y,i)for i in range(y*-~y/2))]or['#']
f=lambda y,i:'0@+#'[(y*~-y/2%y+i)/y%2+y%2*2]

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


家に帰るときは179バイト
ミスターXcoder


1
ラムダ関数を再帰的に使用する場合、つまり、残りのコードでその名前を使用する場合、ラムダ関数の名前バイトカウントを含めないことは許可されていますか?
ジョナサンフレッチ

sum(range(y))%y->y*~-y/2%y
ジョナサンフレッチ

@JonathanFrechええ、それが再帰的なときはそこにいるに違いありません。
ロッド

7

50 46バイト

F⮌…·¹N«≔⊘×ι⊕ιθF⊕⊘ι«F§#+@⁺ικ«UO⁻θ×ικθλUOθ⁻θ×ικλ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明付きの以前の50バイトバージョン:オンラインでお試しください!

F⮌…·¹N«≔÷×ι⁺¹ι²θF⁺¹÷鲫F§#+@⁺ικ«UO⁻θ×ικθλUOθ⁻θ×ικλ

F     «     Loop over
  …·¹       Inclusive range from 1 to
     N      Input as a number
 ⮌          Reversed

   ι⁺¹        Add 1 to current index
  ×   ι       Multiply by current index
 ÷     ²      Divide by 2
≔       θ     Assign to q

F     «      Loop over
             Implicit range from 0 to
   ÷ι²       Half the current index
 ⁺¹          Plus 1

F       «    Loop over
  #+@        Literal string
 §           Circularly indexed by
     ⁺ικ     Sum of outer and inner index

    ×ικ     Multiply outer and inner index
  ⁻θ        Subtract from q
UO     θλ   Draw an oblong (q-ik, q) using that character

UOθ⁻θ×ικλ   Draw an oblong (q, q-ik) using that character

注:l文字を変数に直接割り当てることはできないので、文字を直接割り当てようとするのではなく、文字をループします。これは、Charcoalのあいまいな構造であるため、変数に直接割り当てることができません。幸いなことに、バイト数は同じです。


技術的にすることができます、その引数の順序が逆転しているので、ASCII変数(それはまだ少ないgolfyですので、それがアクセスするオペレータを必要とすることに注意してください)と
ASCIIのみ

5

C(gcc)135 128 120バイト

f(n,m,i,x,y,k){for(m=n*-~n/2,i=m*m;i--;printf("\n%d"+!!(~i%m),(x/k+y/k+k)%3))for(x=i%m,y=i/m,k=n;x>=k&y>=k;x-=k--)y-=k;}

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

3色のみを使用します。

概念的には、180度回転したグリッドで機能します。

000111
000111
000111
111220
111220
111001

そして、式に従って色を計算します:

c(x,y,n) = c(x-n,y-n,n-1)                   if x >= n and y >= n
         = (x div n + y div n + n) mod 3    otherwise


@JonathanFrechこれは有効なCではなく、で中断しgcc -O2ます。
nwellnhof

けっこうだ; モジュラス3(g(i%m,i/m,n)%3)のために、2番目のコードが3色のみで機能する可能性はありますか?
ジョナサンフレッチ

提案するx/k&&y/k代わりにx>=k&y>=k
ceilingcat

2

R131の 126 123バイト

@Giuseppeのおかげで3バイト節約

function(n){l=w=sum(1:n)
m=matrix(,l,l)
for(i in n:1){m[l:1,l:1]=outer(x<-(1:l-1)%/%i,x,`+`)+i
l=l-i}
write(m%%4,"",w,,"")}

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

これは、@ LuisMendoのMATL回答と同じアルゴリズムを使用します。唯一の違いは、文字に変換するのではなく、すべての値mod4でマトリックスが出力され、各要素が単一のASCII文字になるようにすることです。


1
123バイト!私が持っfor用-1バイト:)ループバック
ジュゼッペ・

1

Pythonの2176の 175バイト

n=input()
R,J=range,''.join;r=[]
for i in R(n+1):
 S=sum(R(i));c='AxBo'[i%2::2]
 for j in R(S):r[~j]+=c[j/i%2]*i
 r+=[J(c[-j/i%2]for j in R(S+i,0,-1))]*i
for l in r:print J(l)

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


定義J="".join;(+10バイト)し、両方"".joinのs(-2 * 7 = -14バイト)をJ(+2バイト)に置き換えると、バイトを保存できます(print; +1バイトの後に追加のスペースが必要になるため) 。
ジョナサンフレッチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.