=IF(MAX(MAX(B3+C3/60+D3/3600,C3+D3/60,D3/5)-MEDIAN(B3+C3/60+D3/3600,C3+D3/60,D3/5),MEDIAN(B3+C3/60+D3/3600,C3+D3/60,D3/5)-MIN(B3+C3/60+D3/3600,C3+D3/60,D3/5),MIN(B3+C3/60+D3/3600,C3+D3/60,D3/5)+60-MAX(B3+C3/60+D3/3600,C3+D3/60,D3/5))>30,"x","o") |
私のはすべて、針を結ぶ線に中心点が乗ったのは囲われていないということで×にしています。
まず、最終形の74ですが次のとおりです。
=IF(MDETERM(N(MOD(TIME(B3,C3,D3)*({4;48;2880}-{4,48,2880}),2)>1)),"○","×")
これは、次の判定法(No4)です。
①各辺の作る三角形が中心を囲んでいない場合、円を半円に分けた場合、3点とも半円の一方に集まる。
②ただし、どこで半円に分けるかが大問題なので、時計を回し、各針が0時を指すようにして、そのいずれかで、3点はが右半分に集まれば×、どの場合も集まらなければ〇と判定する。
これで、できたのが85です。
=IF(AND(MMULT(N(MOD(TIME(B3,C3,D3)*({4;48;2880}-{4,48,2880}),2)>1),{1;1;1})),"○","×")
このMMULT前の配列をなんとなく眺めていたら、×の場合明らかに逆行列が作れないが、〇の場合が逆行列があるような気がした。
それが当たって、MINVERSEとISERRで82
でも、考えて見たら、逆行列ができるかできないかは行列式が0になるかどうかで決まるのでMDETERMで判定できる。
これが一挙に短縮した74です。
これ本当に偶然で、配列の1,0が逆だったらどのケースも逆行列が作れるんで気が付かなかったはず。
参考までに他に考えた判定法を書いておきます。
判定No1
三角形のいずれかの2辺が円内で、中心点を挟む
(VBAはこの方法です)
ワークセルを使えばちゃんと判定できましたが、とても一つの式に纏める気力は起きなかった。
判定No2
三角形の頂点から中心線に引いた直線のいずれかが、円内で他の一辺とクロスする
これも断念
注.両方共、」「円内」ってのが重要
また、両方共、辺の直線の式を計算してるため、6:0:0とか0:0:0とかは計算式がエラーになります。
判定No3
これが初めて式にできた方法
①各針の指す点と中心点を結ぶと、円グラフのように、円を三分割する角度が三つできる
②いずれかの角度が180度を超えていたら×、三つ共180度未満なら〇
ただ、この方法は0:0:0に対する処理が必要で短くならず105どまりでした。
=IF(OR(B3:D3)*AND(MOD(MMULT({1,-1},LARGE(MOD(TIME(B3,C3,D3)*{4;48;2880},2),{1,2,3;2,3,1})),2)<1),"○","×")
長々と失礼いたしました。
(y sakudaさん)
最近のコメント