見出し画像

C#で学ぶ!指カレンダーの使い方~ガイダンス(1/4)


指カレンダーとは?

指を使って数えるという原始的な手段により与えられた西暦(※)の日付の曜日を求める方法のことを指カレンダーといいます. もともとは民間伝承の知恵のようなもので, 西暦では各月の日数が平年か閏年かの二通りで固定しているという事情を上手く利用することにより, 与えられた日付に対して曜日を求めることができました. ただし, そのための前提条件として,
(i) その年の$${1}$$月$${1}$$日の曜日を知っている.
(ii) その年が平年か閏年か知っている.
というものがあり, なかでもとにかく(i)が原因となり, 多年度に渡るランダムな日付に対しては弱く, 実際お手上げ状態でした.

※:今シリーズで紹介する指カレンダーが対象とするのはグレゴリオ暦(新暦ともいう)です.

シン・ユビカレンダー

旧来の方法にそういった問題があることを認識していた私は, 特殊な動機と情熱により突き動かされた結果, 去る$${2002}$$年, 電撃的に問題の解決策を見出すに至ります. コンセプトをイメージとして表現するなら, 従来の指カレンダーの眼目である「月のジャンプ」を「年のジャンプ」にまで拡大したということになります. それにより出発点からの移動距離が飛躍的に伸び, かなり遠くまで行けるようになりました. つまり従来難しかった多年度に渡るランダムな日付にも対応できるようになっています. そうして誕生した指カレンダーはそれから長い時間をかけてゆっくり成長し, (途中スピンオフなどを生み出しつつ)今の形になりました. つまり指カレンダーには, 民間伝承のようにして伝わった従来の形態と, $${2002}$$年以降の技術革新により生まれ変わった新しい(真の?)形態の二つがあります.

シリーズの目標および構成

このシリーズでは, 読者が指カレンダーの使い方をマスターすることを目標にしています. 上述のように指カレンダーには新旧がありますが, どちらについても手順を紹介します. しかし記述としてはそれぞれ独立して学べるようになっているので, どちらか好きな方を選択するという手段もあります. ただし, 新旧いずれを学習するとしても下記の$${2}$$番目にある「指を使ったモジュラ計算」は必須です.

シリーズの構成(noteにてすべて公開済み):

  1. ガイダンス

  2. 指を使ったモジュラ計算

  3. 従来の手順

  4. 新しい手順

必要知識

指カレンダーの手順を伝えるにあたり, 今シリーズでは, 手順をコンピュータ用のプログラミング言語で記述するという方法をとりました. それもあって, 読者は簡単なコードを理解できる程度のプログラミングスキルが必要です. なお, 言語としてはC#を使用していますが, 基本的な制御文を利用しているだけなので他の言語にも容易に読み替えることができると思います.

対象読者

対象読者としては, 小学高学年から大人までの比較的広い年齢層を想定しています. 学習効果や要素としては次のようなものが挙げられるので, 参考にしてください.

  • 手指と頭のエクササイズ

  • 特技, かくし芸

  • カレンダーや曜日

  • モジュラ計算

使用における健康上の注意

私自身は指カレンダーの使用に関して, $${20}$$年以上のキャリアがありますが, その経験から常識的な範囲での使用に関しては, 健康上なんら問題はないといえると思います. とはいえ, 次の点は守るようにしてください.

  • 使用前に手指のストレッチと準備運動をする.

  • 手指に力を入れすぎない.

  • 長時間の使用は避ける.

日付の範囲

日付として有効な範囲はグレゴリオ暦の$${1}$$年$${1}$$月$${1}$$日から$${9999}$$年$${12}$$月$${31}$$日まで(※)です. ただし, 従来の指カレンダーについては, 上で述べたような(i)と(ii)の前提条件があります.

※:世界史において実際にグレゴリオ暦が採用されたのは$${1582}$$年$${10}$$月$${15}$$日からです.

ツェラーの公式

指カレンダーは新旧ともに, 下に示すツェラーの公式というよく知られた曜日計算法と答えが一致するようにできています. ただし, 新しい指カレンダーとツェラーの公式については, 手順を行う前に与えられた日付をもとに$${Y,M,D}$$を設定する必要があります. (従来の指カレンダーでは必要ありません. )

$$
W=(Y+ \lfloor \frac{Y}{4} \rfloor - \lfloor \frac{Y}{100} \rfloor + \lfloor \frac{Y}{400} \rfloor + \lfloor \frac{13M+8}{5} \rfloor +D) \mod 7
$$

ただし, $${\lfloor x \rfloor }$$は$${x}$$のfloor関数といって, 実数$${x}$$に対し, $${x}$$以下で最大の整数を返します. $${mod}$$は除算の余りを計算する演算子です.
$${W}$$は$${0}$$から$${6}$$までの整数であり, 各々について表1に示す対応する曜日が与えられた日付の曜日です.

表1

日付の変換法:
与えられた日付について, 年数を$${Y}$$, 月数を$${M}$$, 日数を$${D}$$とします. ただし, 月数が$${1}$$か$${2}$$の場合は「年数$${-1}$$」を$${Y}$$に, 「月数$${+12}$$」を$${M}$$とします.
(例)$${2000}$$年$${1}$$月$${1}$$日なら, (月数が$${1}$$なので)$${Y=2000-1=1999,M=1+12=13}$$.

手順の記述方法

すでに述べているとおり今シリーズでは, 指カレンダーの手順をコンピュータ用のプログラミング言語で記述することにしています. 理由としては, その方がシンプルかつ明確に伝わると思うからです. ユーザはそのコンピュータ用に書かれたコードをPCを使わずに自らの生体を用いて実行します. 具体的には, コードの内容を記憶したうえで, それを自らの手指と頭を使って計算するという流れです.

練習方法について

表計算ソフトなどを使えば, ツェラーの公式を使って問題集とその答えを作成できると思います. その他としては, 下記のようなアプリをScratchで作ってみたので練習にご活用ください. (このアプリは新しい指カレンダーの練習を想定して設計されています. )

Stellar Defenders: Calendar Clash in the Cosmos


この記事が気に入ったらサポートをしてみませんか?