クイズ大陸クイズ大陸

参加型ナゾトキサイト『クイズ大陸』で、脳トレをどうぞ!

FAQ
feedRSS


■ pc ( No.3 )
日時: 2010/03/09 10:27
名前: ゲーデル

説明しようと思ったら、非常に長文になりました。 (^^;)
というわけで、説明を分けます。いきなりやり方を述べても今回は
意味不明なので、先にちょっと説明させてください。 (^_-)

【前半】
Google を駆使しながら説明します(ぇ (^o^)
さっそくですが、「指カレンダー」でググってください(逃げっ ダダダダダダ!)

・・・・

では、指カレンダーがどういうものかわかりましたね?ね? (>o<)(ぇ
基本的にはこれを使いますが、少し変形版を使います。指カレンダーの特徴は、
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を多少いじることで
任意の年に対応できます。ただ、まぁ必要ないですよね (^o^)

<覚えて練習すること>
その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
□■□
□□
□□
→木曜日!