pc ( No.3 ) |
- 日時: 2010/03/09 10:27
- 名前: ゲーデル
- 説明しようと思ったら、非常に長文になりました。
 というわけで、説明を分けます。いきなりやり方を述べても今回は 意味不明なので、先にちょっと説明させてください。 
【前半】 Google を駆使しながら説明します(ぇ  さっそくですが、「指カレンダー」でググってください(逃げっ ダダダダダダ!)
・・・・
では、指カレンダーがどういうものかわかりましたね?ね? (ぇ 基本的にはこれを使いますが、少し変形版を使います。指カレンダーの特徴は、 1. 1つの変数x(mod 7)を、親指でポイントすることでメモできる。 2.x ← (x + y) (mod 7) (y=0..6) が瞬時にできるようになる。 3.各月の初期位置を覚える。 に要約されますので、これをうまく活用してスピードアップを狙います。
-------------------------------------------------------------------- 人間の脳は、短期間に変動する「変数」を沢山用意するのが(一般的には)苦手です 。 そのため、脳内で必要な変数の数を減らすと、計算が速くなったりします。
説明のための例1. X1+X2+X3+X4 まず、これを計算しようとした時、プログラミングチックに書くと、 x = X1+X2; x += X3; x += X4; ということが脳内で行われ、変数 x は、常に変化していきます。 この変数が、1,2個ならまだいいのですが、数個に増えると急に大変になります。 説明のための例2. (x1%7)+(x2%7) (x%y は、xをyで割った余りとする) これもプログラミングチックに書くと、 x = x1%7; y = x2%7; x += y; ということが脳内で行われ、この場合は2個になります。 --------------------------------------------------------------------- *実は、ググってみてビックリしたのですが、1601〜任意の年の曜日を、 改良型指カレンダーで 3〜4 秒で当てる詳細が掲載されているサイトがあります。 動画みる限り、サヴァン症候群のカレンダー計算が、現実に出来てるみたいです 
|
pc ( No.4 ) |
- 日時: 2010/03/09 10:28
- 名前: ゲーデル
- 【後半】
1901 〜 2100 年 で通用するやり方です。 (実は、400年周期で同じになるので、下の<やること>のBを多少いじることで 任意の年に対応できます。ただ、まぁ必要ないですよね )
<覚えて練習すること> その1. まず、【左手の指】に、次のように1月〜12月の初期位置を割り当てます。 この位置は、体で覚えます。上段が1月〜6月、下段が7月〜12月です。
月木日 火金 水土
<初期位置> □□□ □□□ □□□ □□□ □□■ □□□ □□ ■□ ■□ □■ □□ □□ □■ □□ □□ □□ □□ ■□
□□□ ■□□ □■□ □□□ □□□ □■□ □■ □□ □□ □□ ■□ □□ □□ □□ □□ □■ □□ □□
その2. 指カレンダーで、任意の位置から、+1,+2,+3,+4,+5,+6 した時に 移る位置を、体で覚えます。7*6=42パターン覚えなければなりませんが、 規則性があるので、そこまで苦労せずとも覚えられます。 (+2,+5は慣れるのに時間がかかりますが・・・) これによって、プログラムで言う x = (x+y) % 7 が一瞬で出来るようになります。 これが計算速度の決め手になりますので、練習を積む必要があります。
その3. 次の操作を体で覚えます。 40の時、+1 20の時、+4 8の時、+3 4の時、+5 (*ちなみに、これらの数字は、(400/8)%7,(200/8)%7,(80/8)%7,(40/8)%7 です。)
その4. ↓のフローチャートを体で覚えます。
<やること> ccyy年m月d日とする。 @mによって、初期位置 x に移動します。 Ad%7を暗算し、それを x に足します。 Bcc=19なら、1 を x に足します。 Cyy を、40未満になるまで40で引きながら、その都度 1 を x に足します。 Dyy を、20未満になるまで20で引きながら、その都度 4 を x に足します。 Eyy を、8未満になるまで8で引きながら、その都度 3 を x に足します。 Fyy を、4未満になるまで4で引きながら、その都度 5 を x に足します。 Gyy を x に足します。 HGの時点でyy=0 で、更にm=1or2なら 6 を x に足します。
|
pc ( No.5 ) |
- 日時: 2010/03/09 10:37
- 名前: ゲーデル
- 【補足】
脳内疑似コードでプログラミングチックに書くと、次のような計算になります。 -------------------------------------------------
x = X[m-1]; //@ t = d % 7; x = (x + t) % 7;//A if (cc == 19) { x = (x + 1) % 7; }//B while (40 <= yy) { yy -= 40; x = (x + 1) % 7; }//C while (20 <= yy) { yy -= 20; x = (x + 4) % 7; }//D while (8 <= yy) { yy -= 8; x = (x + 3) % 7; }//E while (4 <= yy) { yy -= 4; x = (x + 5) % 7; }//F x = (x + yy) % 7;//G if (yy == 0 && (m == 1 || m == 2)) { x = (x + 6) % 7; }//H ------------------------------------------------- x = (x + y) % 7 を計算の基本に置いていることが良く分かると思います。 平均的には、1回の曜日計算につき、5回くらいこの計算をやります。 あとは %7 の計算を1回、簡単な引き算を3回くらいです。
目標タイムとしては、 @〜Bを2.5秒、C〜Hを2.5秒くらいかと思います。 なれれば 3〜4 秒くらいでできます。
例1:2010年2月27日の場合 @2月なので、 □□□ ■□ □□ A27%7=6 なので、+6 ■□□ □□ □□ B20なので、スキップ Cスキップ Dスキップ E10-8=2 として、+3 □■□ □□ □□ Fスキップ G+2 □□□ □□ □■ HGで+2なのでスキップ →土曜日!
例2:1992年2月27日の場合 @2月なので、 □□□ ■□ □□ A27%7=6 なので、+6 ■□□ □□ □□ B19なので、+1 □□□ ■□ □□ C92-40-40=12 として、+1 を2回 □■□ □□ □□ Dスキップ E12-8=4 として、+3 □□■ □□ □□ F4-4=0 として、+5 □□□ □■ □□ G+0 HGで+0で、m=2 なので、+6 □■□ □□ □□ →木曜日!
|
|