黒魔術です。(^^)ゞ
三四郎55
=Mid("** *",(Rows(A1:A$6)+3)*(Cols(A1:$F1)+3) MOD 13,1)
Excel55
=MID("** *",MOD((ROWS(1:$6)+3)*(COLUMNS(A:$F)+3),13),1)
« 2007年10 月 | メイン | 2007年12 月 »
黒魔術です。(^^)ゞ
三四郎55
=Mid("** *",(Rows(A1:A$6)+3)*(Cols(A1:$F1)+3) MOD 13,1)
Excel55
=MID("** *",MOD((ROWS(1:$6)+3)*(COLUMNS(A:$F)+3),13),1)
三角関数版 三四郎50への道
はじめは、
=If(Atan2(6-Row(A1),6-Col(A1)) MOD (Pi()/2)<=Pi()/4,"*")
で行くかな、と思ったんです。
一周2πですから、90°(π/2)ごとに区切って、
そのさらに半分の45°(π/4)以下を選択すれば・・・
ところが、やってみると、負の部分は上手くいかない。
三四郎のmodは、負数だと、負数が返るんですね。
Excelは負数でも正数が返るので、中央のエラーを除けば
=LEFT("*",(MOD(ATAN2(ROW()-6,COLUMN()-6),PI()/2)<=PI()/4))
で、できてしまいます。
そこで、負数を正数にするべく、あらかじめ全体にπを足すようにしました。
=If((Atan2(6-Row(M4),6-Col(M4))+Pi()) MOD (Pi()/2)<=Pi()/4,"*")
これが、初期作(63文字)で、この時点で、
95未満達成&最短予測52文字をアップしました。
あとは減量です。PI()を使うと長いので、近似値で誤魔化す。
その結果、55文字になりました。
=If((Atan2(6-Row(A1),6-Col(A1))+Pi()) MOD 1.57<0.8,"*")
さらなる減量のターゲットは、Pi()と0.8です。
どちらも整数にできれば、5文字減らせます。
ここで、MOD 1.57後の数値を見ると、
空白部分の最小値が0.90、*部分の最大値が0.79
ということは、0.1以上0.2以下の数を全体に足すと
0.8を1にすることができる。
そこで、πを約0.16プラスの3.3にして、
=If((Atan2(6-Row(A1),6-Col(A1))+3.3) MOD 1.57<1,"*")
52文字到達。ここで、さらに、3.3を整数にするべく、
1.57の整数倍を表示させて、1.57×5=7.85より、8を発見して、
最終形(50文字)
=If((Atan2(6-Row(A1),6-Col(A1))+8) MOD 1.57<1,"*")
ができました。
sinは、その時点までは、考えていませんでした。
家に帰って覗いてみると、もう、ネタばれ状態で・・・
今回は、3つ。
自慢は、三四郎&Excel69
でも、同じ発想の方居そうですね。(^_^)(^_^)/~
三角関数使用
三四郎50
=If((Atan2(6-Row(A1),6-Col(A1))+8) MOD 1.57<1,"*")
Excel56
=LEFT("*",((MOD(ATAN2(6-ROW(),6.1-COLUMN())+8,1.57)))<1
非三角関数
三四郎81
=If((Max((Row(A1)-6)/(Col(A1)-6.1),(Col(A1)-6)/(6.1-Row(A1)))*10+7) DIV 8=1,,"*")
Excel84
=IF(INT((MAX((ROW()-6)/(COLUMN()-6.1),(COLUMN()-6)/(6.1-ROW()))+0.8)/0.81)=1,"","*")
三四郎69
=If((Rows(A1:A$6)/Cols(A1:$F1))^Sign((Row(A1)-6)*(Col(A1)-6))>=1,"*")
Excel69
=LEFT("*",(ROWS(1:$6)/COLUMNS(A:$F))^SIGN((ROW()-6)*(COLUMN()-6))>=1)
三四郎とExcelが同じ文字数になるのも、珍しい。(^^)(^^)
何度も考えたこと、Col()の引数に、A0とか、A-1とかが使えたら・・・。何度目かにまた同じことを考えたところで、気づきました。マイナスでも良いんだ。ということは、MODが省略できるので、大幅に減らせるはず・・・。F列を0にするのだから、Col(A1)-6でOK。やってみると・・・
=If((2^(3-Rows(A1:A$6))-1)*(Col(A1)-6) MOD 5,,"*")
見事、一気に5文字減で、三四郎50の完成。\(^O^)/
しかしまた電車が停止。今度は、現場検証だそうです。三鷹駅で止まったまま動きません。とりあえず、三四郎50になったので、一筆書きは一旦終わりにして、仕事を始めました。電車がとまると、いつもならJR東日本の対応に腹が立ってしかたがないのだけど(なんで、三鷹折り返しで運転しないの?とか)、今日に限っては、お陰で、三四郎50ができたので、腹立ちも中くらい。(^^)ベ 結局、1時間弱遅刻。約束には間に合った。しかし、土曜は、インターネットへの接続がままならない。とりあえず、三四郎50宣言をアップ。話しが終わって、ちょっとだけ暇ができた。7時20分になったら、もう仕事以外何もできない。さて、50を切れるか・・・。
RとCどっちが縮められるか。Rはもう無理そう(実は無理じゃなく、きっしーさんはちゃんと縮めていたのだった)。Cにターゲットを絞る。また、F1にCol(A0)が入れば・・・。が頭に浮かぶ。浮かぶ。浮かぶ。ちょっと待てよ・・・待てよ・・・。0じゃなくても、分母を消せれば・・・。1行目の分母は、2^(-3)=1/8。ということは、F列を40にすると、A列は35、K列は45、できるジャン。\(^O^)/ 35ということは、35-26=9で、アルファベットの9番目は、abcdefghiで、「i」。ということは、引数をAI1にすればOK。(^^)(^^)
=If(Fp((2^(3-Rows(A1:A$6))-1)*Col(AI1)/5),,"*")
できた、三四郎47だ。やったぁ~~\(^O^)/
--------------------------
電車はなかなか動きません。悪児の頭もなかなか動かず、進展しません。「救出作業は終わったが、車両に異常があるようで、現在点検中。さらに時間がかかる」というアナウンス。定刻から1時間半後に、人と会う約束があるので、それまでには行かなくてはならないのですが、車両故障まで発生したとなると・・・。それ以上遅れる可能性が出たかな、と思いましたが、もう腹をくくったのです。そのまま、一筆書きを考え続けました。と、そうか、2.5でも良いんだ、と思いつきました。2.5でも整数までなら、5で割るとあまりがでるんだ。早速、5^()の5を2に代えてみました。
=If(2^(2-Abs(Row(A1)-6))*(Col(E1) MOD 10) MOD 5,,"*")
これで、1&11列はOKです。あとは、4行目と8行目を0にする。
こっちは、直ぐに思いつきました。0乗して1になっているので、それから、1を引けばよい。他の行は、1を引いても、整数は整数、小数は小数のままだから、影響ない。そう思ってやってみると、
=If((2^(2-Abs(Row(A1)-6))-1)*(Col(E1) MOD 10) MOD 5,,"*")
できました。できました。(^^)(^^) 三四郎57文字。
まだ、57文字ですが、いかにも無駄が多そうな式で、まだまだ削れそうです。電車はまだ動きません。ということは、まだまだ時間があります。まずは、Rの方。これは、いつものパターンで、Abs()を使うのであれば、Rows()を使った方が、短くなることが多い。早速書き換えです。
=If((2^(3-Rows(A1:A$6))-1)*(Col(E1) MOD 10) MOD 5,,"*")
三四郎55。2文字短縮です。次は、Cの方。現在は、A1セルのColの引数に「E1」を入れ、それを10で割った余りを求めることによって、A列K列は5、F列は0が返るようになっています。考えているうちに、やっと電車が動き始めました。これで、最低約束の時間には間に合いそうです。しかし、着くまでにあと5文字、何とか、縮めたい・・・
--------------------------
一段階での解法ですが、もちろん、出かける前にも少し考えていました。まずやってみたのは、mid()と黒魔術による方法。
=Mid("* *",(((6-Row(A1))^4-16)*(Cols(A1:$F6)-1)+200) DIV 65,1)
できたことはできたのですが、62文字。
まだまだ削れそうですがそれでも、50字にはとても届きそうにない。
あとは、やはり、5の倍数化しかないか・・・そう思いながら家を出たのでした。
電車に座って、PCを取り出し開きながら考えました。まず、C方向の4行目と8行目および、R方向の6列目を0にする、これは間違いない。すると、1列目と11列目は5の倍数になり、他は5の倍数ではなくなるので、あとは四隅の12点を何とか5の倍数ではなくすればよい・・・、そう整理したところで、閃きました。1-3(9-11)行の分母に5を入れてやれば良い・・・。早速作ってみました。
=If(5^(2-Abs(Row(A1)-6))*(Col(E1) MOD 10) MOD 5,,"*")
しかし、結果は・・・。
A.5^0は0ではなく1になるので、4行目8行目が"*"にならない。
B.内側の行は、5の倍数になってしまうので、すべて"*"になってしまう。
ダメか、と思ったところで、乗り換えでした。
乗り換えたのは中央快速線。座れたので、PCを取り出しました。しかし、なかなか電車が動かない。変だ、と思ったところで、アナウンスがありました。「人身事故のため、運転を見合わせます。現在、救出中。運転再開の見込みは立ってません」今日はいつもよりも家を出るのが遅れて(もちろん一筆書きのせい)、結構ぎりぎりです。他に迂回路もないので、遅刻はもう確実。ただ、緩行線に乗り換えて、三鷹まで行っていれば少しは早く着けるんだけど、それをやると、ずっと立ち通しになる可能性が大。座っていれば、仕事もできるし、「一筆書き」もできる(^^)(^^)。ということで、腹を据えて、そのまま座っていることにしました。もちろん、仕事より、一筆書き優先。(^^;(^^;)
--------------------------
「中級?初級?」であって、「初級?中級?」ではないのには、理由が2つありました。
1つは、問題が「中」だから、「中」で始めた。
もう1つは、一見中級、でも、ホントは(長方形が書ければ)初級では?ということ。
つまり、「長方形を見つけて56文字」が最終解答だから、それなら、結構簡単に解けるのでは、と思っていたのです。従って、金曜昼の時点で、01の文を書くと共に、もうひとつ、こんなことを画策していたのでした。(^^)ゞ
「明日昼辺り、発展問題を追加したいと思っていますが、如何でしょう?」
出題した「中」より難しい関連問題を土曜昼に日曜20時までの発展問題として追加出題しようと考え、それをくまぷーさんに提案していたのです。
この日はその後出勤し、23時過ぎ帰宅するまでインターネットには接続しませんでした。で、帰宅してパソコンを立ち上げると・・・。
くまぷーさんから、三四郎55文字。minmaxさんから、四捨五入で50文字、という宣言が上がっていたのです。びっくりしました。まさか、56文字が破られるとは・・・。もちろん、発展問題は、中止。出題者悪児は失脚して、解答者悪児の出番です。とはいえ週末は忙しい。それに、あれだけ時間があって、もうこれ以上はできない、と判断したのに・・・。結局、金曜は、寝る前、しばらく56文字の減量を中心に考えましたが、むろん、進展のないままでした。
そして翌朝、さらに衝撃的な宣言が・・・(^^;)(^^;)
minmaxさんから、Excel、三四郎50文字の宣言。そして、きっちーさんからも、三四郎50文字の宣言です。55や、54位なら、二段階でも、と思っていましたが、50文字となると、もう、一段階に違いない。根本的に考え直さなくてはならない、ということです。しかし、土曜はずっと仕事。インターネットを覗くこと自体がほとんどできない、果たして間に合うか・・・。そう思いながら、「出題者悪児の解答」をくまぷーさんにメールで送ってから、家を出ました。(続く)
--------------------------
「田」に触発されて思いついた「中」ですが、思いついた当初は、当然、「田」より断然難しそうに思えました。
縦3本と横2本を書くのは簡単ですが、その縦3本のうち、両側の2本だけ、上下をカットして、真ん中はそのまま残す。それが難しそうに思えたわけです。
まず浮かんだのが、「円」でした。消さねばならない四隅の「A1:A3」は、すべて、F6を中心としてA4を通る円の外側にあり、表示しなければならない「中」は円の内側にありますから、縦3本横2本を書いて、円の外側を消すというものでした。
三四郎69
=If(Fp(Row(A1)/4)*Fp(Col(E1)/5)+(SumSq(6-Row(A1),6-Col(A1))>30),,"*")
Excel75
=IF(MOD(ROW(),4)*(MOD(COLUMN(E1),5))+(SUMSQ(6-ROW(),6-COLUMN())>30),"","*")
もちろん、思いついた当時はまだSUMSQを見つけていませんでしたから、もっと文字数は多かったのですが。(^^)ベ
しかし、その後直ぐに、思いつきました。正方形が書けるなら、長方形も書けるだろう、ということです。「中」の長方形部分は、縦棒がF6から5の距離。横棒がF6から2の距離ですから、横棒の方の距離を2.5倍してやれば、F6から5の距離の正方形と同じように描くことができます。それが、これですね。
三四郎
=If(Max(Abs((6-Row(A1))*2.5),Abs(6-Col(A1)))=5,"*")
Excel
=IF(MAX(ABS((6-ROW())*2.5),ABS(6-COLUMN()))=5,"*","")
というわけで、「長方形を書く」というのがこの問題のテーマになりました。真ん中の縦棒は、「おまけ」というか、むしろ「長方形」を隠すための「フェイント」みたいなものになりました。これまで含めて1段階で書ければもっと文字数を減らせると思いますが、それはちょっと無理なようです。で、あとは無駄を省いて、
三四郎56
=If(Max(Rows(A1:A$6)*2,Cols(A1:$F1))=6 OR Col(A1)=6,"*")
Excel59
'=LEFT("*",(MAX(ROWS(1:$6)*2,COLUMNS(A:$F))=6)+(COLUMN()=6))
=LEFT("*",OR(MAX(ROWS(1:$6)*2,COLUMNS(A:$F))=6,COLUMN()=6))
になりました。
---------------------
と、以上の文を書いたのは、9日(金)のお昼過ぎでした。
その時点では、三四郎は悪児の56文字(きっちーさんも56文字)、
Excelは悪児とminmaxさんの59文字が最短でした。
ところが、その後、思いもかけなかった展開に・・・(続く)
--------------------------
表計算一筆書き第11回の問題は、悪児が出題させて頂いた。
タイトルは、「中禅寺湖シリーズⅠ:中級?初級?」
で、出題は、漢字の「中」
なぜ「中」か?
それは簡単です。(^^)ゞ
くまぷーさんの「田園」の予告で、
これは「田」だろう、と読んだ悪児は、それと同時に、
「田」の次は、当然「中」だろう、と読んだのです。
なぜって・・・
Excel Worldをご存知の方なら、直ぐにお分かりですね。(^^)ゞ
で、「田園」の次の出題を任されたとき、
「ちっちゃな田」と「中」とで大いに悩んだのでした。(^^;)(^^;)
結局、「ちっちゃな田」を選んだのですが、
これが、ジョー3の仰天技で大成功を収めました。(^^)(^^)
で、次の出題者のジョー3やくまぷーさんが、
「中」を出してくれるだろうと期待したのですが、
出ませんでした。そこで、とうとうしびれを切らして、
無理を言って出題させて頂いたのです。(^^)ゞ
さて、皆さんの解答がどうなるか、
とても楽しみです。(^_^)(^_^)/~
投稿情報: 20:15 カテゴリー: 表計算一筆書き | 個別ページ | コメント (3) | トラックバック (0)
表計算一筆書きで、
三四郎を使用する場合の支援マクロを作成しました。
入力したい数式をA1または、F6に入力して、実行して下さい。
(数式が入力されていない場合はシートのフォーマットのみ行います)
!! 表計算一筆書き作成 - - -
!! for 三四郎2007
!! 2007.11.06
!! 実行法:A1かF6に式を入力して実行する
!! 式が未入力の場合は、シートの体裁だけ整える。
Range("A1:K1").EntireColumn.Select()
Selections.Surface.ColumnWidth = 3
Selections.Release()
if Range("A1").Formula = nil then
Range("F6").CopyTo(Range("A1"),,3)
end if
Range("A1").CopyTo(Range("A1:K11"),,3)
Range("M2").Formula = "=GetCellString(A1)"
Range("M3").Formula = "=Len(M2)"
end
表計算一筆書き、「女王陛下への道」
http://kumapooh.justblog.jp/blog/2007/11/post_39db.html#comment-2456489
を見て、最初に思いついたのは、中心を起点として考えると、十字部分は、RCどちらかが、0。バッテン部分は、RCの絶対値が同じ。ということ。
つまり、RCの積が十字部分が0で、バッテン部分が平方数になる。ということは、0も平方数だから、何だ、簡単じゃん、ということで、作ったのが、
=If(Fp(Sqrt(Abs((6-Row(A1))*(6-Col(A1))))),,"*")
同じようなものを作った方、多かったでしょうね。(^^)(^^)
ところが、これだと、E2など、中心から、(1,4)の位置にある、余計な8点も「*」になってしまう・・・。
ここで、一旦止まっちゃいました。
余計な8点を削除する方法が見つからない・・・
しばらく、他の方法で、三四郎57を作って、これで終わりかなぁ、などと思っていました。
しかし、そこで、閃きました。(^^)(^^)
バッテン部分は、RC同じだから、RCCにしても、RRCにしても、R(C)の3乗になる。
十字部分は、RCCにしても、RRCにしても、0、つまり、0の3乗になる。
一方、お邪魔虫部分(E2等)は、RCCにしても、RRCにしても、R(C)の3乗にはならない。
これで、できた\(^o^)/ という感じでした。
作ったのは、三四郎50
=If(Fp(Abs((6-Row(A1))*(6-Col(A1))^2)^(1/3)),,"*")
あとは、減量です。負数の平方根はエラーになりますから、absを付けましたが、負数の立方根は存在するので、absは外せる (^^)(^^)、そう思って作った
=If(Fp(((6-Row(A1))*(6-Col(A1))^2)^(1/3)),,"*")
は、しかし、なぜかエラーになってしまうのです。(-_-;)(-_-;)
調べてみると、三四郎では、負数の立方根を求めると、エラーになっちゃうんですね。(-_-;)(-_-;) Excelでは、もちろんOKですから、これはバグでしょう・・・(;_;)(;_;)
で、縮められたのは、absを^2にすることで1文字だけ。
=If(Fp(((6-Row(A1))*(6-Col(A1))^2)^2^(1/3)),,"*")
このよけいな、「^2」を除けばとても綺麗な式で、数値も試行錯誤の必要がないもので、非常に気に入り、これで満足してしまいました。
しかし、答え合わせ後、minmaxさんの手法を頂くと、さらに2文字減らせることが分かりました。
=If(Fp(((6-Row(A1))^4*(6-Col(A1))^6)^0.1),,"*")
=If(Fp(((6-Row(A1))*(6-Col(A1))^4)^2^0.2),,"*")
特に後者は、負数の立方根が求められるのであれば(三四郎のバグがなければ)、45文字になって、きっちーさんの三角関数46文字を抜けたので、ますます、三四郎のバグが情けない・・・(^^;)(^^;)
この、三四郎49ができて、もう、縮められないと判断して、着手したのが、三角関数版です。
くまぷーさんから、変化球宣言が出ていましたが、Excelはできたけど、三四郎は短くならない、というコメントが出たので、くまぷーさんは、三角関数じゃないだろうな、と思いましたが、きっちーさんは、
多分三角関数だろう、と思いました。
そこで、今回初めて、三角関数に挑戦しました。Atan2の存在を知らなかったので、AtanやAngleで、中心がエラーになるのに悩みましたが、Atan2を見つけてからは、結構簡単でした。できたのは、
=If(Len(Atan2(Row(A1)-6,Col(A1)-6)/Pi())<6,"*")
など、三四郎47三種類。
エンジン部分は同じで、その記号化の手法が違いますが、三四郎の場合、文字数は変わらないことがほとんどのようですね。
その後、きっちーさんの三四郎46宣言を受けて、sinやcosも試したのですが、0<>0が5=5になる、というのには、全く気付かず、完敗でした。(^^)ゞ
でも、悪児的には、三四郎49
=If(Fp(((6-Row(A1))*(6-Col(A1))^2)^2^(1/3)),,"*")
が、今でも、一番気に入っています。(^^)(^^)
1.今回の自慢解答。(^^)ゞ
基本の「お決まり」の関数のみ。
三四郎49
=If(Fp(((6-Row(A1))*(6-Col(A1))^2)^2^(1/3)),,"*")
Excel 50
=LEFT("*",LEN(((6-ROW())*(6-COLUMN())^2)^(1/3))<3)
=MID("**",LEN(((6-ROW())*(6-COLUMN())^2)^(1/3)),1)
2.悪児最短
3種類あるけど、みんな、長さも、基本も同じ。(^^;)(^^;)
三四郎47
=If(Atan2(Row(A1)-6,Col(A1)-6)*4 MOD Pi(),,"*")
=If(Fp(Atan2(Row(A1)-6,Col(A1)-6)*4/Pi()),,"*")
=If(Len(Atan2(Row(A1)-6,Col(A1)-6)/Pi())<6,"*")
Excelでは、エラーになってしまう・・・(-_-;)(-_-;)
(まぁ、三四郎47がExcelでは、48に当たることの証明、ということで)
Excel48(ちょいズル)
=LEFT("#",LEN(ATAN2(ROW()-6,COLUMN()-6)/PI())<6)
3.最初の60切り
三四郎56
=If(Fp((Abs(Rows(A1:A$6)^2-Cols(A1:$F1)^2)+1)^0.5),,"*")
Excel58
=MID("*",LEN(SQRT(ABS(ROWS(1:$6)^2-COLUMNS(A:$F)^2)+1)),1)
4.基本的な方法
三四郎60
=If((Row(A1)=6)+(Col(A1)=6)+(Rows(A1:A$6)=Cols(A1:$F1)),"*")
Excel60
=LEFT("*",(ROW()=6)+(COLUMN()=6)+(ROWS(1:$6)=COLUMNS(A:$F)))
最近のコメント