はじめに
@pikさんの記事[Delphi][小ネタ]しかのこのこのここしたんたんのmatlab版である.
回答1
s='しかのこたん';for n=1:10 disp(s([1:4,3,4,3,4,4,1,5,6,5,6]));end
解説
s='しかのこたん';
文字列の宣言だ.s(1)が'し'であり,s(3:4)で'のこ'となる.[]で囲んでs([1:4,3,4,3,4,4,1,5,6,5,6]とすることで,'しかのこのこのここしたんたん'となる.
こいつをfor文で10回回してフィニッシュである.
回答2
s='しかのこたん';disp(repmat(s([1:4,3,4,3,4,4,1,5,6,5,6]),10,1))
次に思いついたのがこれ.
解説
repmat(hoge,10,1)
これで配列hogeを縦に10個コピーする.
TL;DR
これ以降は色々頑張ったけどむしろコード量が増えてしまって完全敗北したものである.
せっかくなので書いておくけど,まぁ蛇足である.
考え方
s='しかのこたん';
A=[ 1 0 0 0 0 0 0 0 0 1 0 0 0 0;
0 1 0 0 0 0 0 0 0 0 0 0 0 0;
0 0 1 0 1 0 1 0 0 0 0 0 0 0;
0 0 0 1 0 1 0 1 1 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 1 0 1 0;
0 0 0 0 0 0 0 0 0 0 0 1 0 1];
disp(char(ones(10,1)*s*A))
ちょっとmatlabっぽい書き方が無いかなぁと思ってやってみたのがこれ.
A=\begin{pmatrix}
1&0&0&0&0&0&0&0&0&1&0&0&0&0\\
0&1&0&0&0&0&0&0&0&0&0&0&0&0\\
0&0&1&0&1&0&1&0&0&0&0&0&0&0\\
0&0&0&1&0&1&0&1&1&0&0&0&0&0\\
0&0&0&0&0&0&0&0&0&0&1&0&1&0\\
0&0&0&0&0&0&0&0&0&0&0&1&0&1\\
\end{pmatrix}
\begin{pmatrix}
しかのこたん
\end{pmatrix}
A
=
\begin{pmatrix}
しかのこのこのここしたんたん
\end{pmatrix}
\begin{pmatrix}
1\\
1\\
1\\
1\\
1\\
1\\
1\\
1\\
1\\
1\\
\end{pmatrix}
\begin{pmatrix}
しかのこのこのここしたんたん
\end{pmatrix}
=
\begin{pmatrix}
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
\end{pmatrix}
disp(char(hoge))
文字列sにones(10,1)などをかけると全体が数値データとして認識され,これをdispに入れると数値が表示されてしまうため,char()でキャストして文字列にしてあげる.
この考え方をベースとして,コード量を減らしていく.
bitget
bitgetを使ってみる.bitgetは3などの数値を[0 0 0 0 0 0 1 1]のような2進数の配列に変換する関数である.
A_2=\begin{pmatrix}
1&0&0&0&0&0&0&0&0&1&0& \cdots & 0&1&0&1
\end{pmatrix}
行列Aを横ベクトルA2に変換して,bitget(n)=A2となるような数値nを求めて,A2を再度(6×14)の行列に直せば行けるだろう.
b= 100000000100000\cdots 101
として,bを求めようと思ったが,bは84桁あり,matlabは64bitまでしか対応していないのでこのままでは実装出来ない.
A=\begin{pmatrix}
1&0&0&0\\
0&1&0&0\\
0&0&1&0\\
0&0&0&1\\
0&0&0&0\\
0&0&0&0\\
\end{pmatrix}
,
\begin{pmatrix}
0&0&0&0&0&1&0&0&0&0\\
0&0&0&0&0&0&0&0&0&0\\
1&0&1&0&0&0&0&0&0&0\\
0&1&0&1&1&0&0&0&0&0\\
0&0&0&0&0&0&1&0&1&0\\
0&0&0&0&0&0&0&1&0&1\\
\end{pmatrix}
として右側・左側に分離すると,左側は単位行列っぽいやつになる.これはeyeで作り出せる.
eye(6,4)
残った右側は60bitであり,matlabで扱える桁数となった.実装した結果が以下である.
s='しかのこたん';
disp(char(ones(10,1)*s*[eye(6,4),reshape(double(bitget(0x810810048204204,1:60)),6,[])]))
解説
[eye(6,4),reshape(double(bitget(0x810810048204204,1:60)),6,[])]
これがAである.
bitget(0x810810048204204,1:60)),6,[])の時点では型がuint64であり,sとの乗算が出来ないため,doubleでキャストしている.
終わり
matlabなーんも分からんくて泣いちゃった.
つよつよmatlabエンジニャーにもっと凄いコードを書いていただきたく.