ハイパーキューブを回転させる


27

前書き

ハイパーキューブ/テセラクトは、通常のキューブに相当する4次元です。キューブネットを取得して3次元に拡張し、4次元を使用してハイパーキューブに折り畳むことで作成されます。基本的には立方体で、各辺は立方体です。

ハイパーキューブを作成するには、16個の4Dベクトル(のベクトルを必要とするxyzおよびwコンポーネント)。これらのベクトルは次のとおりです。

A(0, 0, 0, 0); B(1, 0, 0, 0); C(1, 0, 1, 0); D(0, 0, 1, 0); E(0, 1, 0, 0); F(1, 1, 0, 0); G(1, 1, 1, 0); H(0, 1, 1, 0); 
I(0, 0, 0, 1); J(1, 0, 0, 1); K(1, 0, 1, 1); L(0, 0, 1, 1); M(0, 1, 0, 1); N(1, 1, 0, 1); O(1, 1, 1, 1); P(0, 1, 1, 1);

ハイパーキューブには24の面があります。次のリストには、それらすべてが含まれています(すべてのグループがクワッドをマークします)。

ABFE, CDHG, BCGF, DAEH, DCBA, FEHG
IJNM, KLPO, JKON, LIMP, LKJI, PMNO
ABJI, DCKL, BCKJ, DAIL, FEMN, GHPO, FGON, EHPM, EAIM, BFNJ, CGOK, HDLP

これらすべての情報を使用して、技術的にコード内にハイパーキューブを作成します。これを回転するには、YZ、XZ、XY、XW、YW、ZW平面にそれぞれ1つずつ、6つの異なる回転平面に異なるマトリックスが必要です。すべてのマトリックスを作成したら、キューブの頂点にそれらを乗算する必要があります。

次の画像は、各マトリックスの構造を示しています。

YZ平面上の回転の場合:

XZ平面上の回転の場合:

XY平面での回転の場合:

XW平面上の回転の場合:

YW平面上の回転の場合:

ZW平面上の回転の場合:

回転はこの順序で適用されます。

結局、回転したハイパーキューブができました。今、あなたはそれを描く必要があります。に送信(x, y, z, w)するには、透視投影と組み合わせた直交投影を使用する必要があります(2x/(2+z), 2y/(2+z))

入力

入力は、0(包括的)から360(排他的)までの6つの整数です。これらは、ハイパーキューブのさまざまな回転面での回転を度単位で表します。

出力

出力は、ハイパーキューブを含む単一の画像である必要があります。表示は、ラスタライズされた画像、ベクター画像、またはASCIIアートです。出力画像は少なくとも100 * 100ピクセルである必要があり、キューブは画面の少なくとも50%を占める必要があります。デフォルトの画像出力形式はすべて許可されます。

テストケース

0 0 0 0 0 0

0 0 0 0 0 30

30 0 0 0 0 30

0 0 0 30 30 30

45 45 45 0 0 0

45 45 45 45 45 45

画像を新しいタブで開き、フルサイズで表示します。

ルール

  • デフォルトのルールが適用されます
  • 標準的な抜け穴は禁止されています
  • バイト単位の最短コードが勝つ

なぜ他の投稿を破棄したのですか?
Rɪᴋᴇʀ

EᴀsᴛᴇʀʟʏIʀᴋ@私は最後のレビューのためのチャットでそれを掲示
バリント

7
サンドボックスで2つの別々の機会に指摘したように、表示される投影の説明は不完全です。投影されるオブジェクトが3次元であるのに対して、実際には明らかに4次元であると仮定しているためです。
ピーターテイラー

2
@luserdroog「U」は「N」でなければなりません。
ビーカー

2
@Bálint挑戦してくれてありがとう、私はそれを楽しんだ。より多くの回答と異なるアプローチが得られることを願っています。:D
ビーカー

回答:


9

オクターブ、474の 433 429バイト

function H(a,b,c,d,e,f) C=@cosd;S=@sind;R=[1,0,0,0;0,C(e),0,-S(e);0,-S(e)*S(f),C(f),-C(e)*S(f);0,S(e)*C(f),S(f),C(e)*C(f)]*[C(c)*C(d),-S(c)*C(d),0,S(d);S(c),C(c),0,0;0,0,1,0;-C(c)*S(d),S(c)*S(d),0,C(d)]*[C(b),S(a)*S(b),C(a)*S(b),0;0,C(a),-S(a),0;-S(b),S(a)*C(b),C(a)*C(b),0;0,0,0,1]*(dec2bin(0:15)'-48.5);Z=R(3,:)+2;R=2*R./Z;Q=[1,2,10,12,11,9,10,14,16,12,4,8,16,15,11,3,7,15,13,9,1,5,13,14,6,8,7,5,6,2,4,3,1];plot(R(1,Q),R(2,Q));

回転:

function H(a,b,c,d,e,f) 
C=@cosd;S=@sind;
R=[1,0,0,0;0,C(e),0,-S(e);0,-S(e)*S(f),C(f),-C(e)*S(f);0,S(e)*C(f),S(f),C(e)*C(f)]*
  [C(c)*C(d),-S(c)*C(d),0,S(d);S(c),C(c),0,0;0,0,1,0;-C(c)*S(d),S(c)*S(d),0,C(d)]*
  [C(b),S(a)*S(b),C(a)*S(b),0;0,C(a),-S(a),0;-S(b),S(a)*C(b),C(a)*C(b),0;0,0,0,1]*
  (dec2bin(0:15)'-48.5);
Z=R(3,:)+2;
R=2*R./Z;
Q=[1,2,10,12,11,9,10,14,16,12,4,8,16,15,11,3,7,15,13,9,1,5,13,14,6,8,7,5,6,2,4,3,1];
plot(R(1,Q),R(2,Q));

回転行列は依然として多くのバイトを消費しますが、オイラーサイクルは非常にうまく機能し、訪問される頂点の数を96 120から33 に減らしました。

頂点は、4ビットのバイナリ表現を取り、[0:15]msbをx座標、lsbをw座標と見なすことによって生成されます。

編集:すべての回転行列を事前に乗算するのは悪夢でした。そのため、最初はそれを使用しませんでしたが、ペアで事前に乗算すると41バイト節約されました。次に、最適な組み合わせを探します。:)行列を3で乗算することは、事前乗算をまったく行わないことよりも悪いので、ペアワイズアプローチに満足します。


出力:

H(0,0,0,0,0,0)

H(0,0,0,0,0,0)

H(0,0,0,0,0,30)

H(0,0,0,0,0,30)

H(30,0,0,0,0,30)

H(30,0,0,0,0,30)

H(0,0,0,30,30,30)

H(0,0,0,30,30,30)

H(45,45,45,0,0,0)

H(45,45,45,0,0,0)

H(45,45,45,45,45,45)

H(45、45、45、45、45、45、45)


編集:私は愚かだ。どこでも同じ変数にだまされて... [完全に事前乗算された行列が必要ないのは確かですか?:) i.imgur.com/nkM6y6g.png]
algmyr

@algmyrええ、正しく覚えていれば、完全に乗算された行列は約2倍の長さになりました。
ビーカー

これはもっと似ているはずです。Maxima
algmyr

:数学で悲惨な失敗を補うため、ここではあなたのコードの多くのgolfedバージョンがあり、330バイトにpaste.ee/p/2GRyJ
algmyr

14

追記 1075 732 683 640 631 601 590 545 542 526 514 478 470

mat.psGを使用します。

編集:-343ベクトルおよびオイラー回路のバイナリエンコード生成の適用盗まれた他の答えから借りました。そして、Gライブラリからのバイナリトークン文字列を適用しました。
編集:-49再定義さsin cosneg、短い名前に。
編集:-43シーケンスの短縮名を定義しました0 0 0 1 1 0
編集:-9 al(つまりaload)は未満(")@です。織り込ま3の呼び出しidi(すなわち。idiv)がdo-nothingのコストで1 idiv
編集:-30 Gの暗黙的な定義ブロックを適用しました。
編集:-10いくつかの三重に使用されるシーケンス。
編集:-45i j k l m n角度の変数を削除し、常に現在の角度を定義し、角度のt関数は(グローバル)の値を使用しますt変数。t値の準備ができるまで、回転行列のコード記述の実行を延期します。
編集:-3削除し<16>$ます。closepath。そしてスペース。
編集:-16回転行列(J K LおよびM)の単位ベクトルから因子分解配列ブラケット。およびの再申請を削除moしました。編集:-12 プロジェクトと描画関数をインライン化し、囲んでいる辞書を削除します(空になります)。編集:-36文字列で回路(つまり、)をエンコードします。編集:-8頂点配列の定義を削除します。代わりに、スタックに残してmodsusub


Vdup必要に応じて作業コピー(1回、最初、およびループの最後)。また、いくつかの演算子をバイナリトークン文字列から、BTSが節約しない短縮名に変換したため(I)$、現在fora(つまりforall)です。if du可能性がありますが(T8)$if du明らかにより良い選択です(それはゴルフです。難読化自体ではありません)。また、scale beforeを 実行するtranslateと、変換された座標は3andの4代わりに300andの代わりになり400ます。

(mat.ps)run 3(G)run $
t sin
A neg
t cos
0 0
0 1
1 0
2 mu Z 2(!V)@
idi 2 mo .5 su
(>8)$
[F D]
[D E]
[E D]
[D F]

3 4 100(&>88)$(,)# div(<N)#[E 15{[I 1 H I 2 H I 4 H ex 8 H]}fo]E
5{ARGUMENTS 1(XK/)$/t ex d{{J[0 C B 0][0 A C 0]K}{[C 0 A 0]L[B 0
C 0]K}{[C B D][A C D]M K}{[C D A]L M[B D C]}{J[0 C 0 B]M[0 A 0
C]}{J L[D C B][D A C]}}(>K)$[(>?)$]transpose matmul}fo
du(019;:89=?;37?>:26><804<=576451320){48 su get al po{W
Z Y X}{(>3)$}fora X G Y G{li}(D)#{mov}if du}fora(HB)#

3 4そして100第二のブロックの最初の行には、ページ上の図の(中心座標によってスケーリングされ、それぞれ、中心X、中心Yおよびスケールを表すパラメータですscale)。(300,400)は、PSユニットでの米国のレターサイズの用紙(612,792)のほぼ中心です。

おおまかに追記できれば、重要な奇妙なことは暗黙の手続きブロックとエンコードされた演算子文字列です。以下のワークファイルのコメントで示されているように、最初のブロックの各行には、A、B、Cなどによって暗黙的に名前が付けられています。F E Dを生成し1 0 0 1 0 0ます。エンコードされた演算子文字列の場合、システム名テーブルから演算子を選択するためにバイトを使用する、PLRM 3ed付録Fの引数である$ #@、一連の演算子呼び出しです。これらの機能などは、Gライブラリ( mat.ps関数も含まれるようになりました)。

ワークファイル:

(mat.ps)run 3(G)run $
t sin %/A
A neg %/B
t cos %/C
0 0 %/D
0 1 %/E
1 0 %/F
2 mu Z 2(!V)@ %/G  %ad div %add div %108 1 54
idi 2 mo .5 su %idiv mod sub %/H %106 169 51
(>8)$ %/I %exch dup
[F D] %/J
[D E] %/K
[E D] %/L
[D F] %/M


3 4
100(&>88)$ %currentlinewidth exch dup dup %38
(,)#  %scale %139-95=44
div(<N)# %div setlinewidth %54 155-95=60 %translate %173-95=78
%/V
[E 15{[ I
    1 H I
    2 H I
    4 H ex
    8 H]}fo]

E 5{ARGUMENTS 1(XK/)$ %index get cvr %88 75 47
    /t ex d %exch def %62 51
    {{J[0 C B 0][0 A C 0]K} 
     {[C 0 A 0]L[B 0 C 0]K} 
     {[C B D][A C D]M K} 
     {[C D A]L M[B D C]}
     {J[0 C 0 B]M[0 A 0 C]}
     {J L[D C B][D A C]}}
    (>K)$ %exch get %62 75
    [
        (>?)$ %exch exec %62 63
    ]
    transpose matmul
}fo %for
du %dup
%d %def
%{transpose matmul}fora d

%[E 9 11 10 8 9 13 15 11 3 7 15 14 10 2 6 14 12 8 0 4 12 13 5 7 6 4 5 1 3 2 0]
%<0001090b0a08090d0f0b03070f0e0a02060e0c0800040c0d050706040501030200>
%          abcdef
%0123456789:;<=>?
(019;:89=?;37?>:26><804<=576451320)
{48 su get % 169 75 %V (>K)$ %sub %exch get

    al po %aload pop %2 117
    {W Z Y X}{(>3)$ %exch def
    }fora %forall %2 117  62 51 73
    X G
    Y G
    {li}(D)# %stopped
    {mov}
    if du%(T8)$ %if %84 du %dup 56
}
%<49a7a1>$ %forall stroke showpage %73 167-95=72 161-95=66
fora(HB)#

Ungolfedと軽くコメント:

300 400 translate   %roughly center of letter paper
currentlinewidth
100 dup dup scale
div setlinewidth    %scale x100, reduce line-width/100
(mat.ps)run         %load matrix library
ARGUMENTS aload pop{f e d c b a}{exch cvr def}forall  %define args as 
                                 % a,b,etc and convert to real numbers
/m{2 mod .5 sub}def
/P{aload pop{w z y x}{exch def}forall   %P: [x y z w]  project-and-draw  -
    x 2 mul z 2 add div 
    y 2 mul z 2 add div 
    {lineto}stopped{moveto}if %catch(&handle!) nocurrentpoint error in lineto
}bind def
/V[0 1 15{    % generate vectors with a for-loop
    [ exch
        dup m
        1 index 2 idiv m
        2 index 4 idiv m
        4 3 roll 8 idiv m
    ]
}for]
[[[1 0 0 0][0 a cos a sin neg 0][0 a sin a cos 0][0 0 0 1]] 
     [[b cos 0 b sin 0][0 1 0 0][b sin neg 0 b cos 0][0 0 0 1]] 
     [[c cos c sin neg 0 0][c sin c cos 0 0][0 0 1 0][0 0 0 1]] 
     [[d cos 0 0 d sin][0 1 0 0][0 0 1 0][d sin neg 0 0 d cos]]
     [[1 0 0 0][0 e cos 0 e sin neg][0 0 1 0][0 e sin 0 e cos]]
     [[1 0 0 0][0 1 0 0][0 0 f cos f sin neg][0 0 f sin f cos]]]
{transpose matmul} forall def   % apply array of rotations and define

%Eulerian circuit (borrowed and adjusted for 0-based indexing)
[0 1 9 11 10 8 9 13 15 11 3 7 15 14 10 2 6 14 12 8 0 4 12 13 5 7 6 4 5 1 3 2 0]

% the main program!
% on the stack is the Eulerian circuit array
{
    V exch get  %lookup index in (sextuply-transformed) vertex array
    P           %call project-and-draw
} forall
closepath stroke %draw it, don't just think about it

showpage % gs's cmd-line-args option automatically sets -dBATCH,
    % so without a showpage, gs will immediately exit before you
    % can look at the picture :(

私の出力のいくつかは、質問の例の鏡像です。

のためにgs -- hc.ps 0 0 0 0 0 0、私は得る:
ここに画像の説明を入力してください

gs -- hc.ps 0 0 0 0 0 30
ここに画像の説明を入力してください

gs -- hc.ps 30 0 0 0 0 30
ここに画像の説明を入力してください

gs -- hc.ps 0 0 0 30 30 30
ここに画像の説明を入力してください

gs -- hc.ps 45 45 45 0 0 0
ここに画像の説明を入力してください

gs -- hc.ps 45 45 45 45 45 45
ここに画像の説明を入力してください

このプログラムで作成したボーナスアニメーション。この画像は、回転シーケンス0 30 60 0 i iに対応します。ここで、iは0〜360 x 2の範囲です。
ここに画像の説明を入力してください


2
ワオ。数学的な問題に対するPostScriptの回答。
TuxCrafting

@TùxCräftîñgこの質問には、行列の乗算を簡単に行える限り、それほど多くの数学はありません。そして、私はAK DewdneyのThe Armchair Universeを読んで以来、このプログラムを書きたかったのです。
luserはドローグ

Gライブラリに新しい関数を追加しました。ここでは使用できませんが、この307バイトバージョンを使用できます。
luserはドローグ

8

C#+ Unity、1060 845 835バイト

C#≈Java

この関数はに置かれたスクリプト内にあると仮定しMainCameraます。

編集:
19バイトを保存するための提案をしてくれた@TuukkaXに感謝します。

ゴルフ:

void d(float[]r){transform.position=Vector3.back*2;GetComponent<Camera>().backgroundColor=Color.black;Vector4[]p=new Vector4[16];Matrix4x4[]m=new Matrix4x4[6];int i=0;for(;i<16;i++)p[i]=new Vector4(i%2,i/2%2,i/4%2,i/8%2)-new Vector4(.5f,.5f,.5f,.5f);int[,]X={{6,8,1,12,7,11},{5,0,0,0,5,10},{10,10,5,15,15,15}};for(i=0;i<6;i++){m[i]=Matrix4x4.identity;r[i]=Mathf.Deg2Rad*r[i];float c=Mathf.Cos(r[i]),s=Mathf.Sin(r[i]);m[i][X[1,i]]=c;m[i][X[2,i]]=c;m[i][X[0,i]]=s;m[i][X[0,i]%4*4+X[0,i]/4]=-s;}for(i=0;i<16;i++)foreach(Matrix4x4 x in m)p[i]=x*p[i];int[]F={0,1,9,11,10,8,9,13,15,11,3,7,15,14,10,2,6,14,12,8,0,4,12,13,5,7,6,4,5,1,3,2,0};LineRenderer l=new GameObject().AddComponent<LineRenderer>();l.SetVertexCount(33);l.material=new Material(Shader.Find("Sprites/Default"));l.SetWidth(.03f,.03f);for(i=0;i<33;i++)l.SetPosition(i,p[F[i]]);

改行+インデント+フルシェル:

using UnityEngine;
using System.Collections;

public class h : MonoBehaviour {

    void d(float[]r)
    {
        transform.position=Vector3.back*2.5f;
        GetComponent<Camera>().backgroundColor=Color.black;
        Vector4[]p=new Vector4[16];
        Matrix4x4[]m=new Matrix4x4[6];
        int i=0;
        for(;i<16;i++)p[i]=new Vector4(i%2,i/2%2,i/4%2,i/8%2)-new Vector4(.5f,.5f,.5f,.5f);
        int[,]X={{6,8,1,12,7,11},{5,0,0,0,5,10},{10,10,5,15,15,15}};
        for (i=0;i<6;i++){
            m[i]=Matrix4x4.identity;
            r[i]=Mathf.Deg2Rad*r[i];
            float c=Mathf.Cos(r[i]);
            float s=Mathf.Sin(r[i]);
            m[i][X[1,i]]=c;
            m[i][X[2,i]]=c;
            m[i][X[0,i]]=s;
            m[i][X[0,i]%4*4+X[0,i]/4]=-s;
        }
        for (i=0;i<16;i++)foreach(Matrix4x4 x in m)p[i]=x*p[i];
        int[]F={0,1,9,11,10,8,9,13,15,11,3,7,15,14,10,2,6,14,12,8,0,4,12,13,5,7,6,4,5,1,3,2,0};
        LineRenderer l=new GameObject().AddComponent<LineRenderer>();
        l.SetVertexCount(33);
        l.material=new Material(Shader.Find("Sprites/Default"));
        l.SetWidth(.03f,.03f);
        for (i=0;i<33;i++)
            l.SetPosition(i,p[F[i]]);
        l.gameObject.tag = "Player";
    }
    public float[] input;
    void Start()
    {
        d(input);
    }
}

回転行列を構成するための簡単な式も、描画する「面」もわかりませんでした。そのため、ハードコードに多くのバイトがかかりました。@beakerからオイラーサイクルを借りました。また、Unityビルトインは非常に冗長です。

すべてのテストケースをオンラインで確認できます


ここでC#+ Unityの回答を見たのは初めてです。+1
DanTheMan

私はすべてが思う0.5fに減少させることができる.5f0.01fします.01f。また、整数配列はint[]複数回言う代わりにコンマで区切ることができると思います。
Yytsi

@ブルーああ、あなたは正しい!C#をしばらく使用していないので、最後のヒントはわかりませんでした。
-Yytsi

@TuukkaX以前のコメントを無視して、を使用できますint[,]。それでも、ありがとう。
ブルー

あなたはまだVector4(0.5f,0.5f,0.5f,0.5f)に減らすことができるを持っていVector4(.5f,.5f,.5f,.5f)ます。
Yytsi

6

Javascript ES6、584バイト

f=(...R)=>(P=s=>[...s].map(i=>parseInt(i,16)),C=document.createElement`canvas`,X=C.getContext`2d`,X.translate((C.width=300)/2,(C.height=300)/2),X.lineWidth=0.01,X.scale(100,100),X.beginPath(),P("0267fd9804c8ab915dcefb37546ea2310").map((e,i)=>{[x,y,z]=P("084c2a6e195d3b7f").map(i=>[...(1e3+i.toString(2)).slice(-4)].map(i=>i-0.5)).map(e=>(R.map((R,i,_,M=Math,C=M.cos(r=R*M.PI/180),S=M.sin(r))=>((a,b,s=1)=>[e[a],e[b]]=[C*e[a]-s*S*e[b],s*S*e[a]+C*e[b]])(...[[1,2],[0,2,-1],[0,1],[0,3,-1],[1,3],[2,3]][i])),e))[e];[x,y]=[2*x/(2+z),2*y/(2+z)];i?X.lineTo(x,y):X.moveTo(x,y)}),X.stroke(),C)

「Ungolfed」:

f=(...R)=>(                                                              // function that accepts rotations in the following form: f(a,b,c,d,e,f)
    P=s=>[...s].map(i=>parseInt(i,16)),                                  // function to convert strings to hex-arrays
    V=P("084c2a6e195d3b7f")                                              // vertices encoded as hex values ( [0,1,1,0] -> 6 )
        .map(i=>[...(1e3+i.toString(2)).slice(-4)].map(i=>i-0.5))        // convert hex values to vertices, center the hypercube
        .map(e=>(R.map((R,i,_,M=Math,C=M.cos(r=R*M.PI/180),S=M.sin(r))=> // convert angles to degrees, precalculate sin and cos values
        ((a,b,s=1)=>[e[a],e[b]]=[C*e[a]-s*S*e[b],s*S*e[a]+C*e[b]])       // apply matrix transforms to all vertices
        (...[[1,2],[0,2,-1],[0,1],[0,3,-1],[1,3],[2,3]][i])),e)),        // list of encoded matrix transforms
    C=document.createElement`canvas`,X=C.getContext`2d`,                 // create image to draw on
    X.translate((C.width=300)/2,(C.height=300)/2),                       // setup image dimensions, center transform
    X.lineWidth=0.01,X.scale(100,100),X.beginPath(),                     // setup line, scale the transform and begin drawing
    P("0267fd9804c8ab915dcefb37546ea2310").map((e,i)=>{                  // hypercube edge path indices encoded as hex values
        [x,y,z]=V[e];[x,y]=[2*x/(2+z),2*y/(2+z)];                        // project vertex
        i?X.lineTo(x,y):X.moveTo(x,y)}),X.stroke(),                      // draw vertex
    C)                                                                   // return image

実際の動作を確認してください(継続的に回転するように変更されています):

with(document)with(Math)with(document.getElementById`canvas`)with(getContext`2d`){render=()=>{requestAnimationFrame(render);clearRect(0,0,width,height);save();K=performance.now();R=[K*0.01,K*0.02,K*0.03,K*0.04,K*0.05,K*0.06];X=s=>[...s].map(i=>parseInt(i,16));V=X("084c2a6e195d3b7f").map(i=>[...(1e3+i.toString(2)).slice(-4)].map(i=>i-0.5)).map(e=>(R.map((R,i,_,C=cos(r=R*PI/180),S=sin(r))=>((a,b,s=1)=>[e[a],e[b]]=[C*e[a]-s*S*e[b],s*S*e[a]+C*e[b]])(...[[1,2],[0,2,-1],[0,1],[0,3,-1],[1,3],[2,3]][i])),e));translate((width=300)/2,(height=300)/2);lineWidth=0.01;scale(100,100);beginPath();X("0267fd9804c8ab915dcefb37546ea2310").map((e,i)=>{[x,y,z]=V[e];[x,y]=[2*x/(2+z),2*y/(2+z)];i?lineTo(x,y):moveTo(x,y)});stroke();restore();};render();}
<html><body><canvas id="canvas"></canvas></body></html>

この関数はHTML5キャンバスオブジェクトを返しますdocument.body.appendChild(f(0,0,0,0,0,0))。たとえば、これをページに追加する必要があります。

現在、回転は順不同で適用されており、並べ替えに取り組んでいますが、そのままでは、ハイパーキューブが正しく回転します。


賢い、あなたがマトリックス変換で何をしていたかを理解するのに少し時間がかかりました。:Dまた、コードスニペットを動作させることができません...役に立たない "スクリプトエラー"が表示されています。行0。–
ビーカー

@beakerどのブラウザを使用していますか?最新のFirefoxでテストしました。
デンドロビウム

Safari 9.1.1を使用しています。別のものを試してみましょう。
ビーカー

1
はい、Chromeは問題なく動作します。
ビーカー

1
Safariはがらくたです。何かが機能するかどうかを確認するために使用しないでください。
パトリックロバーツ

1

Mathematica、453 415バイト*

オイラーツアーを使用して短縮し、変数で関数を定義せずにすべてを1つのステートメントに整理します。これにより、何らかの理由でコードが遅くなります。Mathematicaは変​​数に保存されていないため、関数が複数回再評価されると思います。

Graphics[Line[Table[{2#/(2+#3),2#2/(2+#3)}&@@Map[Dot@@Table[Table[If[n==m==#2||n==m==#,Cos[#3],If[n==#2&&m==#,If[#2==1&&(#==3||#==4),1,-1]Sin[#3],If[n==#&&m==#2,If[#2==1&&(#==3||#==4),-1,1]Sin[#3],If[n==m,1,0]]]],{n,4},{m,4}]&[k[[1]],k[[2]],a[[k[[3]]]]°],{k,{{4,3,6},{4,2,5},{4,1,4},{2,1,3},{3,1,2},{3,2,1}}}].#&,Tuples[{0,1},4]-.5,{1}][[i]],{i,{1,2,10,12,11,9,10,14,16,12,4,8,16,15,11,3,7,15,13,9,1,5,13,14,6,8,7,5,6,2,4,3,1}}]]]

* Mathematicaでは単一の文字として表されているため、それぞれをシングルバイトとして数え°==います。多くの言語が奇妙な文字エンコーディングを使用しているため、これは公平だと思います。

コメントなしでゴルフ。入力は、上部でとしてハードコーディングされていa={30,0,0,0,0,30};ます。私はそれを私のスコアに数えませんでした。


a = {45, 45, 45, 45, 45, 45};



(* #2,#-th rotation matrix as a funciton of #3 *)
(* Using the \
#-notation saved 6 bytes over the more common function definition \
notation*)
r = 
  Table[If[n == m == #2 || n == m == #, Cos[#3], 
     If[n == #2 && m == #, 
      If[#2 == 1 && (# == 3 || # == 4), 1, -1] Sin[#3], 
      If[n == # && m == #2, 
       If[#2 == 1 && (# == 3 || # == 4), -1, 1] Sin[#3], 
       If[n == m, 1, 0]]]], {n, 4}, {m, 4}] &;

(* Total rotation matrix. Need six of them. Function of the six \
angles to rotate.*)

u = Dot @@ 
     Table[r[k[[1]], 
       k[[2]], \[Degree]*
        a[[k[[3]]]]], {k, {{4, 3, 6}, {4, 2, 5}, {4, 1, 4}, {2, 1, 
         3}, {3, 1, 2}, {3, 2, 1}}}].# &;



(* List of all vertices of the hypercube *)
t = Tuples[{0, 1}, 4];
t -= .5;
v = Map[u, t, {1}];

(*projection*)
p = {2 #/(2 + #3), 2 #2/(2 + #3)} &;

(*Eulerian tour*)

l = Table[
   p @@ v[[i]], {i, {1, 2, 10, 12, 11, 9, 10, 14, 16, 12, 4, 8, 16, 
     15, 11, 3, 7, 15, 13, 9, 1, 5, 13, 14, 6, 8, 7, 5, 6, 2, 4, 3, 
     1}}];
Graphics[Line[l]]

0 0 0 0 0 30

0 0 0 30 30 30

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

405 10 -14 -8 -9 205

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.