スーパーボールXLIV その2 出題者解答
今回は問題自体がつまらなかったのか、意外と難しかったのか
もりあがりませんでしたね。
出題者として反省しておりますm(__)m
今回はどれも発想は同じで、使う関数で多少バリエーションはありますが、最短は115どまりでした。
{=SUM((MID(B4,ROW(1:8),1)={"I","V","X","L","C"})*{1,5,10,50,100},(ISERR(FIND({"IV","IX";"XL","XC"},B4))-1)*{2;20})}
ROMANを使ったものも参考に提示しておきます。29です。
{=MATCH(B4,ROMAN(ROW(A:A)),)}
(y sakudaさん談)
今回は、いきなり111文字を書いても常連さん以外にわかりにくそうなので、
私の最短までの道のりの式を書いてみました。
考え方がほかの方とだぶっているかもしれませんが。
[その1]
最初、長くなるのは承知の上でSUBSTITUTEのみでやろうとして、
ネストの限界に阻まれた(エクセル2007の場合は知りません)ので代わりにCOUNTIFを足して
164=LEN(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B4,"V",1/8),"L","XXXXX"),"C","XXXXXXXXXX"),"X",10^9))-SUM(COUNTIF(B4,{"*IV","*IX"})*2,COUNTIF(B4,{"XL*","XC*"})*20)
(ちょっと解説)
前半のLEN以下の式で「V」を5文字(1/8→0.125)、「L」を「XXXXX」、「C」を「XXXXXXXXXX」に変換した後、「X」を10文字(10^9→1000000000)に変換してLENで文字数を取得
後半の-SUM(COUNTIF以下の式で「IV」「IX」があった場合は、それぞれ2文字、「XL」「XC」があった場合はそれぞれ20文字を引く。
2文字又は20文字を引く理由は
LENの式の中で最終的に「IV」は6文字「IX」は11文字カウントされているため、それぞれ6-2=4、11-2=9で2文字引き
LENの式の中で最終的に「XL」は60文字「XC」は110文字文字カウントされているため、それぞれ60-20=40、110-20=90で20文字引く
以下2時間くらいかけて変更していった順番に(一部省略しますが)追って掲載します。
投稿情報: min | 2009年10 月24日 (土曜日) 午後 08時14分
結局、反則のROMAN+循環参照だけです(^^ゞ
26:=IF(ROMAN(D4)<>B4,D4+1,D4)
B4の文字列をクリアーすると初期化されます。
投稿情報: くまぷー | 2009年10 月24日 (土曜日) 午後 08時15分
(;゚゚)ウッ!
なんか,minmaxさん凄い!!
投稿情報: くまぷー | 2009年10 月24日 (土曜日) 午後 08時17分
[その2,3]
後半の2つのCOUNTIFを1つに集約
152=LEN(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B4,"V",1/8),"L","XXXXX"),
"C","XXXXXXXXXX"),"X",10^9))-SUM(COUNTIF(B4,{"*IV","*IX";"XL*","XC*"})*{2;20})
「V」「L」「C」は1文字を超えることはないので、SUBSTITUTEを止めてCOUNTIFに置き換え
141=LEN(SUBSTITUTE(B4,"X",10^9))+COUNTIF(B4,"*V*")*4+COUNTIF(B4,"*L*")*49
+COUNTIF(B4,"*C*")*99-SUM(COUNTIF(B4,{"*IV","*IX";"XL*","XC*"})*{2;20})
置き換える際に「L」「C」はLENの中で1文字文カウントされているので、「L」「C」のCOUNTIFの結果にそれぞれ50-1=49、100-1=99をかける
投稿情報: min | 2009年10 月24日 (土曜日) 午後 08時28分
[その4,5]
COUNTIFを2つに集約
123=LEN(SUBSTITUTE(B4,"X",10^9))+SUM(COUNTIF(B4,{"*V*","*L*","*C*"})*{4,49,99},
COUNTIF(B4,{"*IV","*IX";"XL*","XC*"})*{-2;-20})
COUNTIFを1つに集約
125=LEN(SUBSTITUTE(B4,"X",10^9))+SUM(COUNTIF(B4,{"*V*","*L*","*C*";"*IV","*IX",0;"XL*","XC*",0})
*{4,49,99;-2,-2,-2;-20,-20,-20})
投稿情報: min | 2009年10 月24日 (土曜日) 午後 08時30分
[その6、7]
COUNTIF内の配列を整理
114=LEN(SUBSTITUTE(B4,"X",10^9))+SUM(COUNTIF(B4,{"*V*","*L*","*C*","*IV","*IX","XL*","XC*"})
*{4,49,99,-2,-2,-20,-20})
+、-の符号を反対に
113=LEN(SUBSTITUTE(B4,"X",10^9))-SUM(COUNTIF(B4,{"*V*","*L*","*C*","*IV","*IX","XL*","XC*"})*{-4,-49,-99,2,2,20,20})
投稿情報: min | 2009年10 月24日 (土曜日) 午後 08時31分
[その8]
COUNTIF内の「*」を前後に集約して111文字の完成。
これ以上の短縮は、その後検討しましたが・・・・。
111=LEN(SUBSTITUTE(B4,"X",10^9))-SUM(COUNTIF(B4,"*"&{"V","L","C","IV","IX","XL","XC"}&"*")*{-4,-49,-99,2,2,20,20})
ん、何か最初から111出しておいた方がわかりやすかったですかね?
まいいか。
その後110も出来ました。
110=LEN(SUBSTITUTE(B4,"X",10^9))-SUM(ISNUMBER(FIND({"V","L","C","IV","IX","XL","XC"},B4))*{-4,-49,-99,2,2,20,20})
おまけは後で投稿します。
投稿情報: min | 2009年10 月24日 (土曜日) 午後 08時35分
minmaxさんの方式は全く考えなかったですねーー
後半部分の考え方は同じなんですが、CountIfのこういう使い方は全く思いも付かなかったです^^;
これがどう短くなるのか楽しみに拝見しますw
投稿情報: y sakuda | 2009年10 月24日 (土曜日) 午後 08時43分
minmaxさんの110まで拝見しました
面白かったw
この問題あんまりやり方ないと思ってたんですが、思いこみはダメですね――
投稿情報: y sakuda | 2009年10 月24日 (土曜日) 午後 08時53分
各式共に細部までよく見て並び替えれば、後幾つかは短くなると思いますが
式を短くは得意分野では無いし、またそこに余り面白さを感じていませんので
式を短く、、、とは考えていません
文字数はあくまで出来上がりの結果に過ぎません
、、、て、何時もの事ですが
=SUM(COUNTIF(B4,"*"&MID("IIIVIXXX*IXLXC",{1,1,1,3,4,5,6,6,6,8,11,12,13,14},{1,2,3,2,1,2,1,2,3,4,2,1,2,1})&"*")*{1,1,1,-2,5,-2,10,10,10,10,-20,50,-20,100})
{=SUM(ISNUMBER(SEARCH({"I","II","III","V","X","XX","XXX","L","C","IV","IX","XL","XC","X*IX"},B4))*{1,1,1,5,10,10,10,50,100,-2,-2,-20,-20,10})}
=SUM(COUNTIF(B4,"*"&{"I","II","III","IV","V","IX","X","XX","XXX","X*IX","XL","L","XC","C"}&"*")*{1,1,1,-2,5,-2,10,10,10,10,-20,50,-20,100})
{=SUM((CODE(RIGHT(0&B4,ROW(1:8)))={73,86,88,76,67})*{1,5,10,50,100},-ISNUMBER(FIND({"IV","IX","XL","XC"},B4))*{2,2,20,20})}
{=SUM((MID(B4,ROW(1:8),1)={"I","V","X","L","C"})*{1,5,10,50,100},-(MID(B4,ROW(1:7),2)={"IV","IX","XL","XC"})*{2,2,20,20})}
{=SUM((MID(B4,ROW(1:8),1)={"I","V","X","L","C"})*{1,5,10,50,100},-ISNUMBER(FIND({"IV","IX","XL","XC"},B4))*{2,2,20,20})}
{=SUM((LEN(B4)-LEN(SUBSTITUTE(B4,MID("IXCIXIVXL",ROW(1:9),2-MOD(ROW(1:9),2)),)))*{1;-10;100;-1;10;-1;5;-10;50})}
投稿情報: からくち | 2009年10 月24日 (土曜日) 午後 08時55分
からくちさんのも一通り鑑賞しました。
長いほうのやつは面白いですねーー
120、122のは私のと発想同じですが・・・
112はうなっちゃった
私もSubstituteやLenを使ったのもあるのですが、115と発想はあまり変わらない126でした
=SUM((LEN(B4)-LEN(SUBSTITUTE(B4,{"I","V","X","L","C"},)))*{1,5,10,50,100},(SUBSTITUTE(B4,{"IV","IX";"XL","XC"},)<>B4)*-{2;20})
投稿情報: y sakuda | 2009年10 月24日 (土曜日) 午後 09時10分
>式を短くは得意分野では無いし、またそこに余り面白さを感じていませんので
>式を短く、、、とは考えていません
式の短さはエクセルでは重要ではないと私も常々思っております。
ここの一筆書きでも、参加当初は長い式でも考え方がすばらしければ良いと本当に感じていました。
それは、今でも同じです。
でも、ここはパズル的な要素があるので、短くすることも楽しんでおります。
それにしても、からくちさんの最初の式は思いつきませんね。
ほかのは、まだ良く見てませんが。
投稿情報: min | 2009年10 月24日 (土曜日) 午後 09時10分
からくちさん、sakudaさん、くまぷーさん以外まだ出てこられないようですので、つなぎに似たようなもので大したものではありませんが出そうと思っていたおまけを出しときます。
[おまけ]
115{=LEN(SUBSTITUTE(B4,"X",10^9))-SUM(COUNTIF(B4,MID
("***V**L**C**IV*IXXL*XC*",ROW(1:7)*3,3))*{-4;-49;-99;2;2;20;20})}
115{=LEN(SUBSTITUTE(B4,"X",10^9))-SUM(COUNTIF(B4,"*"&MID
("*V*L*C*IVIXXLXC",ROW(1:7)*2,2)&"*")*{-4;-49;-99;2;2;20;20})}
たまには、FREQUENCY使ってみるかということで、使い方はあんまり理解してま
せんので、山勘で
142=SUM((CODE(RIGHT(B4,ROW(INDIRECT("1:"&LEN(B4)))))-66,{1;7;10;20})*
{100;1;50;5;10},-COUNTIF(B4,{"*IV","*IX","XL*","XC*"})*{2,2,20,20})
131=SUM(FREQUENCY(CODE(MID(B4,ROW(1:8),1)&"B")-66,{0;1;7;10;20})*
{0;100;1;50;5;10},-COUNTIF(B4,{"*IV","*IX","XL*","XC*"})*{2,2,20,20})
ついでに
SUMとCOUNTIFだけで
158=SUM(COUNTIF(B4,"*"&
{"V","L","C","IV","IX","XL","XC","X","XX","XXX","I","II","III","XIX","X
LIX","XCIX"}&"*")*{5,50,100,-2,-2,-20,-20,10,10,10,1,1,1,10,10,10})
あ、そうだ1010文字数なんてのもありますが、つまらないので出しません。
投稿情報: min | 2009年10 月24日 (土曜日) 午後 09時17分
>あ、そうだ1010文字数なんてのもありますが、つまらないので出しません。
そんな長いの良く動くようにかけましたね^^;
私は多分途中で断念してますねーー
投稿情報: y sakuda | 2009年10 月24日 (土曜日) 午後 09時24分
1010文字は
=VLOOKUP(B4,{"I",1;"II",2;"III",3;"IV",4;・・・・・・・,98;"XCIX",99;"C",100},2,)
ってVLOOKUPのみの単純なもので決して手で打ち込んだものではありません。
それにしても、ジョー3さん、himiさんそのほかのみなさんおいでになりませんね。
投稿情報: min | 2009年10 月24日 (土曜日) 午後 09時56分
VLOOKUPが出てきたので、、、
{=SUM(LOOKUP(FIND(MID(B4,ROW(1:8),1)," IVXLC"),ROW(1:6),{0,1,5,10,50,100}),-LOOKUP(9,FIND({0,"IV","IX"},B4&0),{0,2,2}),-LOOKUP(9,FIND({0,"XL","XC"},B4&0),{0,20,20}))}
お遊び、お遊び、、、
投稿情報: からくち | 2009年10 月24日 (土曜日) 午後 10時01分
すみません、minmaxさんのCode使った142ですが、なんかおかしい。
今一つ発想が分かってないから修正できません。よろしくーー
しかし、minmaxさん、からくちさんはとことん楽しまれてますねーー
投稿情報: y sakuda | 2009年10 月24日 (土曜日) 午後 10時15分
再掲
142
=SUM(FREQUENCY(CODE(RIGHT(B4,ROW(INDIRECT("1:"&LEN(B4)))))-66,{1;7;10;20})*{100;1;50;5;10},-COUNTIF(B4,{"*IV","*IX","XL*","XC*"})*{2,2,20,20})
でした。
しかし、FREQUENCYって初めて使ったけどこんなんでよかったのかな?
からくちさんと同様
LOOKUPでやろう思ったのですが、うまくまとめられませんでした。
投稿情報: min | 2009年10 月24日 (土曜日) 午後 10時25分
そう言えば、循環の19
くまぷーさんと実質同じの
=D4+(ROMAN(D4)<>B4)
だったのですが、sakudaさんのは?
投稿情報: min | 2009年10 月24日 (土曜日) 午後 10時30分
ああ、142はFrequencyだったんですか
ありがとうございました。
私もLookupは試みましたが124
{=SUM(LOOKUP(MID(B4,ROW(1:8),1),{"","C","I","L","V","X";0,100,1,50,5,10}),(ISERR(FIND({"IV","IX";"XL","XC"},B4))-1)*{2;20})}
まあ、見直してみると長いのは色んな関数試してます^^;
投稿情報: y sakuda | 2009年10 月24日 (土曜日) 午後 10時33分
なるほど、19はこういうのですか。
考えなかったですねーー
私のは平凡です34ですから話になんない
=IF(ROMAN(D4)=B4,D4,MOD(D4+1,101))
投稿情報: y sakuda | 2009年10 月24日 (土曜日) 午後 10時37分
なるほど〜
すばらしい
携帯から
投稿情報: min | 2009年10 月24日 (土曜日) 午後 10時47分
昨日は疲れていて早く眠ってしまいまして
今、目が覚めました。
そして覗いたら式がいっぱい・・・
それも、ものすごくヘビーな式が・・・
すみません・・・、もう一寝入りします(^^ゞ
投稿情報: くまぷー | 2009年10 月25日 (日曜日) 午前 03時20分
>式がいっぱい・・・
今回は、状況からして投稿数が少なそうだったので精一杯無理してほとんど全部の式を投稿し、また、分割、解説までして頑張ってしまいました。
ところで、sakudaさん、からくちさんなどの式を参考にもっと短い式出来ませんか?
投稿情報: min | 2009年10 月25日 (日曜日) 午前 05時21分
>それも、ものすごくヘビーな式が・・・
違う意味で、、、ヘビーな式
{=SUM(FIND(MID(B4,ROW(1:8),1)," I V X"&REPT(0,39)&"L"&REPT(0,49)&"C")-1,-(MID(B4,ROW(1:7),2)={"IV","IX","XL","XC"})*{2,2,20,20})}
投稿情報: からくち | 2009年10 月25日 (日曜日) 午前 09時58分
からくちさんの上の式ですが
結果があわないみたいですが・・・
例えばVが3になってしまいます。
スペースが消えてしまっているのかな?
投稿情報: くまぷー | 2009年10 月25日 (日曜日) 午後 01時12分
>スペースが消えてしまっているのかな?
かも・・・
{=SUM(FIND(MID(B4,ROW(1:8),1),"0I000V0000X"&REPT(0,39)&"L"&REPT(0,49)&"C")-1,-(MID(B4,ROW(1:7),2)={"IV","IX","XL","XC"})*{2,2,20,20})}
投稿情報: からくち | 2009年10 月25日 (日曜日) 午後 01時35分
>それにしても、ジョー3さん、himiさんそのほかのみなさんおいでになりませんね。
あははーーーー
土日、70k程離れた・・・・
(三沢→青森)
行ってましたーーー
みちのく道路の紅葉が綺麗でしたーーー
で、、、
皆さんすごいですーーー
私は、
2個だけでしたーーー
単純ーーーー41
{=MAX((ROMAN(ROW(1:100))=B4)*ROW(1:100))}
(進歩無い私)
19って声を聞いて・・・・
あれれ、、、いなくなった。
投稿情報: jyo-3 | 2009年10 月25日 (日曜日) 午後 05時59分
前回、からくちさんも仰って居られましたが、出題は難しいですねーー
今回は、ROMAN使うと簡単なのは分かり切ってましたが、それを禁止した場合、
1.手法はかなり限られてバリエーションがない
2.手法が限定されるため、簡単すぎる
と思っていたのですが、難しい部類になっちゃったみたいですね。
それに、からくちさん、minmaxさんの回答見ると、長さは別にして手法はやはり沢山ある・・・・
「誰でも参加出来て、やり方は無数にある」
こういうのは難しいですねーー
投稿情報: y sakuda | 2009年10 月25日 (日曜日) 午後 07時39分
>こういうのは難しいですねーー
わたしの残2問
1問:
超易しい、、、と言うか易し過ぎて即全員同じ答えに
それ以外の答えは、お遊びのみに
2問:
両極端と思う
両極端とは、、、直ぐに答えを発見OR最後まで発見出来ず
あえて発見と言う言い方に、、、それは・・・hisohiso
わたし個人的には、、、どんな問題も皆同じ
勝手にお遊び、、、なので
難しさレベル
どんな問題も、、、解答は1<<<出題は100
投稿情報: からくち | 2009年10 月25日 (日曜日) 午後 09時00分
sakudaさんの
>=IF(ROMAN(D4)=B4,D4,MOD(D4+1,101))
循環のこの式のやり方久しぶりに見ました。
すっかりこういう方法を忘れていましたので
ちょっと改良して短縮出来ないか遊んでみました。
が、結局28未満が出来ませんでした。
投稿情報: min | 2009年10 月25日 (日曜日) 午後 10時21分
>循環のこの式のやり方久しぶりに見ました。
私は循環使うにしても、初期化しないとダメというのは感覚的にうけいれられないので、どうしてもこういう形になります。
で、28にはなったんですか?ちょっと見当が付かないな?
投稿情報: y sakuda | 2009年10 月25日 (日曜日) 午後 10時44分
循環
28=MOD(D4+(ROMAN(D4)〈〉B4),101)
28=D4*(D4〈101)+(ROMAN(D4)〈〉B4)
28=D4*(D4%〈=1)+(ROMAN(D4)〈〉B4)
でした。
くまぷー先生
ゴミ消してください。
投稿情報: min | 2009年10 月26日 (月曜日) 午前 05時52分
>28=MOD(D4+(ROMAN(D4)〈〉B4),101)
なるほど、なにがどうなっても大丈夫な形で見事に28になってますねーー
投稿情報: y sakuda | 2009年10 月26日 (月曜日) 午後 07時42分
そう言えば今日は出題はないんですか?
投稿情報: y sakuda | 2009年10 月26日 (月曜日) 午後 08時14分
>そう言えば今日は出題はないんですか?
む印さん、ますたあさん、himさん、
supermabさんらが、まだいらっしゃっていないので
明日にしようかと・・・(^^ゞ
投稿情報: くまぷー | 2009年10 月26日 (月曜日) 午後 08時44分
>明日にしようかと・・・(^^ゞ
了解でーーす
投稿情報: y sakuda | 2009年10 月26日 (月曜日) 午後 08時55分
あ、すごい。。。
一言で片付けてスミマセン。だってすごいんだもん
バリエーションに感動してるんですが、頭が理解しようとしてくれません~
minさんの丁寧な解説でなんとなく方向だけわかった気分です。
そういう私は結局ROMANの31字で終了でした(^^ゞ
投稿情報: himi | 2009年10 月27日 (火曜日) 午後 02時20分
>あ、すごい。。。
ですねーー
minmaxさん、からくちさんの式は「あっ!」
て感じでした^^;
投稿情報: y sakuda | 2009年10 月27日 (火曜日) 午後 07時47分