2進数表示プログラム

電子計算機基礎という授業で、10進数で入力される数字を2進表記で出力するプログラムをC言語で作成しなさいという問題が出ました。
普通にやっても面白くないので、ショートコーディングしてみました。

具体的なルールは以下の通り。

  • 複数のデータセットが与えられる
  • 1〜32767の数は2進表記で入力と同じ値を出力
  • 負の数や32768以上の値は"E"と出力
  • 0で終了
  • no leading zeros
main(i,n,a,b)
{
	for(;b=!scanf("%d",&n),n;puts(i<14?"":"E"))
		for(i=32;(b|=a=(n>>--i)&1)?~i&&i<15&&putchar(a+48):~i;);
}

改行・Tabを消去して114Bytes。
100Bytes以下にできたら先輩に寿司を奢ってもらう約束だったけど叶いませんでしたorz

外積と行列式

最近、電磁気の勉強をしていて、ベクトルの外積が行列式で表されることを知りました。


ベクトルの外積とは、ベクトルの掛け算のようなもので、\vec{A} \times \vec{B}と表されます。
\vec{A}\vec{B}のなす角を\thetaとすると、

\vec{A}\times\vec{B}=\left|\vec{A}\right|\left|\vec{B}\right|\sin{\theta} と定義されます。
内積のcosがsinになった感じですね。


特に二次元の時は、\vec{A}=\left(a_x, a_y\right)\vec{B}=\left(b_x,b_y\right)とすると
\vec{A}\times\vec{B}=a_x b_y - a_y b_x
となり、これは二つのベクトルがなす平行四辺形の面積に等しいです。


…と、ここまでは知っていたのですが
三次元のベクトルの場合、ベクトルの外積はスカラでなくベクトルになります。
しかもそれが、
\vec{A}\times\vec{B}=\left| \begin{array}{ccc}\vec{i} & \vec{j} & \vec{k} \\a_x & a_y & a_z \\b_x & b_y & b_z \end{array} \right|
という、非常に綺麗な行列式に纏まることにびっくり。
(\vec{i},\vec{j},\vec{k}はそれぞれx方向, y方向, z方向の基本ベクトルです)


証明とかは出来ませんので省きますが、この事実に感銘を受けました。