1から30までを12列で並べる

前回は、名簿を段組みにする100本ノックに挑戦した。
infoment.hatenablog.com
今回は、段組みについてのお話。

例えば、1から30までの数字を、12列で折り返して並べたいとする。
こんな感じだ。

このとき、30番目の数が何行何列目に来るか知るには、どのような方法が
あるだろうか。やってみた。

1. IF関数を駆使する。

  1. 行・・・数が1なら1行目。列数が1なら、前の列数に1を足す。
        それ以外は、一つ前と同じ。
  2. 列・・・数が1なら1列目。前の列数が12なら、1に戻る。
        それ以外は、一つ前に1を足す。

実際、式をセットするとこうなる。

テーブルに式をセットしたので、だいぶん複雑になってしまった。理屈としては
一番簡単だが、式の可読性という点では今一つか。

2. 余りを利用する。

12で割ったときの余りで、列数を求める。ただし、12列目は余りが0になって
しまい都合が悪いので、1引いた値を12で割った余りをもとめ、それに1を
足し直すことで列数を求める。

行数は、12で割った商を小数点第一位で切り上げることで求める。
実際、式をセットするとこうなる。

式としてはかなりシンプルになった。ただし、
「1引いた値を12で割って、余りに1を足す」
の部分が、ちょっと難しいかもしれない。

3. 12進数にする。

1から12が繰り返し現れるわけだから、12進数の一桁目が列数で、
二桁目以上が行数になる。11の一桁目がAに、12の一桁目がBに
なるので、結構ややこしい。なお、各変換には以下の関数を用いる。

  • 10進数 ⇒ 12進数 BASE関数
  • 12進数 ⇒ 10進数 DECIMAL関数

実際、式をセットするとこうなる。

今回の中でもっとも複雑な式となっていて、しかも一番難解なものに
なってしまった。

でも、嫌いじゃないかも。実際の場面でどの方式を採用するかは、
時と場合と、各位のお好みで。

参考まで。