« 第40回 スーパーボールXLIV その2 | メイン | 第41回 関数で出来ますか~? »

2009年10 月24日 (土曜日)

コメント

min

今回は、いきなり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時間くらいかけて変更していった順番に(一部省略しますが)追って掲載します。

くまぷー

結局、反則のROMAN+循環参照だけです(^^ゞ

26:=IF(ROMAN(D4)<>B4,D4+1,D4)

B4の文字列をクリアーすると初期化されます。

くまぷー

(;゚゚)ウッ!
なんか,minmaxさん凄い!!

min

[その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

[その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

[その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

[その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})

おまけは後で投稿します。

y sakuda

minmaxさんの方式は全く考えなかったですねーー
後半部分の考え方は同じなんですが、CountIfのこういう使い方は全く思いも付かなかったです^^;
これがどう短くなるのか楽しみに拝見しますw

y sakuda

minmaxさんの110まで拝見しました
面白かったw
この問題あんまりやり方ないと思ってたんですが、思いこみはダメですね――

からくち

各式共に細部までよく見て並び替えれば、後幾つかは短くなると思いますが
式を短くは得意分野では無いし、またそこに余り面白さを感じていませんので
式を短く、、、とは考えていません
文字数はあくまで出来上がりの結果に過ぎません
、、、て、何時もの事ですが

=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})}


y sakuda

からくちさんのも一通り鑑賞しました。
長いほうのやつは面白いですねーー
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})

min

>式を短くは得意分野では無いし、またそこに余り面白さを感じていませんので
>式を短く、、、とは考えていません

式の短さはエクセルでは重要ではないと私も常々思っております。
ここの一筆書きでも、参加当初は長い式でも考え方がすばらしければ良いと本当に感じていました。
それは、今でも同じです。
でも、ここはパズル的な要素があるので、短くすることも楽しんでおります。
それにしても、からくちさんの最初の式は思いつきませんね。
ほかのは、まだ良く見てませんが。

min

からくちさん、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文字数なんてのもありますが、つまらないので出しません。

y sakuda

>あ、そうだ1010文字数なんてのもありますが、つまらないので出しません。
そんな長いの良く動くようにかけましたね^^;
私は多分途中で断念してますねーー


min

1010文字は
=VLOOKUP(B4,{"I",1;"II",2;"III",3;"IV",4;・・・・・・・,98;"XCIX",99;"C",100},2,)
ってVLOOKUPのみの単純なもので決して手で打ち込んだものではありません。

それにしても、ジョー3さん、himiさんそのほかのみなさんおいでになりませんね。

からくち

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}))}

お遊び、お遊び、、、

y sakuda

すみません、minmaxさんのCode使った142ですが、なんかおかしい。
今一つ発想が分かってないから修正できません。よろしくーー

しかし、minmaxさん、からくちさんはとことん楽しまれてますねーー

min

再掲
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

そう言えば、循環の19
くまぷーさんと実質同じの
=D4+(ROMAN(D4)<>B4)
だったのですが、sakudaさんのは?

y sakuda

ああ、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

なるほど、19はこういうのですか。
考えなかったですねーー
私のは平凡です34ですから話になんない
=IF(ROMAN(D4)=B4,D4,MOD(D4+1,101))

min

なるほど〜
すばらしい

携帯から

くまぷー

昨日は疲れていて早く眠ってしまいまして
今、目が覚めました。
そして覗いたら式がいっぱい・・・
それも、ものすごくヘビーな式が・・・

すみません・・・、もう一寝入りします(^^ゞ

min

>式がいっぱい・・・
今回は、状況からして投稿数が少なそうだったので精一杯無理してほとんど全部の式を投稿し、また、分割、解説までして頑張ってしまいました。

ところで、sakudaさん、からくちさんなどの式を参考にもっと短い式出来ませんか?

からくち

>それも、ものすごくヘビーな式が・・・
違う意味で、、、ヘビーな式

{=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})}

くまぷー

からくちさんの上の式ですが
結果があわないみたいですが・・・
例えばVが3になってしまいます。
スペースが消えてしまっているのかな?

からくち

>スペースが消えてしまっているのかな?
かも・・・
{=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})}

jyo-3

>それにしても、ジョー3さん、himiさんそのほかのみなさんおいでになりませんね。

あははーーーー

土日、70k程離れた・・・・
(三沢→青森)
行ってましたーーー

みちのく道路の紅葉が綺麗でしたーーー

で、、、

皆さんすごいですーーー
私は、
2個だけでしたーーー

単純ーーーー41
{=MAX((ROMAN(ROW(1:100))=B4)*ROW(1:100))}
(進歩無い私)

19って声を聞いて・・・・
あれれ、、、いなくなった。

y sakuda

前回、からくちさんも仰って居られましたが、出題は難しいですねーー
今回は、ROMAN使うと簡単なのは分かり切ってましたが、それを禁止した場合、
1.手法はかなり限られてバリエーションがない
2.手法が限定されるため、簡単すぎる
と思っていたのですが、難しい部類になっちゃったみたいですね。
それに、からくちさん、minmaxさんの回答見ると、長さは別にして手法はやはり沢山ある・・・・
「誰でも参加出来て、やり方は無数にある」
こういうのは難しいですねーー

からくち

>こういうのは難しいですねーー
わたしの残2問
1問:
超易しい、、、と言うか易し過ぎて即全員同じ答えに
それ以外の答えは、お遊びのみに

2問:
両極端と思う
両極端とは、、、直ぐに答えを発見OR最後まで発見出来ず
あえて発見と言う言い方に、、、それは・・・hisohiso

わたし個人的には、、、どんな問題も皆同じ
勝手にお遊び、、、なので

難しさレベル
どんな問題も、、、解答は1<<<出題は100

min

sakudaさんの
>=IF(ROMAN(D4)=B4,D4,MOD(D4+1,101))
循環のこの式のやり方久しぶりに見ました。
すっかりこういう方法を忘れていましたので
ちょっと改良して短縮出来ないか遊んでみました。
が、結局28未満が出来ませんでした。

y sakuda

>循環のこの式のやり方久しぶりに見ました。
私は循環使うにしても、初期化しないとダメというのは感覚的にうけいれられないので、どうしてもこういう形になります。

で、28にはなったんですか?ちょっと見当が付かないな?

min

循環
28=MOD(D4+(ROMAN(D4)〈〉B4),101)
28=D4*(D4〈101)+(ROMAN(D4)〈〉B4)
28=D4*(D4%〈=1)+(ROMAN(D4)〈〉B4)
でした。

くまぷー先生
ゴミ消してください。

y sakuda

>28=MOD(D4+(ROMAN(D4)〈〉B4),101)
なるほど、なにがどうなっても大丈夫な形で見事に28になってますねーー

y sakuda

そう言えば今日は出題はないんですか?

くまぷー

>そう言えば今日は出題はないんですか?

む印さん、ますたあさん、himさん、
supermabさんらが、まだいらっしゃっていないので
明日にしようかと・・・(^^ゞ

y sakuda

>明日にしようかと・・・(^^ゞ
了解でーーす

himi

あ、すごい。。。
一言で片付けてスミマセン。だってすごいんだもん

バリエーションに感動してるんですが、頭が理解しようとしてくれません~

minさんの丁寧な解説でなんとなく方向だけわかった気分です。

そういう私は結局ROMANの31字で終了でした(^^ゞ

y sakuda

>あ、すごい。。。
ですねーー
minmaxさん、からくちさんの式は「あっ!」
て感じでした^^;


コメントの確認

コメントのプレビュー

プレビュー中です。コメントはまだ投稿されていません。

処理中...
コメントを投稿できませんでした。エラー:
コメントを投稿しました。 さらにコメントを投稿する

入力された文字と数字は画像と一致していません。再度入力してください。

最後に、下の画像の中に見える文字と数字を入力してください。これはプログラムを使ってコメントを自動的に投稿するのを防ぐために行われています。

画像を読み取れない場合は 別の画像を表示してください。

処理中...

コメントを投稿

アカウント情報

(名前は必須です。メールアドレスは公開されません。)

2024年8 月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

TOP メニュー