魔方陣を作るってのは、以前問題が尽きかけた時、できるかどうか分からない問題で
良ければと言うことでくまぷーさんに提案していたものです。
式一種類では全く歯が立たないのですが、ワークエリアを使っての循環参照による繰り返し
計算ならなんとかなりそうだというので出題をお願いしました。
最初作った時は、3×3の場合、B2:C3の4セルの数字を変えて魔方陣ができるまで繰り返計算させていたのですが、その場合約3000回の反復計算が必要でした。
後になって、3セル指定されれば後は自動的に決まってしまうのに気が付き反復計算を大幅にダイエットしたのが33Aです。
この時点では、反復回数をどうこうするというより、文字数のダイエットに集中してました。
しかし、これは何ぼ何でも無駄なサーチをやっているので、その辺りを整理したのが33Bで
反復回数は劇的に減少しました。
なお、33B、44A、44Bは続行可能で、次々魔方陣を作って行けます。
3×3の魔方陣はいずれにしろ大した反復は必要ないのですが、4×4になるとちょっとやそっとでは収束しません。
で、いろんな工夫をたたきこんで、1万回以下の反復でなんとか最初の魔方陣が見つかるようにしたのが44Aです。
(33B以降は式のダイエットはほとんど考慮してませんので、冗長な式が結構あります)
50回程続行してみたのですが、最短は反復5回、長い場合で9000回くらいの反復で次の
魔法陣が見つかります。(平均3000位だと思います)
44Bは4分割した4セルの合計がいずれも34になる特殊形だけを早く見つける工夫をしたものです。
(4×4の魔方陣ではこのタイプが相当数あります)
これは300回くらいの反復で次々みつかります。
なんか、今回は私一人で楽しんじゃったみたいですみませんm(__)m
(y sakudaさん談)
★sakudaさんのファイル:Q58_2010_sakuda_san.lzhをダウンロード
★くまぷーのファイル:Q58_2010_kuma_pooh.lzhをダウンロード
くまぷーさんの広げて見たけど、からくりがさっぱり分からないですね。
見せ方はさすがです>こう言うのは私には絶対にできないw
投稿情報: y sakuda | 2010年5 月 2日 (日曜日) 午後 08時24分
一応やったってことで、深く考えていないけど、、
=IF(COUNT($B$2:B2)=4,5,IF(AND(COUNTIF($B$2:$D$4,B2)<2,$B$2+$C$3+$D$4=15,$D$2+$C$3+$B$4=15,B$2+B$3+B$4=15,$B2+$C2+$D2=15),B2,IF(ROW()=2,15-B3-B4,IF(COLUMN()=2,15-C2-D2,INT(RAND()*9)+1))))
どこまで人間が考えてどこまでパソコンに考えさせるのか、、、なんか。。
ま、、いいか。
投稿情報: min | 2010年5 月 2日 (日曜日) 午後 08時29分
>くまぷーさんの広げて見たけど、からくりがさっぱり分からないですね。
あれは以前、作った「Poker Slot」のエンジンをそのまま利用しているので
今回のに使う必要のないデータや数式が残っているのでわかりにくいと思います。(^^ゞ
http://kumapooh.typepad.jp/blog/2008/05/post-9a9a.html#comments
みなさんのはこの後ゆっくりと・・・
その前にまず、Excel Worldで宣伝してこよう(o^^o)
投稿情報: くまぷー | 2010年5 月 2日 (日曜日) 午後 08時41分
うーん、sakudaさんのものもminさんのも凄いのだけど
循環参照ってわかりずらい・・・
循環参照を正式な技として解説している書籍などが
あるのだろうか・・・?
投稿情報: くまぷー | 2010年5 月 2日 (日曜日) 午後 09時08分
みなさん、ファイルを送って頂ければ
順次、展示していきますので
よろしくお願いします。m(__)m
投稿情報: くまぷー | 2010年5 月 2日 (日曜日) 午後 09時10分
minmaxさんの拝見しました。
一筆書きで作っちゃいましたか^^;
3次の魔方陣でもできるとは思わなかったので、初めから一筆書きは全く考えなかったです。
投稿情報: y sakuda | 2010年5 月 2日 (日曜日) 午後 10時02分
たしかにminさんのはすごい。
何でも一筆書きにできてしまうところがすばらしいです(o^^o)
投稿情報: くまぷー | 2010年5 月 3日 (月曜日) 午前 06時43分
この連休・・・風邪で、・・・・
おかげで、ゆっくり休んでます。。
で、
1)3個ランダムで、、ちょっと遊びました。
2)斜め456固定だと、ちょっとズルといわれそう・・・だから、、
3)中央5なら、、、まあいいかーーー・・・・
minmaxさん、、中央5ね、、、でも、上手だなーーーまねできません。
投稿情報: jyo3 | 2010年5 月 3日 (月曜日) 午前 08時58分
>3)中央5なら、、、まあいいかーーー・・・・
3×3の場合、中央は5出なければいけないとか、角は2,4,6,8とかすぐ証明できるんです。
突きつめて行くと、多分最終形まで証明できちゃうと思うのである意味微妙なとこですが、
一筆書きでやっちゃうためには許せる範囲じゃないかと思います。
とにかくあっけに取られました^^
ところで、くまぷーさんのやつ、全体のからくりまだ分かりません。
(式全部出して見たんですけど^^;)
F9を押すとどこでスタートのスィッチが入るのかと、停止の仕組み教えてください。
ゲーム作ったりする方たちの常識見たいな気もするんですが、解明できなかった^^;
投稿情報: y sakuda | 2010年5 月 3日 (月曜日) 午前 09時13分
>F9を押すとどこでスタートのスィッチが入るのかと、停止の仕組み教えてください。
>ゲーム作ったりする方たちの常識見たいな気もするんですが、解明できなかった^^;
循環参照は配列数式よりも更にマイナーだから
かずさんが知らなければ誰も知らないような気がします(^^ゞ
よい子は普通、循環参照なんて使わないし・・・
教えるのは容易いのですが
その仕組みの解明を問題にするとか・・・
誰も挑戦してくれなさそうなら
こっそり後でメールで教えます。(o^^o)
投稿情報: くまぷー | 2010年5 月 3日 (月曜日) 午後 04時44分
よろしくーー
投稿情報: y sakuda | 2010年5 月 3日 (月曜日) 午後 06時47分
>よろしくーー
サンプルファイルを送りました。(o^^o)
投稿情報: くまぷー | 2010年5 月 5日 (水曜日) 午前 07時49分
やっとできた・・・C3:E5の9マス使ってるけど、
{=IF($C$3>9,C3,IF(C4+D4+E4&C5+D5+E5&D3+D4+D5&E3+E4+E5&C3+D4+E5&E3+D4+C5=REPT(15,6),C3&"",SMALL(IF(FREQUENCY((1:2,A3:B3),ROW($1:$8)),"",ROW($1:$9)),INT(RAND()*(9-COUNT(0/FREQUENCY((1:2,A3:B3),ROW($1:$8))))+1))))}
・small( )が重複除いて乱数を表示する部分
条件満たすとC3が文字列化、それを条件に乱数計算が止まる式です。
一応答えが出るのは確認したけど、1000で見つかる事もあれば、1万以上かかることもorz
投稿情報: kir | 2010年5 月 8日 (土曜日) 午後 01時00分
kirさん、うれしいよ~っ!!\(^_^)/
出題者、大家を除けば参加者はminさん、1人だったから・・・
投稿情報: くまぷー | 2010年5 月 8日 (土曜日) 午後 07時33分
おお、kirさんも一筆書きですかーー
凄い!
ちゃんと止まることを確認しました^^
しかし、できるもんですねーー
投稿情報: y sakuda | 2010年5 月 8日 (土曜日) 午後 10時08分
しかし、ここまで来ると、くまぷーさんの方で、これは1セルではできないと言う挑戦状出すしかないですねーー
投稿情報: y sakuda | 2010年5 月 8日 (土曜日) 午後 11時42分
>挑戦状出すしかないですねーー
出題者ができないんじゃ
挑戦状とは言えません(^^ゞ
投稿情報: くまぷー | 2010年5 月 9日 (日曜日) 午前 08時08分
通りすがり本人ですw
すいません、どこで質問すれば良いかわかりませんが、ここで質問させてください。
(出題がないので、出題代わりに…w)
A列の1~20に適当な数値(0もいくつか入っている)が入っているとして、
=COUNTIF(A:A,"<>0")
と
=COUNTIF($A$1:A20,"<>0")
と
=COUNTIF($A$1:A21,"<>0")
の値が違う(違う場合がある?)のですが、なぜですか?
投稿情報: 通りすがり | 2010年5 月 9日 (日曜日) 午後 02時54分
www
質問掲示板どこにでもありますし、ここは質問掲示板じゃないですけど。
Countifの動きは真剣に追求したことないですが、
>=COUNTIF(A:A,"<>0")
この形式で記述すると、数字ではなく文字列として比較しているみたいです。
ですから空のセルは0と言う数字が入っていないと言う意味で、"0"以外として
数えられているのでは?
投稿情報: y sakuda | 2010年5 月 9日 (日曜日) 午後 06時18分
>数字ではなく文字列として比較しているみたいです。
んーん
若干違うような気もする。
b2に
'00
=COUNTIF(B2,0)
答え1
??
b2に
'0
=COUNTIF(B2,"<>0")
答え1
"<>0"は数字の0以外をカウントする。
文字の0も空白セルもカウントしない。
投稿情報: min | 2010年5 月 9日 (日曜日) 午後 06時42分
うーーん、どうなんだろ?
確かに文字列の0とか00は0とは判定されませんね。
単に空セルと0を区別してるってことかな?
投稿情報: y sakuda | 2010年5 月 9日 (日曜日) 午後 08時11分
>確かに文字列の0とか00は0とは判定されませんね。
ところが、
文字列の00は
=COUNTIF(B2,"<>0")
では0じゃないとして1を返すんですが、
同じ文字列の00でも
=COUNTIF(B2,0)
では0と判定して1を返すんです。
投稿情報: min | 2010年5 月 9日 (日曜日) 午後 11時20分
>=COUNTIF(B2,0)
そうですねーー、この形だと、空セルは0とはみなさないですから、評価値で比べてるわけでもないし、
なんなんでしょうね?
投稿情報: y sakuda | 2010年5 月 9日 (日曜日) 午後 11時41分
こういうのはジョー3さんがすきそうですね~
投稿情報: くまぷー | 2010年5 月10日 (月曜日) 午前 05時43分
minさんから問題を頂きました。
この場を借りてお礼を申し上げます。
投稿情報: くまぷー | 2010年5 月10日 (月曜日) 午前 05時44分
>と
>と
>の値が違う(違う場合がある?)のですが、なぜですか?
参照範囲数が違うのだから、違う場合のほうが多いと思った。
新規シートでA列未入力だとそれぞれ65536、20、21だったよ?
・・・そういう意味じゃなかった?失礼しましたorz
投稿情報: kir | 2010年5 月10日 (月曜日) 午後 12時37分
>新規シートでA列未入力だとそれぞれ65536、20、21だったよ?
その通りでしょう。
私は0と"0"と空セルの問題の方へ行っちゃいましたw
投稿情報: y sakuda | 2010年5 月10日 (月曜日) 午後 08時02分
>新規シートでA列未入力だとそれぞれ65536、20、21だったよ?
そうなのか、これは、怖い結果ですね。
=COUNTIF(A:A,">0")
か
=COUNTIF(A:A,">0")+COUNTIF(A:A,"<0")
が良いのかな?
投稿情報: 通りすがり | 2010年5 月11日 (火曜日) 午前 04時11分
これかな?
=COUNTIF(A:A,{">0","<0"})
投稿情報: 通りすがり | 2010年5 月11日 (火曜日) 午前 04時27分
こっちでしたね。
=SUM(COUNTIF(A:A,{">0","<0"}))
投稿情報: 通りすがり | 2010年5 月11日 (火曜日) 午前 04時30分
「たぶん」こっちがオススメかなあ。
=COUNTIF($A$1:$A$20,">0")+COUNTIF($A$1:$A$20,"0","そうなのか、これは、怖い結果ですね。
この内容だけ見れば普通の結果ですよ~。未入力も0ではないのですから該当ですよね。
※未入力を0扱いする場合もありますがそちらが特殊な処理)
>A列の1~20に適当な数値(0もいくつか入っている)が入っているとして、
この条件がご希望を表現しきれていないだけかな?
一定範囲の0を除く数値の数を求めたいのでしょうか?
Q&A掲示板でよく引っかかるところで、目的と条件によって対応が違ってくると思います。
例えばセル範囲や、未入力・文字列(=""、スペース、数字、文字)・数値・エラーの有無およびその判断です。
投稿情報: | 2010年5 月11日 (火曜日) 午後 01時03分
↑kirでした。
投稿情報: kir | 2010年5 月11日 (火曜日) 午後 01時04分