2011/08/16

TeXでナベアツ

以下の動作を行うマクロ \NabeAzz を作れ。
http://d.hatena.ne.jp/zrbabbler/20110815/1313398638


一晩すぎたっぽいし、回答例アップしてもいいよね。
\newcount\n \newcount\i
\newcount\r \newcount\q
\newcount\a \newcount\b
\newcount\d
\font\cmfi=cmfi10 at 12pt

\newif\ifhasdigit
\def\hasdigit#1#2{\d=#1 \r=10 \q=#2 \a=\q
\divide\q by \r
\b=\q \multiply\b by -\r
\advance\a by\b
\ifnum\a=\d \hasdigittrue
\else \ifnum\q=0 \hasdigitfalse
\else \hasdigit{\d}{\q}\fi\fi}

\newif\ifdividep
\def\dividep#1#2{\r=#1 \q=#2 \a=\q
\divide\q by \r
\b=\q \multiply\b by -\r
\advance\a by\b
\ifnum0=\a \divideptrue
\else \dividepfalse \fi}

\def\NabeAzz#1{\n=#1 \i=1
\loop \ifnum\i<\n
\hasdigit{3}{\i}\dividep{3}{\i}
\ifhasdigit{\cmfi \number\i}\else
\ifdividep{\cmfi\number\i}\else
{\number\i}\fi\fi
\advance \i by 1
\repeat}

\noindent\NabeAzz{400}

\vfill\eject\end
とくに奇妙なことはしていません。10進表記でない整数(16進とか8進とか文字とか)も引数にとれるところがちょっとポイント。アプローチは FizzBuzz とまったく同じ。FizzBuzz もナベアツも、整数の剰余をどう扱うかに TeX ならではの難しさがあるので、TeX マクロを使えるかどうかよりも、初等代数的なことを考える力を試されている気分。

参考文献はいうまでもなく "TeX Book" 一択。日本語版だと 296ページに出てくる \hex マクロを参考にしています。

0 件のコメント: