sasaharayuugo.net

連続的な問題への考察

連続的な問題について考察する。
 

 

99年度ファイナル問題 問題5

『小学生によるマラソンレースが行われました。走るのが得意なA、B、C、D、Eの5人も参加してレースが始まりました。折り返し地点を過ぎてからは5人ともそれぞれに一定の速さで走っています。
5人が折り返し地点を過ぎてからX、Y、Zの3人が別々の場所でレースの写真を1枚ずつ写しました。
最初に写したのはX、続いてY、最後がZでした。下の会話は後日、X、Y、Zの3人がそれぞれ自分の写した写真を持ちよったときのものです。

X:「ぼくのは5人が折り返してから10分後に写した写真だけど、5人がABCDEの順に20mおきに同じ間隔で写っているぞ!」
Z:「わたしのは5人が折り返してから30分後に写した写真だけど、5人がBECADの順に30mおきに同じ間隔で写っているわ!」
Y:「ううむ………僕はいつ写したんだっけ……全然覚えてないや。ただ僕の写真も、5人が同じ間隔で並んでいるよ!」

さて、Yの写真は5人が折り返してから何分何秒後に写したものでしょうか。』


この問題は連続的な問題では無かったが、練習がてら。いや解答手段としてはグラフを使うのか。2点を取って直線を引くグラフは、そろばんのような計算機のような側面があるのかもしれないな。その間は全て答えなのだという。


A == B + 20;
B == C + 20;
C == D + 20;
D == E + 20;

記録1;

A := A + A_speed * 20;
B := B + B_speed * 20;
C := C + C_speed * 20;
D := D + D_speed * 20;
E := E + E_speed * 20;

B == E + 30;
E == C + 30;
C == A + 30;
A == D + 30;

記録1~{
 A := A + A_speed * answer;
 B := B + B_speed * answer;
 C := C + C_speed * answer;
 D := D + D_speed * answer;
 E := E + E_speed * answer;

 order := [A, B, C, D, E].shuffle;

 every~{
  order[?1] == order[?1 + 1] + interval; ??これでは1つマッチすれば良いということにならないか order[every.?1] == order[?1 + 1] + interval、か?
 }
}

print(every.answer.variety);
 

03年度トライアル問題 問題14

『池の周りを、同じ地点からAとBが同時に同方向に一定の速さで走り出します。出発の時のBの速さはAの2.5倍です。1回目にBがAに追いついた地点をPとします。追いついたBはその速さを20%減らし、追いつかれたAは速さを25%増しました。それでもBのほうが速かったので、BはAにまた追いつきました。2回目に追いついた地点をQとします。PとQの道のりが100m離れているとき、この池の周囲の長さは何mですか、考えられる長さをすべて求めなさい。』


B_speed == A_speed * 2.5;
A := 0;
B := 0;

連続~{
 A := A + A_speed * ?1;
 B := B + B_speed * ?1;
}~(A % lake == B % lake)

P := A % lake;
B_speed := B_speed * 80 / 100;
A_speed := A_speed * 125 / 100;

B_speed > A_speed;

連続~{
 A := A + A_speed * ?1;
 B := B + B_speed * ?1;
}~(A % lake == B % lake)

Q := A % lake;

abs(Q - P) == 100;

print(every.lake.variety);
 

06年度トライアル問題 問題6

『4台の全く同じ性能の車があります。どの車もタンクいっぱいに同じ量のガソリンを入れると最大12km走行でき、また他の車に自分の車のガソリンの一部または全部を分けて移すこともできますが、ガソリンタンクが空になった車はそこで動けなくなります。
今、この4台の車をタンクいっぱいにガソリンを入れて同じ場所から同時に出発させ、途中でおたがいにうまくガソリンを補給し合いながら4台のうちの1台がなるべく長い距離を走れるようにすると、最大何km走ることができますか。』


これも連続的な問題では無かった


A := 12;
B := 12;
C := 12;
D := 12;
result := 0;

cars := [A, B, C, D];

always{ ??Kaleidoscopeから拝借した。意味は何となく分かると思う
 12 >= A, B, C, D >= 0;
 if(cars[?1] == 0){ cars.pop(?1) } ??流石にどうかな。試しに書いてみたけど
}

while(cars.数 != 0){
 result := result + ?2;
 for(i in cars){ ??何となくpython風にしてみた。こだわりは無い。こうなってみると職業訓練にもなりそうだし
  i := i - ?2; ??上部の?2とかは共有するとして良いんだろうか
 }

 for(i in cars){ ??何なら全面的にpython風にしても良いかもしれない。次から試してみるか
  for(j in cars){
   if(i == j){ continue;}

   i := i - ?3;
   j := j + ?3;
  }
 }
}


そういえば、計算機科学に問題を形式化する研究があったんだっけか。ザッと調べたつもりだったけど、もう少し調べてみるか。
そのお題の元では、そこそこやれているつもりだけど。
まあでも俺の場合は、自分で研究した方が習得スピードが速いからな。と言ったら反転して平等っぽくなるんだろうけどさ、その直前まで平等っぽく無かったのに。どちらかにして欲しいと思う、西内啓さんも、その背後にいる膨大な量の研究者たちも。

調べてみると、これは「形式化数学」というジャンルらしい。
しかし、ユークリッド幾何学の自動化の目処も立っているし、最初たしか大学の図書館で手に取った計算機科学の教科書のどれかを真面目に読んでいるよりは圧倒的にスピードが速いはずで、俺はこのまま続けることにする。
不毛になる可能性の方が高くても構わない。これが俺にとっての勉強法だ。表面的な、実際には違う風に機能する道徳に勝たなければいけない。それが研究の本質の一つだと確信している。投票や貨幣論の後には、文への統語法則や文章への統語法則が俺が読んだ言語学の教科書には載っていなかった後には、人々がプライドを持っているのを見た後には、そう考えざるを得ない。
願わくば、俺の言語論や枠組みに世話になっているなどと考えず、俺に対してもそうあって欲しい、それこそが本質だと思う。俺が許す、という命令すらも断ち切っていってほしい、〜という命令すらも断ち切っていってほしい、その続いていく連鎖を崩すのが本質の一つだと思う。
 

09年度ファイナル問題 問題6

『AさんとBさんは、マラソン大会の練習のために公園の周りをぐるぐる走ることにしました。2人とも、うで時計を持ってきたのですが、どちらの時計もこわれかけていて、放っておくとどんどん正しい時刻から遅れていきます。
2人はある時刻に、正確な時計が置いてあるスタート地点で腕時計を合わせて、そこからたがいに逆向きに走り始めました。
2人とも、走りながらスタート地点を通るたびにうで時計を正しい時刻に合わせます。2人が2回目、3回目、4回目に出会ったとき、それぞれのうで時計は次のような時刻を指していました。(スタート時は出会ったとは数えません。また、これらの出会いはスタート地点ではない場所でした。

AさんBさん
2回目12時00分11時57分
3回目12時48分12時51分
4回目13時41分13時40分

Aさんの走る速さ、Bさんの走る速さ、Aさんのうで時計の遅れる速さ、Bさんのうで時計の遅れる速さは、たがいに異なるかもしれませんが、それぞれ一定です(途中から速くなったりしません)。
(問い1)AさんBさんがそれぞれ公園を一周する間に正しい時間から、うで時計の遅れる時間は、それぞれ何分ですか。
(問い2)2人がスタートした時刻を求めなさい。』


記録1;

A_clock_delay := 0;
B_clock_delay := 0;

連続(time1){
 A_clock_delay := A_clock_delay + A_clock_delay_rate * time1; ??何か、連続するtime1で、A_clock_delayが0になるとそれはそれで反映されるような。無理か?
 B_clock_delay := B_clock_delay + B_clock_delay_rate * time1;
}
~if(park - (A_speed * time1) % park == (B_speed * time1) % park){
 break;
} else if ((A_speed * time1) % park == 0){
 A_clock_delay := 0;

 continue;
} else if ((B_speed * time1) % park == 0){
 B_clock_delay := 0;

 continue;
}

time1 + A_clock_delay == 12 * 60;
time1 + B_clock_delay == 11 * 60 + 57;

連続(time1){
 A_clock_delay := A_clock_delay + A_clock_delay_rate * time1;
 B_clock_delay := B_clock_delay + B_clock_delay_rate * time1;
}
~if(park - (A_speed * time1) % park == (B_speed * time1) % park){
 break;
} else if ((A_speed * time1) % park == 0){
 A_clock_delay := 0;

 continue;
} else if ((B_speed * time1) % park == 0){
 B_clock_delay := 0;

 continue;
}

time1 + A_clock_delay == 12 * 60 + 48;
time1 + B_clock_delay == 12 * 60 + 51;

連続(time1){
 A_clock_delay := A_clock_delay + A_clock_delay_rate * time1;
 B_clock_delay := B_clock_delay + B_clock_delay_rate * time1;
}
~if(park - (A_speed * time1) % park == (B_speed * time1) % park){
 break;
} else if ((A_speed * time1) % park == 0){
 A_clock_delay := 0;

 continue;
} else if ((B_speed * time1) % park == 0){
 B_clock_delay := 0;

 continue;
}

time1 + A_clock_delay == 13 * 60 + 41;
time1 + B_clock_delay == 13 * 60 + 40;

print((park / A_speed) * A_clock_delay_rate, (park / B_speed) * B_clock_delay_rate);

記録1~{
 print(time1);
}