★考え方
盤面の駒はAA18:AD98の表、特にAB列の数値により表示されます。
そこでAB列の数値を参照して数式を作ります。例えばAB18の
数値を見れば、王の表示位置がわかります。
王の表示列:=MOD(AB18,9)+1 (盤面左からの列数)
王の表示行:=INT(AB18/9)-1 (ワークシートの行数)
飛車・角の位置も同様です。
飛車1の表示列:=MOD(AB19,9)+1 (盤面左からの列数)
飛車1の表示行:=INT(AB19/9)-1 (ワークシートの行数)
飛車2の表示列:=MOD(AB20,9)+1 (盤面左からの列数)
飛車2の表示行:=INT(AB20/9)-1 (ワークシートの行数)
角1の表示列:=MOD(AB21,9)+1 (盤面左からの列数)
角1の表示行:=INT(AB21/9)-1 (ワークシートの行数)
角2の表示列:=MOD(AB22,9)+1 (盤面左からの列数)
角2の表示行:=INT(22/9)-1 (ワークシートの行数)
【第6回の解答例】
王手となるのは・・・
「王」と「飛車1」の列位置が等しい
「王」と「飛車1」の行位置が等しい
「王」と「飛車2」の列位置が等しい
「王」と「飛車2」の行位置が等しい
・・・上の4条件の少なくとも一つが成り立てばよいから・・・
=OR(MOD(AB18,9)+1=MOD(AB19,9)+1, MOD(AB18,9)+1=MOD(AB20,9)+1, INT(AB18/9)-1 =INT(AB19/9)-1,INT(AB18/9)-1=INT(AB20/9)-1)
整理すると
=OR(MOD(AB18,9)=MOD(AB19,9), MOD(AB18,9)=MOD(AB20,9), INT(AB18/9) =INT(AB19/9),INT(AB18/9)=INT(AB20/9))
よって
=IF(OR(MOD(AB18,9)=MOD(AB19,9),MOD(AB18,9)=MOD(AB20,9),INT(AB18/9)=INT(AB19/9),INT(AB18/9)=INT(AB20/9)),"王手!","")
【第7回の解答例】
角で王手の場合は、角と王を結ぶ直線と盤面の横線のなす角(θ)が45度の時である。
すなわちtanθ=±1の時である。
よってtanθ^2= 1
なんだかんだで整理して・・・(^^ゞ ←学生なら減点間違いなし m(__)m
=IF(OR((MOD(AB18,9)-MOD(AB21,9))^2=(INT(AB18/9)-INT(AB21/9))^2,(MOD(AB18,9)-MOD(AB22,9))^2=(INT(AB18/9)-INT(AB22/9))^2),"王手!","")
お待たせしました。
投稿情報: くまぷー | 2017年8 月12日 (土曜日) 午後 08時14分
【第6回:飛車】
◆よい子:100=REPT("王手!",OR(ISEVEN(SMALL(MMULT(COUNTIF(I9:Q17,"<>"&I9:Q17),COUNTIF(I9:Q17,"<>"&I9:Q17)),{1,2}))))
◆ズルっこ:71{=IF(AND(MOD(AB18-AB19:AB20,9),INT(AB18/9)-INT(AB19:AB20/9)),"","王手!")}
【第7回:角】
◆よい子:123{=REPT("王手!",OR(COUNTIF(OFFSET(H8,MAX((I9:Q17="王")*ROW(1:9))+(MAX((I:Q="王")*COLUMN(A:I))-ROW(1:9))*{1,-1},ROW(1:9)),"角")))}
◆ズルっこ:92{=REPT("王手!",OR(COUNTIF(OFFSET(H1,AB18/9-2+(MOD(AB18,9)+1-ROW(1:9))*{1,-1},ROW(1:9)),"角")))}
投稿情報: maron | 2017年8 月12日 (土曜日) 午後 08時33分
データ部分は分かってたけど一切つかいませんでした。
飛車103です。
=REPT("王手!",MAX(MMULT((I9:Q17="王")+(I9:Q17>Z6)%,A1:A9+1),MMULT(A1:I1+1,(I9:Q17="王")+(I9:Q17>Z6)%))>1)
もっともこれはちょいズルで101になりますが100が切れないのじゃ面白くないですね。
=REPT("王手!",MAX(MMULT((I9:Q17="王")+(I9:Q17>Z6)%,A1:A9+1),MMULT(A1:I1+1,(I9:Q17="王")+(I9:Q17>Z6)%))>1)
角ですが117です。
=REPT("王手!",OR(MOD(MMULT(LARGE(IF(I9:Q17="王",181,I9:Q17>"")*ROW(1:9)*19+COLUMN(A:I),{1,2;1,3}),{1;-1}),{18,20})=0))
投稿情報: y sakuda | 2017年8 月12日 (土曜日) 午後 10時36分
飛車のCountifは全く考えなかったですね。
角筋のは私変なことやってますが、ちょいとコメントしておきます。
本来 Row*9+Column で良いわけですが、これだと、各筋が番外にはみ出したところと、盤面の反対側の数行下が同じ番号になってしまうのはご承知のとおりです。
で、そうならないためには行の差を19以上にすればそうならないので、行に19かけてます。
その場合、Modは 18、20で取ることになります。
また、王をLargeの1で判別する必要があるので、181を加えてます。
181の意味は18と20の最小公倍数+1で180に何が掛っても18、20の剰余は0になります。
投稿情報: y sakuda | 2017年8 月12日 (土曜日) 午後 10時44分
maronさんのどうもよく理解できない^^;
特に角の方はリソース不足って言われて動かないから余計わかんないw
頭悪いの歴然とさらしてる・・・・・
投稿情報: y sakuda | 2017年8 月13日 (日曜日) 午前 01時50分
>角の方はリソース不足
◆列を、(I:Q="王")*COLUMN(A:I)しているせいでしょうか
角126:{=REPT("王手!",OR(COUNTIF(OFFSET(H8,MAX((I9:Q17="王")*ROW(1:9))+(MAX((I9:Q17="王")*COLUMN(A:I))-ROW(1:9))*{1,-1},ROW(1:9)),"角")))}
◆なお、行も全体参照にすると、循環参照になりました
121:{=REPT("王手!",OR(COUNTIF(OFFSET(H8,MAX((9:17="王")*ROW(1:9))+(MAX((I:Q="王")*COLUMN(A:I))-ROW(1:9))*{1,-1},ROW(1:9)),"角")))}
投稿情報: maron | 2017年8 月13日 (日曜日) 午前 04時59分
飛飛王
の配置に関心がありました、、けど、、、
投稿情報: jyo3 | 2017年8 月13日 (日曜日) 午前 05時48分
>角筋のは私変なことやってますが、ちょいとコメントしておきます。
多少でも解説があるのは有難いです。
それでも私には難しいのですが・・・(^^ゞ
>>角の方はリソース不足
私の方では動いています。
これも難しい・・・
投稿情報: くまぷー | 2017年8 月13日 (日曜日) 午前 06時06分
>これも難しい・・・
◆王の行方向の位置により、H8から下に、MAX((I9:Q17="王")*ROW(1:9))
◆王の列方向の位置により、それに(MAX((I9:Q17="王")*COLUMN(A:I))-ROW(1:9))*{1,-1}分上下に
◆ROW(1:9)で、列方向にセル指定して、これで王を含む、/\のセルを指定して、
◆COUNTIF(・・・・・,"角")としています
投稿情報: maron | 2017年8 月13日 (日曜日) 午前 08時20分
maronさん、さっそくの解説有り難うございます。
なんとなくわかったようなりました (^^ゞ
式を書きっぱなしだと
なんだか、わからない人の方が圧倒的多数だとおみます。
将棋でも高段者の戦いは「解説」無しでは
私のような者には楽しめません。
繰り返し有り難うございます m(__)m
投稿情報: くまぷー | 2017年8 月13日 (日曜日) 午前 09時56分
maronさん解説ありがとうございます。
角の方は分かった^^
OffsetのColumnのところにRow(1:9)ってのは考えて見ればどうってことない話なんですが、目からうろこ^^
Offsetで取り出した配列に何か関数で操作しようとするとエラーになっちゃうんでこういう場合はほとんど考慮の対象外にしちゃってるんで、こういうの思いつかないですねーー
分かったと言っても応用して見ろと言われるとダメみたいな気がしますけどねーー
投稿情報: y sakuda | 2017年8 月13日 (日曜日) 午前 11時50分
くまぷーさん、まだ、不明点ありますかーー
投稿情報: y sakuda | 2017年8 月13日 (日曜日) 午前 11時54分
maronさんの飛車何となく分かった。
ただ、初め
COUNTIF(I9:Q17,"<>"&I9:Q17)
で空の所が81になっちゃうってのが不思議でした。いかにCountif使ったことないかってことですよねーー
ただ、Small1,2で本当にアタリの所がヒットするのか、それにヒットするとこだけEvenになるのか今一つ整理しきれてません。
これも使って良いよーーって言われても応用不能w
投稿情報: y sakuda | 2017年8 月13日 (日曜日) 午後 12時30分
飛車 96
=IF(LEN(CONCAT(OFFSET(I8:Q8,INT((AB18-81)/9),))&CONCAT(OFFSET(I9:I17,,MOD(AB18,9))))>2,"王手!","")
2016で、、、、出来た関数使用。なので、、、違反ですが、、、
別手法は、、、また、、別の時に、、、
皆さんの関数・・・すごいです。
投稿情報: jyo3 | 2017年8 月13日 (日曜日) 午後 12時50分
2016使ってないので、Concatってのは知りませんでしたけど、以前からここなんかの解くにはまとめてConcatinationする手がないのが癪の種でした^^
できたんですねーーそんなの。
でも・・・・こういうとこ以外で使い道あんまりなさそうですねーーw
投稿情報: y sakuda | 2017年8 月13日 (日曜日) 午後 01時12分
◆EXCEL2013なので、CONCATは使ったことはありませんが、
◆文字列をつなぐには、便利な関数の様に思います
投稿情報: maron | 2017年8 月13日 (日曜日) 午後 01時27分
>できたんですねーーそんなの。
>◆文字列をつなぐには、便利な関数の様に思います
次の問題以降では、、、もちろん、、、
CONCATは
使いません。、、、けど、、、
投稿情報: jyo3 | 2017年8 月13日 (日曜日) 午後 02時10分
王手飛車の方新アイデアでないので、飛角龍馬の問題を推定して考えてます。
所が・・・・
多分王を加えて駒は5個、この場合合駒の有無を確認したアタリの判別が難しい。
飛について行方向の王手の確認やって見たところ、それだけで300超。
龍も考えるとその4倍。
角と馬だって斜め方向のアタリの確認王手飛車程簡単じゃないはずだから・・・・
そう考えると2000じゃすまないですねーー
式の最大長8192だそうですから、長さ的には許容範囲ですが、ちゃんと動かせるかなーー。
逆に最初全く思いつかなかった、馬の縦横のアタリとか龍の斜めのアタリはそれぞれ100ちょっとで何とかなりそうなんですけどねーー。
投稿情報: y sakuda | 2017年8 月13日 (日曜日) 午後 04時32分
>そう考えると2000じゃすまないですね
そういって頂けると、、、500台も、、、短く感じます。
思考に、、、抜け、、があったら大変だから・・・
500回ぐらい、、、目視で、、確認します。、、、そのうち、、
投稿情報: jyo3 | 2017年8 月13日 (日曜日) 午後 04時41分
ただ今、体育館より無事、生還しました~
ボロボロです~
これからシャワーを浴びて休憩です。
死んでしまうかも・・・(´;ω;`)ウッ…
投稿情報: くまぷー | 2017年8 月13日 (日曜日) 午後 05時06分
お疲れ様でーーす。
死ぬ前にジョー3のオリジナル出題してくれますかーーw
投稿情報: y sakuda | 2017年8 月13日 (日曜日) 午後 05時22分
>死ぬ前にジョー3のオリジナル出題してくれますかーーw
了解! 公開しました。
投稿情報: くまぷー | 2017年8 月13日 (日曜日) 午後 05時49分