黒魔術です。(^^)ゞ
三四郎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)
黒魔術です。(^^)ゞ
三四郎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文字が最短でした。
ところが、その後、思いもかけなかった展開に・・・(続く)
--------------------------
表計算一筆書きで、
三四郎を使用する場合の支援マクロを作成しました。
入力したい数式を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)))
表計算一筆書き「星のまたたき」
http://kumapooh.justblog.jp/blog/2007/10/post_f659.html
悪児解答
三四郎ズル3つ&Excelズル無し&お遊び
(ろくなものないです。(^^;)(^^;))
三四郎
1.循環&カスタマイズ
=If($F$6=1,--(SumSq(Row(A1)-6,Col(A1)-6) DIV 5=5),--(Rows(A1:A$6)+Cols(A1:$F6)<=5))
(ズル:F6の表示形式を [E;=1]"";[E;=0]"*" にカスタマイズ)
2.循環&作業セル
=If(If($L$1,SumSq(Row(A1)-6,Col(A1)-6) DIV 5=5,Rows(A1:A$6)+Cols(A1:$F6)<=5),"*")
(ズル:L1に =L2 MOD 2 L2に =L1+1)
3.Now利用:必ず変わるわけではない
=If(If(IsOdd(Second(Now())),SumSq(Row(A1)-6,Col(A1)-6) DIV 5=5,Rows(A1:A$6)+Cols(A1:$F6)<=5),"*")
Excel
1.ズル無し(循環小数)
=IF(IF($H$11="",INT(SUMSQ(ROW()-6,COLUMN()-6)/5)=5,ROWS(A1:A$6)+COLUMNS(A1:$F6)<=5),IF(INT(RAND()*2),"★","☆"),"")
2.お遊び(F9を押し続けると、瞬きます:Now利用:形不正確)
=MID(" ★☆ ☆ ★☆ ",(MID(NOW()&REPT("0",15),13,1)+SUMSQ(ROW()-6,COLUMN()-6))/4+1,1)
表計算一筆書き、
「コスモス」
http://kumapooh.justblog.jp/blog/2007/10/post_6d9a.html#comments
の悪児解答です。
皆さんと同じだと思いますが・・・(^^)(^^)
三四郎43
=If(Ip(SumSq(6-Row(A1),6-Col(A1))/5)=5,"*")
Excel45
=LEFT("*",INT(SUMSQ(6-ROW(),6-COLUMN())/5)=5)
悪児の三四郎62文字です。(^^)(^^)
基本は、二段階で変わりませんが、
外枠の取得を大いに短縮できました。\(^o^)/
=If(Find(5,Row(E5) & Col(E5))+Lcm(Row(C3),Col(C3)) MOD 4,,"*")
ExcelではFind()で検索文字が見つからないと、
エラーになるので使えません。(-_-;)(-_-;)
お節介Excelめ !!
表計算一筆書きの、今週の問題は、
悪児が出題した、「小田代湖」
別に、小田代湖とは何の関係もなく、
前回のくまぷーさん出題の「田」(タイトルは「交響曲第6番」)より、
一回り「小さい田」を書け、というもの。
結構難しいだろうと思ったが、
問題作成時に用意していた、三四郎71文字、Excel77文字の解答が、
ジョー3のExcel 62文字に、あっさりと破られてしまった。
出題者としては、完敗である。(^^;)(^^;)
あわてて、解答者悪児として、三四郎62文字を作ったが、
Excelは、75文字から、進まない。Excel 62文字、
早く見てみたいものだ。(^^)ゞ
なお、問題作成者としては、予想以上に奥深い問題で、
満足しています。(^^)(^^)
くまぷーさんの、表計算一筆書き、「交響曲第6番田園」
http://kumapooh.justblog.jp/blog/2007/10/post_71d8.html
の、悪児の解答です。
三四郎(31文字)
=If(Row(E5)*Col(E5) MOD 5,,"*")
Excel(37文字)
=IF(MOD(ROW(E5)*COLUMN(E5),5),"","*")
みなさんと、同じでしょう。(^^)(^^)
くまぷーさんが、
出題していた三四郎&Excelの問題、
「ピラミッドを書こう」
などを、
表計算一筆書き
と命名した。
まだまだ、続くようだ。(^^)(^^)
また初心者向け解説も始まったので、
まだチャレンジしていない方は、
ぜひ読んでみましょう。(^_^)(^_^)/~
くまぷーさんの、ピラミッドダイアモンド問題(↓)の悪児解答です。
http://kumapooh.justblog.jp/blog/2007/10/post_aa2e.html
新味は、全く、ありません。(^^)ゞ
三四郎(40文字:多分、くまぷーさんと全く同じ)
=If(Abs(6-Row(F6))+Abs(6-Col(F6))<6,"◆")
Excel(41文字:多分、くまぷーさんと全く同じ)
=LEFT("◆",ABS(6-ROW())+ABS(6-COLUMN())<6)
三四郎(32文字:もちろん、アレです。(^^)(^^))
=Repeat("◆",11-Abs(6-Row(F6))*2)
Excel(28文字:これも、アレです。(^^)(^^))
=REPT("◆",11-ABS(6-ROW())*2)
7.切り捨てではなく、切り上げ。
0と1の間に仕切を入れるには、どうすればよいか?
DIVのやることは、切り捨てだけど、これを切り上げにすれば、0と1は区別される、
ということに気付くまで、ちょっとかかってしまった。で気付いて作ったのが、次の式。
=Mid(" * * * *",RoundUp(((Row(F6)-6)^4+(Col(F6)-6)^4)/96+1),1)
69文字。
これで、見事、70文字を切って、手裏剣が完成。\(^o^)/
(第3のハードルクリア(^^)(^^))
ここまで、約25分ほど。
ここで、70文字を切った、というコメントを出したのだった。(^^)(^^)
8.文字数の削減。
あとは、更なる文字数の削減。RoundUp()は普段多用しているけど、切り上げに使える別な関数があったはず・・・。そんな記憶があったので、調べて、Ceilを見つけ、交換して、66文字。切り捨ては、Ipというもっと短いのがあったので、96で割ったときに、商を切り捨てて、0は1にし、1は2にするには、96*2-1の191を加えておけばよい、ということで、Ip版を作ったが、これも66文字。では、DIVを使ったら、と試したが、こちらも、66文字。
Excelでも、66文字が最短だった。
三四郎の3種の中では、
=Mid(" * * * *",Ceil(((Row(F6)-6)^4+(Col(F6)-6)^4)/96+1),1)
が、一番綺麗かな?
また、見慣れない関数は使っていない、という点では、
=Mid(" * * * *",((Row(F6)-6)^4+(Col(F6)-6)^4+191) DIV 96,1)
が、ベストかも。(^^)(^^)
5.If()じゃ、ダメ。
さて、「カスタマイズ」の式をif関数を使ってセルに書き込むことはできるけど、それではもちろんとんでもない長さになってしまう。ifが使えるのは、2択かせいぜい3択まで。ここは、最低6択になるのだから、ifではダメ。ではどうすれば良いか。
6.Mid()による条件分岐。
はるか昔、N88DISKBasicというのを使っていた頃・・・。長いプログラムを書く場合、メモリの関係で、できるだけ文字数を少なくしたかった。そこで多用したのが、Mid関数による条件分岐。フラッグが1なら、yを、2なら、nを、3なら、fを表示させたい場合に、
%sel = Mid("ynf",%flag,1)とやるわけである。ここも、数値をいくつかに区切って、それに対応させて★の表示非表示をさせれば良いのだ。もちろん、いくつずつに区切ったら良いのか、それは試行錯誤するしかないなぁ、と思って次の式を作った。
=((Row(E6)-6)^4+(Col(E6)-6)^4) DIV $M$1
これで、M1に、色んな数字を入れていけば・・・。で、最初の数字は・・・。
(1) できるだけ大きな数字が良い。
(2) 0は、非表示で、1は★、次の非表示は97。
ということは、当然、96ですね。
で、96を入れてみたら・・・。
なんと、★とするセルは、0,3,5,13となり、
真ん中を除いて、非表示のセルとの重複はないではないか。\(^o^)/
まだ、真ん中が、★になっているけど、これを使って式にすると、
=Mid("* * * *",((Row(F6)-6)^4+(Col(F6)-6)^4) DIV 96+1,1)
これで、中心が★になってしまうことを除けば、手裏剣が書けたのだ。
文字数は、63。あとは、中心をどうするかだけど・・・
これで、第2のハードルクリア(^^)(^^)
>悪児さんはどのような発想から
>このような式を思いつくのか???
というご質問を頂きましたので、お答えします。(^^)ゞ
0.特殊関数は捨てる。
HarMean()のような、得体の知れない関数((^^;)(^^;))を使うという可能性は当然考えた。しかし、図形から浮かんでくるものはないし、片端から調べるのは趣味ではないので、この路線は捨てることにした。
1.点対称にこだわる。
形は点対称。ということは、Row(A1)-6とCol(A1)-6を使うことは必須。これを使って70字未満ということは、両者とも、1度しか使えない筈。で、これを使って各セルを数値化する式を考える。
2.まず2乗。
まず考えたのは、多分皆さん考えたと思うけれど、2乗の和。
=(Row(F6)-6)^2+(Col(F6)-6)^2
これを使えば、真ん中の円の部分は簡単に取れる。でも、羽の部分と中心を見て、これでは不可能ということが判明する:この式をA1:K11にコピペすると、次のような数値になる。
これでは、★を表示させるB3と表示させないA6が同じ25になってしまうのだ。
3.次いで、4乗。
次に考えたのは、当然、4乗の和。
=(Row(F6)-6)^4+(Col(F6)-6)^4
すると、数値の重複が(ほとんど?)なくなるのだ。
4.まず、ズル。
これで、三四郎の場合、「ズル」を使うとできてしまう。(^^)(^^)
「ズル」とは、Excelの「セル書式」の「ユーザー定義」に当たる、「表示形式」の「カスタマイズ」。ここに、
[E;>1200]"*";[E;>=600]"";[E;>=300]"*";[E;>=90]"";[E;>0]"*";[E;=0]""
を指定すると、手裏剣が表示されるのだ。(^^)(^^)
Excelでは、4種類しか指定できないが、三四郎では、制限がないので、6種類くらいは楽勝なのだ。\(^o^)/
これで、第1のハードルクリア。(^^)(^^) (続く)
三四郎(66文字)
全部、66文字。変わらなかった・・・(^^;)(^^;)
1.
=Mid(" * * * *",((Row(F6)-6)^4+(Col(F6)-6)^4+189) DIV 95,1)
2.
=Mid(" * * * *",Ip(((Row(F6)-6)^4+(Col(F6)-6)^4+191)/96),1)
3.
=Mid(" * * * *",Ceil(((Row(F6)-6)^4+(Col(F6)-6)^4)/96+1),1)
ズルを使うと、(28文字)
=(Row(F6)-6)^4+(Col(F6)-6)^4
Excel(66文字)
Excelでも、66文字でした。
=MID(" * * * *",INT(((ROW()-6)^4+(COLUMN()-6)^4+189)/95),1)
くまぷーさんの、三四郎(&Excel)図形シリーズ、
第3弾は、「ストライク」
http://kumapooh.justblog.jp/blog/2007/09/post_49a6.html
第四弾は、「手裏剣」
http://kumapooh.justblog.jp/blog/2007/09/post_428e.html
だった。
「ストライク」は、正直、ちょっとやさし過ぎて(&工夫の余地もほとんどなく)、あまり面白くなかったが、「手裏剣」は、結構難問。ハードルが3つあるんだけど、その第1がなかなか気付きにくい。言い換えれば、気付けば、そんなことか、ってことなんだけど。
ハードルの2・3は、if文より効率の良い条件分けの手法。これは、if嫌いの悪児の場合、以前(N88DISKBASICの時から)から使っていたもので簡単なのだけど、ifを常用している人には難しいかも。(^^)ゞ。でも、くまぷーさんは、if使いな筈だから、悪児とは、違う方法かしら?(^^)(^^)。
答え合わせが、楽しみ。(^_^)(^_^)/~
三四郎でピラミッド
(詳しくは、↓
http://kumapooh.justblog.jp/blog/2007/09/post_0a86.html
)
を、
1.他の機能を使って、数式だけより短い式で。
解く解答だが、これもExcel組はほとんどの人が気がついたようだ。
一般解答
[三四郎]
=If(Abs(6-Col(A1))-Row(A1)<0,"*")
[Excel]
=IF(ABS(6-COLUMN())-ROW()<0,"*","")
から、数値を文字列に変換する部分を省いて、
[三四郎]
=Abs(6-Col(A1))-Row(A1)
[Excel]
=ABS(6-COLUMN())-ROW()
を入力する。
あとは、この結果が、
負になる場合に"*"、それ以外は""を表示させるよう、
セルの表示形式を書式文字を使って設定する。
その方法は、
[三四郎]
「書式」-「表示形式」で右下の「カスタマイズ」をクリックして、
下の、表示書式に、
[E;<0][C;黒]"*";" "
と入力すると、負の場合、黒文字で、"*"を表示し、
それ以外は、何も表示しない、という指定ができる。
[Excel]
「書式」-「セル」-「ユーザー定義」で、
;"*";;
と入力すると、負の場合"*"を表示し、それ以外は何も表示しない、
という指定ができる。
一見、Excelの方が、簡単そうに見えるが、
それは、Excelが最大4種の設定までしかできないからで、
三四郎の方が、遙かに細かく書式設定をすることができる。
最後に、もうひとつお遊び。
左上1/4だと、行列の小さい方の奇数偶数で、*の有無を判定できるので、
左上はそれで判定し、残りはそのミラー表示。
ミラー表示が、思ったより遙かに面倒だった。(^^;)(^^;)
三四郎(129文字)
=If(Row(A1)>6,Index(A$1:A$6,1,12-Row(A1)) & "",If(Col(A1)>6,Index($A1:$E1,12-Col(A1),1) & "",If(Min(Row(A1),Col(A1)) MOD 2,"*")))
Excel(111文字)
=IF(ROW()>6,OFFSET(A$6,6-ROW(),0),IF(COLUMN()>6,OFFSET($F1,0,6-COLUMN()),LEFT("*",MOD(MIN(ROW(),COLUMN()),2))))
offsetが使える分、Excelの方が、簡単。
そして、エンジンの短縮を思いついて、悪児最少文字数版
三四郎(47文字)
=If(Max((Row(A1)-6)^2,(Col(A1)-6)^2) MOD 2,"*")
Excel(49文字)
=LEFT("*",MOD(MAX((ROW()-6)^2,(COLUMN()-6)^2),2))
この単純版をもっと圧縮できないか、
というので作ったのが、単純四分割ミラー版
三四郎(106文字)
=Mid("******* * ***** * * * *** * * ",Abs(Row(A1)-1-10*(Row(A1)>6))*6+Abs(Col(A1)-12*(Col(A1)>6)),1)
Excel(145文字)
=LEFT("*",INDEX({1,1,1,1,1,1;1,0,0,0,0,0;1,0,1,1,1,1;1,0,1,0,0,0;1,0,1,0,1,1;1,0,1,0,1,0},ABS(ROW()-12*(ROW()>6)),ABS(COLUMN()-12*(COLUMN()>6))))
これでやめようと思ったけど、
馬鹿馬鹿しいのを思いついたので。(^^;)(^^;)
三四郎(154文字)
=Mid("************ ** ******* ** * * ** * *** * ** * * * * ** * *** * ** * * ** ******* ** ************",(Row(A1)-1)*11+Col(A1),1)
Excel(275文字)
=LEFT("*",INDEX({1,1,1,1,1,1,1,1,1,1,1;1,0,0,0,0,0,0,0,0,0,1;1,0,1,1,1,1,1,1,1,0,1;1,0,1,0,0,0,0,0,1,0,1;1,0,1,0,1,1,1,0,1,0,1;1,0,1,0,1,0,1,0,1,0,1;1,0,1,0,1,1,1,0,1,0,1;1,0,1,0,0,0,0,0,1,0,1;1,0,1,1,1,1,1,1,1,0,1;1,0,0,0,0,0,0,0,0,0,1;1,1,1,1,1,1,1,1,1,1,1},ROW(),COLUMN()))
Excelも、midを使えばもっと短くなるけど、
これが一番単純、ってことで。(^^)ゞ
で、三四郎では、ifの方が短くなるかな、ということで、
ifにすると、
三四郎(49文字)
=If(Max(Abs(Row(A1)-6),Abs(Col(A1)-6)) MOD 2,"*")
Excel(52文字)
=IF(MOD(MAX(ABS(ROW()-6),ABS(COLUMN()-6)),2),"*","")
で、三四郎は、Leftyoより、短くなりました。
ExcelはLeftの方が短いですね。
最初に作ったのは、
三四郎(51文字)
=Left("*",Max(Abs(Row(A1)-6),Abs(Col(A1)-6)) MOD 2)
Excel(51文字)
=LEFT("*",MOD(MAX(ABS(ROW()-6),ABS(COLUMN()-6)),2))
で、「*」の表示法ではなく、エンジンそのものは、これで決まり!
と思ってました。(^^)ゞ
もう、次のお題が出た。
三四郎でぐるぐる渦巻き、だそうだ。
詳しくは、↓こちら。
http://kumapooh.justblog.jp/blog/2007/09/post_21f4.html
風呂に入って考えていたら、
解法が閃いた。直ぐ閃いたので、皆さん直ぐに気付くかな?
と思ったら、結構そうでもないらしい。
今のところ、三四郎派の悪児ときっちーさんが、気付いているようだ。
Excel組に、勝てるかな? (^^)(^^)
三四郎でピラミッド
(詳しくは、↓
http://kumapooh.justblog.jp/blog/2007/09/post_0a86.html
)
に寄せられた解答で、一番オーソドックスなのは、
ABS()関数と、If関数を使ったもの。
三四郎では、31文字で
=If(Abs(6-Col(A1))<Row(A1),"*")
Excelでは、33文字で
=IF(ABS(6-COLUMN())<ROW(),"*","")
となる。
増減の収支は、
col関数とCOLUMN関数という関数名の差で、三四郎が-3
Row等の引数省略の可否で、Excelが-4
If関数の第2引数省略時の動作の差で、三四郎が-3
で、都合、三四郎の-2となる。
関数名の長さの差は、あまり意味がない。
(文字数の少なさを競う遊び以外ほとんど長さは関係ない)
Row等の引数省略は、三四郎でも可能であって欲しかった。
これは、Excelの勝ち。
If関数の第2引数省略時の動作。
Excelの方が詳細な設定ができるということで、
Excelの方が高機能といえるが、反面、
三四郎の「いい加減さ」も「融通が利く」ともいえて、
どちらがまさっているともいえない。
では、総合は?
皆さん、どう思います?
くまぷーさんが、
三四郎でセルを使って、ピラミッドを作る
という問題を出題された。(^^)(^^)
http://kumapooh.justblog.jp/blog/2007/09/post_0a86.html
A1の数式を対象範囲にコピーするだけで作る、
というのが、くまぷー問題の「お約束」だけど、
悪児としては、数式だけではなく、他の機能も使ったり
数式も1種類でなくとも良い、というように、
もうちょっと柔軟に考えた方が面白いと思うので、
こっちで、そういうものを考えようと思う。
いままで、考えたのは、
1.他の機能を使って、数式だけより短い式で。
2.1行目は、F列に、「*」を文字列として入力。
そして、2行目以下は、A2の式をコピペ
いかがでしょう? どちらも、解答は、
くまぷーさん同様、9/10 午後6時までご遠慮を。(^^)ゞ
さて、くまぷーさんの解答だが、
Shift-F2で1文字ずつ現れてくるのも面白いけど、
1度に表示させることができたら、それはそれで面白そう。
三四郎では(もちろんExcelでも)反復回数を指定できるから、
反復回数を複数回にするとできるのではないか、
ということで、「きんぐぎどら」は6文字なので、
反復回数を6回にして、やってみた。
すると・・・「らどぎぐんき」にならずに、
「きききききき」になってしまった・・・(^^;)(^^;)
要するに、反復計算では、1度、全部のセルを計算した後、
また最初のセルから2度目の計算をする、
というのではないらしい。このケースでは、どうみても、
A3を6回反復して計算し、その後B1の再計算にかかるらしい。
どうもこの辺が理解できなくて、
悪児は循環参照は苦手(というより非論理的で嫌い?)なのだが、
とすれば、B1だけで済ませてしまえばできるのではないか、
と考えて、B1の式をもう一度見てみた。
A3を参照しているのは、元文字列の切り取り始点を指定するとき。
その数字は、今までに切り取った回数+1となっている。
だから、それを引いたあとで余計な+1分を足し直しているのだが、
それなら最初から、切り取った回数分を引いてやれば良い。
そして、切り取った回数は、そのまま、B1セルに入力されている
文字数分だから、-A3+1を-Len(B1)に替えてやれば良い。
ということで、B1の数式を
=If(A2=0,"",If(Len(B1)<Len(A1),B1 & Mid(A1,Len(A1)-Len(B1),1),B1))
に差し替え、A3を空白にし、反復回数を10回にして、
A2に一旦0を入れて、初期化してから、1を入れたら、
Shift-F2を押すまでもなく、「らどぎぐんき」が表示された。\(^o^)/
これなら、99文字まで(三四郎の反復回数の最大値)
一発&一セル変換ですね。(^^)(^^)
投稿情報: 22:56 カテゴリー: 三四郎一般, 悪児なら | 個別ページ | コメント (3) | トラックバック (0)
くまぷーさんの解答の、解説の続きです。
そして、式B。
=If(A2=0,"",If(Len(B1)<Len(A1),B1 & Mid(A1,Len(A1)-A3+1,1),B1))
はじめのIf関数は、式A同様初期化のための仕掛けだ。
A2がゼロ(空白でも数値以外の文字列でも可)だと、B1が空白にされる。
次のIf関数は、終了判定。
B1に入力された文字列が、A1と同じになると、もう変化させない。
(式では、B1がA1より小さい間は、B1の文字列にA1から切り取った
1文字を追加し、それ以外は、B1をそのままにする)
さて、その1文字の切り取りと追加が、この部分。
B1 & Mid(A1,Len(A1)-A3+1,1)
Mid関数の引数は、Mid(元文字列,始点,切り出し文字数)。
つまり、A1から、その、(Len(A1)-A3+1)番目の1文字を切り出して、
B1の文字列の末尾に連結する。
つまり、A3が1の時は、A1の文字数番目(つまり最後)の文字を切り出し、
A3が2の時は、その一つ前、というように、
「再計算」の度にA3の数字が1ずつ増えるから、それに応じて、
後ろから順に切り出して、逆順に連結していくわけだ。
Shift-F2を押す度に、ひとつずつ文字が繋がっていく・・・
見事なもんですねぇ~~(^_^)(^_^)/~
投稿情報: 21:27 カテゴリー: 三四郎一般, 悪児なら | 個別ページ | コメント (0) | トラックバック (0)
くまぷーさんが、悪児の解答を解説してくれている。(^^)(^^) 。
http://kumapooh.justblog.jp/blog/2007/04/9_73fe.html
お礼に、こちらでも、くまぷーさんの解答の解説をしよう。
くまぷーさんの解答で、数式の入っているのは、次の2セルだ。
ひとつはA3で、式(以下式A)は、
=If(A2=0,0,A3+1)
もうひとつは、B1で、式(以下式B)は、
=If(A2=0,"",If(Len(B1)<Len(A1),B1 & Mid(A1,Len(A1)-A3+1,1),B1))
これを見て、「あれ?」と思った方は、表計算をよく知っている方だ。
式Aは、A3セルに入っているのに、式の中でA3セルを参照している。
つまり、
A3=A3+1
ということで、A3セルの値は、計算をし直す度に1ずつ増えてしまうことになる。
これは、普通の使用法では、避けるべきことなのだが、
くまぷーさんは、これを上手く利用して、
マクロを使わずに、シートを動かすのがお得意なのだ。
さて、式Aの場合、単に数を増やすだけではなく、
A3の値を初期化する(0にする)ための仕掛けもされている。
それが、If関数だ。
A2セルが、ゼロなら、A3セルにゼロを代入し、
ゼロでなければ、A3セルの値を計算し直す度に1増加させる。
これで、最初に、A2にゼロを入力して初期化してから
A2に1を入力すると、A3が1になり、以下
計算し直すたびにA3の値が1ずつ増加することになる。
なお、計算をし直せ(「再計算」という)という命令は、
三四郎の場合、shift-F2で行われる。(続く)
投稿情報: 15:14 カテゴリー: 三四郎一般, 悪児なら | 個別ページ | コメント (1) | トラックバック (0)
「ごじらを逆さまに」問題の、くまぷーさんの解答が紹介された。
http://kumapooh.justblog.jp/blog/2007/04/7_525a_1.html
くまぷーさんの得意技、循環参照を使った、見事な、「名人芸」。
さすがは、くまぷーさん。
対する、悪児版は、全くの「正攻法」。
基本的なワークシート関数だけで、(式はちょっと長いですが)解いています。
興味のある方は、こちら(↓)からDLして、ご覧下さい。(^^)ゞ
投稿情報: 04:06 カテゴリー: 悪児なら | 個別ページ | コメント (7) | トラックバック (0)
次は、
A1に全角カタカナの「ゴジラ」をバラバラにして逆さまにして欲しい。
だそうだ。
http://kumapooh.justblog.jp/blog/2007/04/4_476a.html
やってみました。
三四郎じゃあんまり簡単なので、Excelでも。(^^)ゞ
こ゛し゛らを18文字以下で「ばらばら」にする、「方法」
1.「右詰」
A2に、
=Left($A1,Col(A1))
E2まで、右コピー。
A2:E2のセル書式-配置-横位置を右詰にし、セルの列幅を1文字分にすると・・・
2.さらに「ずる」
A2に
=Mid($A1,A8,1)
E2まで、右コピー。
A8からE8に、1,2,3,4,5を入力すると・・・
3.Mid以外。
Foldをつかう。
=Fold($A1,1,Col(A1))
これは、「ずる」じゃ、ありません。(^^)ゞ
投稿情報: 10:09 カテゴリー: 三四郎一般, 悪児なら | 個別ページ | コメント (1) | トラックバック (0)
くまぷーさんの
「教員のための三四郎活用講座」で、
A1セルに入っている「ごじら」をばらばらにせよ
という問題が提出された。
B1~B5に数式を入れて、
B1に「こ」、B2に「゛」、B3に「し」、B4に「゛」、B5に「ら」
と表示させるのである。
http://kumapooh.justblog.jp/blog/2007/04/3_2b1b.html
なお、式は、各セルに別々に入れるのではなく、
B1に入れた式をB5まで「右コピー」するのが「お約束」
もちろん、すぐに作った。
=Hira(Zen(Mid(Han(Kata($A1)),Col(A1),1)))
当然といえば当然だが、
これは、べべちゃんの解答と全く同じ。
ところが、今度はそのべべちゃん、
「ごじら」ならぬ「こ゛し゛ら」なら、
三四郎で、「等号を含めて18文字!!」でできる、
とおっしゃってるではないか。
やってみた。
=Mid($A1,Col(G1),1)
とこが、文字数を数えると、19文字!!
一文字多いではないか。
ううん、ちょっと困ったが、できない、じゃ、情けない。
ちょっと「ずる」しても、ってことで、考えた。
まずは、「右詰」を使った。これだと、ジャスト18文字。
これかなぁ~~(^^;)(^^;)
それからもっと「ずる」をして、14文字とか、
Midを使わずに、20文字、なんていうのも考えた。
ところが、その後くまぷーさん曰く。
18というのは数え間違えで、19文字だった。
あちゃ~~ _| ̄|○
投稿情報: 00:04 カテゴリー: 三四郎一般, 悪児なら | 個別ページ | コメント (2) | トラックバック (1)
最近のコメント