« 第113回 経過年数 | メイン | 第114回 出られますか? »

2012年1 月21日 (土曜日)

コメント

jyo-3

1)
4年
100年
400年
ゆえ

400年の倍数ずらすと、、、調整できるから、、、私は6000年ずらしました。
-4000~+4000ぐらいが、、、・・・・幅広がるから・・・・

2)
2月29日   2月28日の  調整のため
次の日を参考に見て、{1,0}
3/1 3/1 か、どうかをチェックしました。
・・・・・

くまぷー

解答を用意した人には頭が下がります。
私はワンセルでこんな長手数になる問題は
ぜんぜん、まとめられません。◇\(o・Q・o)/◇

jyo-3

紀元前1977/5/21
紀元前1925/5/21

私のは52年になりますが???これは??

jyo-3

あ、、、
1900/1/1から1900/2/29の1日のずれは、、、考慮してない気がします。

jyo-3

>1900/1/1から1900/2/29の1日のずれは、、、考慮してない気がします。

あ、、その、、、-・・・(紀元前)・・・・・もですけど、、、

くまぷー

角田さんのは配列じゃないんだ!!
びっくりです!!
ユニーク大賞!!

min

パソコン使えないから角田さんのファイルの中を見られないのでさっぱりです。

多分私のは全くダメだと思います。

多分こっちのほうがまだ良いのではないかな。
341{=SUM(SMALL(IF({1;0;1},IF(LEN(B5:B7)〉10,1-MID(B5:B7,4,4),IF(B5:B7〉"9",MID(18671988&19111925,MMULT((B5:B7〈{"弊","晶","第","盟","徽"})*1,1^ROW(1:5))*4-3,4)+MID(B5:B7,3,2),LEFT(B5:B7,4)*1))+((LOOKUP(,-("0 "&RIGHT(SUBSTITUTE(B5,{"-","/","."}," -"),8)))-LOOKUP(,-("0 "&RIGHT(SUBSTITUTE(B7,{"-","/","."}," -"),8))))*{1,0;0,0;0,-1}〈0)),{2;3})*{-1;1})}

携帯だからうまくいくかな?

jyo-3

++
+-
-+
--
の場合が複雑ですね。

くまぷー

>携帯だからうまくいくかな?

minさん、どもです。
#N/Aがでてしまうことがけっこうあります。
でも携帯から、これだけ打つなんて頭が下がります。

検証用シートで試してみると
答がジョー3さん&角田さん派と
からくちさん派とわかれているようです。

min

あら、
〈〉を
<>にしてもだめですかぁ

jyo-3

>答がジョー3さん&角田さん派と
>からくちさん派とわかれているようです。

>答がジョー3さん&角田さん派と・・・・&minmax・・・・みたい、、、

くまぷー

>〈〉を <>にしてもだめですかぁ

もちろん、直していますよ~
私の修正ミスかもしれないけど
答がでるときと#N/Aになるときが・・・

jyo-3

>〈〉を <>にしてもだめですかぁ

・・・・・
私のテストでは、、、エラーが出ません。。。

min

もしかしたら
スペース2個が
1個になっているのか?
"  -"
はスペース2個です。

jyo-3

>"  -"
>はスペース2個です。
そ、、そうです。

くまぷー

>"  -"

これだと思われる4カ所を
半角スペース2個にしてみましたが
#N/Aのままです。

min

文字数341になっていますか?
配列数式になっていますか?

y sakuda

やってないし、長いのばかりで解読する気力なしですw
皆さんようやる・・・・

角田

飲み会から、やっと帰って来た。
さぁ~、これから見よっと。
皆さん、どんなのか楽しみ♪
やっぱ、ここの常連さんは配列数式なのね。

わたしは、最古の紀元前2048年がシリアル値範囲(1~、1900年~)になり、
400年の倍数という事で4000年シフトさせて全てプラスにした上で
 ABS(TRUNC(2000.0229 - 1980.0301))
という風に、月日を小数部にした引算にしました。


ちなみに、"紀元前"を外した「日付抽出のみ」では下記が一番短かった。
=VALUE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B5,"紀元前",""),MID(B5,5+(LEN(B5)>10)*3,1),"年"),"年","月",2)&"日")

5文字目(紀元前は8文字目)が区切り文字なので、その文字を取り出して
2つとも"年"に置換、その後、2つ目の"年"を"月"に置換、末尾に"日"を
付加すれば、日付変換可能な yyyy年m月d日 に統一されます。


あとは、先頭文字の大小順
 [1]900 < [2]048 < [紀]元前 < [昭]和 < [大]正 < [平]成 < [明]治
とか、
 紀元前(BC)だけ11文字~、他(AD)は ~10文字
を判定材料に使ったりですね。

くまぷー

>文字数341になっていますか?
>配列数式になっていますか?

配列数式にしています。
配列括弧無しで339です。
ですから、配列括弧の分を加えると341です。

くまぷー

>長いのばかりで解読する気力なしですw

私の場合、長いのばかりで解読する能力なしです。m(__)m

ジョー3

minmaxさん
角田さん
ジョー3
3っつ並べて、テスト・・・・
ほとんど、同じです。

ですが、、、
紀元前1907/12/13
紀元前1996/12/13
などが、違った計算になるようです。

ジョー3

>長いのばかりで解読する気力なしですw
>私の場合、長いのばかりで解読する能力なしです。m(__)m
わたしのが、、一番単純と思いますが、、、・・・
6000年ずらして、、、datedif・・・だから、、、

ジョー3

心配なケース
平成33.2.21
1900-2-22

私のは、121年と算定・・・でも、120年のはず、、、に、見える。
(minmaxさんも、角田さんも、きちんと120年)
・・・・・・・・・・・・・・・
・・・・・いいわけ、、
・・・・・・・・・・・・・・・
1900-2-29をなくしてるので、
計算時は、1900-2-21として、計算しております。
・・・・

ジョー3

>今回の問題は何が正しいのかが、、、分からない
>何時から何時までは何年なのか、、、分からない
>これでは答えようが無い
そそ、、、、で、、、
好きなように、、、解釈した。・・・
・・・
で、
面白すぎ&難しすぎだった。

角田

ジョー3 のは、配列数式であるのを除けば、
私ので言う[ 4ymd1b & DEF1 ] に、ほぼ同じですね。
DATEDIF は[古⇒新]なので、MIN/MAX 噛ませて全部で4個の変換式が必要なので
2個で済む [数値化&絶対値] にしました。
配列数式で、そういう風にすれば、2個で済むのか~
でも、MIN( )+{1,0},MAX+{1,0} の +{1,0} の効果が分からないし、大外の MAX は?


私は、紀元前を[ 4000-年+1 ]にしましたが、そのお蔭で『-1999/2/29』が
出てしまって、エラーを避けるのに DATE(4001-年,月,日) になりました[4ymd1c]

ジョー3 のは、[年+1]をしないので 2/29 のエラーが出ない代わりに、
紀元前~紀元後 の時に 1年余分になるので、それを補正するのが末尾の
 -(((LEFT(B5)="紀")+(LEFT(B7)="紀"))=1)
ですね。


あと、西暦・和暦を一緒にすれば 15文字*2 ⇒ 30文字短縮になりますよ。
IF(LEFT(B5:B7)<"3",
B5:B7,SUBSTITUTE(SUBSTITUTE(B5:B7,".","年",1),".","月")&"日")
 ↓
SUBSTITUTE(SUBSTITUTE(B5:B7,MID(B5:B7,5,1),"年",1),".","月")&"日"

角田

> 平成33.2.21 ~ 1900-2-22
> 私のは、121年と算定・・・でも、120年のはず
わたしのでも、式(P)が同じ。
1日ズレを補正すると、1変換につき60文字増で、式(Q)では大きく後退。

角田

> 角田さんのは配列じゃないんだ!!
> びっくりです!!
> ユニーク大賞!!
あぁ、やっぱり、「マニアック」な名前だけあって、ここは異世界だったか・・・

配列数式が「当たり前」で最大与党なんだ・・・
わたし、議場の隅っこに居る共産党の気分(笑)

角田

ジョー3 の式を判り易くネスト(で表示されるかな?)


{=
MAX(
 DATEDIF(
  MIN(
   IF(B5:B7="",
    "",
    IF(LEFT(B5:B7)="紀",
     (6000-MID(B5:B7,4,4)&MID(B5:B7,8,6))*1,
     2191455+IF(LEFT(B5:B7)<"3",
          B5:B7,
          SUBSTITUTE(SUBSTITUTE(B5:B7,".","年",1),".","月")&"日"
         )*1
    )
   )
  )+{1,0},
  MAX(
   IF(B5:B7="",
    "",
    IF(LEFT(B5:B7)="紀",
     (6000-MID(B5:B7,4,4)&MID(B5:B7,8,6))*1,
     2191455+IF(LEFT(B5:B7)<"3",
          B5:B7,
          SUBSTITUTE(SUBSTITUTE(B5:B7,".","年",1),".","月")&"日"
         )*1
    )
   )
  )+{1,0},
  "Y"
 )-(((LEFT(B5)="紀")+(LEFT(B7)="紀"))=1)
)
}

ジョー3

> ABS(TRUNC(2000.0229 - 1980.0301))
>という風に、月日を小数部にした引算にしました。
・・・・・
>DATEDIF は[古⇒新]なので、MIN/MAX 噛ませて全部で4個の変換式が必要なので
>2個で済む [数値化&絶対値] にしました。
・・・・
少数計算:危険性ありませんか?

たとえば、前に述べたデータ、、、
>紀元前1907/12/13
>紀元前1996/12/13
>などが、違った計算になるようです。
89年の筈が、、、
88.9999999999998で、
88に、、、なっちゃいませんか?
・・・・誤解ならごめん!!

ジョー3

>MIN( )+{1,0},MAX+{1,0} の +{1,0} の効果が分からないし、大外の MAX は?
角田さんに教えて頂いた、、
閏年29-平年28の場合の誤計算防止のつもりでした。

2/29---2/28   =あと1日で1年追加?
{1,0}によって、、
3/1---3/1    =もう1年追加で良い??

その、、maxで、、、
1年追加となりましたーーー
という、読みでした。・・・・・===余計なことしちゃってるかなーーー

ジョー3

>あと、西暦・和暦を一緒にすれば 15文字*2 ⇒ 30文字短縮になりますよ。
短縮苦手ーーーー(´д`)
minmaxさんの手にかかったら、、、これ、どこまで短縮するか?


それにしても、今回の
minmaxさんの式・・・・なんで、こんなに正確に動くのか分からん!!・・・・
(スペースの追加場所を間違えるとエラー頻発だが)

角田

> 89年の筈が、、、
> 88.9999999999998で、
> 88に、、、なっちゃいませんか?
( ̄Δ ̄;)
なってます! 間違いなく失敗だぁ _| ̄|○

角田

min さんの式もネスト。複雑だ!
途中の IF で ,FALSE が省略記述 になっているのが
判らなくて、カッコの対応が取れないと悩みました。
さて、どういう仕組みなのやら・・・

{=
SUM(
 SMALL(
  IF({1;0;1},
   IF(LEN(B5:B7)>10,
    1-MID(B5:B7,4,4)
    ,
    IF(B5:B7>"9",
     MID(18671988&19111925,
       MMULT((B5:B7<{"弊","晶","第","盟","徽"})*1,
       1^ROW(1:5))*4-3,
       4)
     +MID(B5:B7,3,2)
     ,
     LEFT(B5:B7,4)*1
    )
   )
   +
   (
    (
     LOOKUP(,-("0"&RIGHT(SUBSTITUTE(B5,{"-","/","."}," -"),8)))
     -LOOKUP(,-("0"&RIGHT(SUBSTITUTE(B7,{"-","/","."}," -"),8)))
    )*{1,0;0,0;0,-1}<0
   ),
   FALSE
  )
  ,{2;3}
 )*{-1;1}
)
}

角田

からくち さんの式。う~ん、見るからに凄く短いぞ。

{=
ABS(
 DATEDIF(
  ABS(
   REPLACE(B5,
       1,
       MATCH(0,0/MID(B5,ROW($1:$4),1),)-1,
       MID("mtsh",FIND(LEFT(B5),"明大昭平"&B5),1)
       )
   +IF(LEFT(B5)="紀",-54322,54321)
  ),
  REPLACE(B7,
      1,
      MATCH(0,0/MID(B7,ROW($1:$4),1),)-1,
      MID("mtsh",FIND(LEFT(B7),"明大昭平"&B7),1)
      )
  +IF(LEFT(B7)="紀",1406648,1515291)
  ,
  "y"
 )
 +(COUNTIF(B5:B7,"紀*")=1)*3800-4000)
}

角田

> 89年の筈が、、、
> 88.9999999999998で、
そうだ、こうすれば良いんだ♪
=ABS(TRUNC((4000+年B5)&月日B5-(4000+年B7)&月日B7)/10000))
=ABS(TRUNC(TEXT(日付B5,"YYYYMMDD")-TEXT(日付B7,"YYYYMMDD")/10000))

角田

> "弊","晶","第","盟","徽"
平,昭,大,明,紀 のコード上1つ後の文字というのは判った。
<= より < で「1文字短縮」という事だと思う。

そのあとが判らない。配列数式に頭が馴染んでいないせい?

ジョー3

>> "弊","晶","第","盟","徽"
>平,昭,大,明,紀 のコード上1つ後の文字というのは判った。
へーーー、、、まだ、気付いてなかった。

>    <= より < で「1文字短縮」という事だと思う。
わーー、、、減量の・・・・テク???・・・・・・

角田

> min さんの式
SUM(
 SMALL(
  IF({1;0;1},  B6の除外⇒偽側のFALSE値(0)
【B5/B7】
,
   FALSE
  )
  ,{2;3}  一番小さい値(0[FALSE]=B6)を除外&2番目・3番目の順に並べて
 )*{-1;1}  2番目(小さい方)をマイナスにして、SUMで『大 - 小』にしている
)

ここまでは、やっと判った。 ・・・けど、肝心の中核部分が難しい

ジョー3

>ここまでは、やっと判った。 ・・・けど、肝心の中核部分が難しい
うわーー、、すげーーー・・・解析が・・・
・・・・・・
いつもの、、
sakudaさんみたいに、、、、・・・・・
・・・・・・・・・すごいーーー

角田

> min さんの式 「年」部分
IF(LEN(B5:B7)>10,
 1-MID(B5:B7,4,4)  '紀元前(11~13文字)の年
 ,
 IF(B5:B7>"9", '[1]900<[2]048<[9]<[紀]元前<[昭]和<[大]正<[平]成<[明]治
  //和暦、改元年(明治[1867],平成[1988],大正[1911],昭和[1925])
  MID(18671988&19111925, 
    MMULT(
       (B5:B7<{"弊","晶","第","盟","徽"})*1,
       1^ROW(1:5)
      )        '⇒明治(1),平成(2),大正(3),昭和(4)
    *4-3,4)
  +MID(B5:B7,3,2) '改元の年+和暦の年(1年大きく算出される?)
  ,
  LEFT(B5:B7,4)*1 '西暦の年
 )
)

> IF(B5:B7>"9",
そうか、LEFT( ,1)は無くても良い訳だ!

> "弊","晶","第","盟","徽"
平,昭,大,明,紀 のコード上1つ後の文字
[紀]元前<[昭]和<[大]正<[平]成<[明]治

> MMULT(B5:B7<{"弊","晶","第","盟","徽"}*1,1^ROW(1:5))
{紀昭大平,紀昭,紀昭大,紀昭大平明,紀}*{1,1,1,1,1}
明治⇒{0,0,0,1,0}*{1,1,1,1,1}⇒1
大正⇒{1,0,1,1,0}*{1,1,1,1,1}⇒3
昭和⇒{1,1,1,1,0}*{1,1,1,1,1}⇒4
平成⇒{1,0,0,1,0}*{1,1,1,1,1}⇒2

明治(1),平成(2),大正(3),昭和(4)

でも、この並びになった意味が?

FIND(LEFT(B5:B7,1),"昭大平明")
> MID(18671988&19111925,
MID(19251911&19881867,
の方が簡単では?

min

角田さん
凄い解析。かなりの実力の方
逆の立場だったらあきらめていると思います。
結構いい線いってます。
find使えば多少短くなるとは思っていましたがmmultのほうが分かりにくいと思って採用しました。

まだpc使えないから後程

角田

> '改元の年+和暦の年(1年大きく算出される?)
勘違いでした。合ってます。

角田

駄目だ、後半の LOOKUP(月日の大小による補正?)が皆目判らない!

min

今回の問題、当初400年の倍数をずらして最初はdatedifでやっていました。
そうなると、紀元前の紀元前1900-2-29なんてあり得ない日の判定ができない。
それでいいと思っていましたが、コメントを見ていると違うみたいでした。
では、うるう年があるかないかに依存しない式を書くことに。

単純に年の差を求めて、
それに月日の大小を判定して調整してやることにしました。

つまり、1901/2/29などというあり得ない日付が入力されても判定できるようにしました。

それにしても奥が深い問題でしたね。

まず、
>IF({1;0;1},  B6の除外⇒偽側のFALSE値(0)
その通りです。
たとえば、ジョー3さんの場合、b6に何かが入力されていたら、誤計算または、エラーになってしまいますのでそれを回避しています。

min

>後半の LOOKUP(月日の大小による補正?)が皆目判らない!
前半の年の差を求めるのは解説していただいていますので、
月日の大小を求める補正の式について、、
まず、
"0 "&RIGHT(SUBSTITUTE(B5,{"-","/","."}," -"),8)
については、
b5には、必ず「-」、「/」、「.」のどれかが区切りに使われています。
したがって、
たとえば、「/」があれば
右から8文字は
「  -月  -日」になり、頭に「0 」を付けることによって
「0   -月  -日」となります。

これに-をかけることによって
2000年?月?日のシリアル値にマイナスをかけた数値になります。
その他の
場合はシリアル値に変換できないのでマイナスをかけるとエラーになります。
そのうえで、LOOKUPはエラーを無視しますので
LOOKUP(,{エラー,数値,エラー}であった場合、
数値の部分を答えとします。
同様にb7も同じ式で数値を求めます。


そして「b5の結果」-「b7の結果」で差を求めます。

min

(「b5の結果」-「b7の結果」)*{1,0;0,0;0,-1}
の{1,0;0,0;0,-1}の部分のうち真ん中の「0,0」はダミーなので
>IF({1;0;1},  B6の除外
としているので、たとえば、真ん中を「"あ",1」などとしても影響はありません。
あくまでも
「{1,0」と「0,-1}」の部分しかみません。

min

(「b5の結果」-「b7の結果」)
これについては、
-「b5の月日」--「b7の月日」
となり、すなわち
「b7の月日」-「b5の月日」
となります。
「b7の月日」-「b5の月日」<0
は「b7の月日」-「b5の月日」がマイナスだったら
TRUE
すなわち、B5の月日の方がB7の月日より大きかったら1をたすとなります。
(「b7の月日」-「b5の月日」」)*{1,0;0,0;0,-1}<0
については、
{B5の月日の方が大きい,そのまま;ダミー,ダミー;そのまま,B7の月日の方が大きい}
となります。

ここまで書いてみて、とりあえずわかってもらえるような表現になっているのか不安。。

角田

> "  -"はスペース2個です。
これを見落としてた(そもそも、スペースなんて無いと)。
だから、幾ら見ても「右から8文字」が理解できなかった。

(スペース 半角のロ)
紀元前yyyy/m/d ⇒ 0ロロ-mロロ-d
紀元前yyyy/m/dd ⇒ 0ロ-mロロ-dd
紀元前yyyy/mm/d ⇒ 0ロ-mmロロ-d
紀元前yyyy/mm/dd ⇒ 0-mmロロ-dd
yyyy-m-d ⇒ 0ロロ-mロロ-d
yyyy-m-dd ⇒ 0ロ-mロロ-dd
yyyy-mm-d ⇒ 0ロ-mmロロ-d
yyyy-mm-dd ⇒ 0-mmロロ-dd
昭和yy.m.d ⇒ 0ロロ-mロロ-d
昭和yy.m.dd ⇒ 0ロ-mロロ-dd
昭和yy.mm.d ⇒ 0ロ-mmロロ-d
昭和yy.mm.dd ⇒ 0-mmロロ-dd

なるほど、確かに、月と日だけ抜き出せてますね。

2012-3-1
 {"-"    ,   "/"   ,   "."}
"0ロロ-3ロロ-1"   "02012-3-1"   "02012-3-1"
2000/3/1    #VALUE     #VALUE

間にスペースが挟まっていても日付変換するとは知らなかった!

min

" 0"&のスペース1個も味噌です。

min

間違い
"0 "&のスペース1個も味噌です。

春

みなさん凄すぎ(-.-)
これだけ解析して頂いてはじめて「ほぉー」と、うなずいています。
自分がやったものは結局 600文字を超えてるのに
うるう年が合わせられず 投稿にいたらず終了。
次元が違うんですね。きっと!!

ジョー3

皆さんありがとうございました。
とくに、、

からくちさん:面倒な、出題をお願いしました。ありがとうございました。
角田さん、 :暦について、教えられました。ありがとうございました。
minmaxさん :技術的な工夫、ありがとうございました。

大変、楽しく遊べました。・・・・(ちょっと苦しかったが)・・・
・・・・・・・・・・・・・

角田

からくち さんの式


REPLACE(B5,
   1,
   MATCH(0,0/MID(B5,ROW($1:$4),1),)-1,
   MID("mtsh",FIND(LEFT(B5),"明大昭平"&B5),1)
   )

MATCH(0,0/MID(B5,ROW($1:$4),1),)-1
紀元前1900/1/1 ⇒ {0/紀,0/元,0/前,0/1} ⇒ {#V,#V,#V,0} ⇒ 4-1=3
2012-1-1 ⇒ {0/2,0/0,0/1,0/2} ⇒ {0,#D,0,0} ⇒ 1-1=0
明治40.1.1 ⇒ {0/明,0/治,0/4,0/0} ⇒ {#V,#V,0,#D} ⇒ 3-1=2

MID("mtsh",FIND(LEFT(B5),"明大昭平"&B5),1)
紀元前1900/1/1 ⇒ MID("mtsh",FIND("紀","明大昭平紀元前1900/1/1"),1) ⇒ ""
2012-1-1 ⇒ MID("mtsh",FIND("2","明大昭平2012-1-1"),1) ⇒ ""
明治40.1.1 ⇒ MID("mtsh",FIND("明","明大昭平明治40.1.1"),1) ⇒ "m"

紀元前1900/1/1 ⇒ REPLACE("紀元前1900/1/1",1,3,"") ⇒ 1900/1/1
2012-1-1 ⇒ REPLACE("2012-1-1",1,0,"") ⇒ 2012-1-1
明治40.1.1 ⇒ REPLACE("明治40.1.1",1,2,"m") ⇒ m40.1.1

~~~~~~~~~~~
ABS(
 DATEDIF(
   ABS(B5年月日+IF(LEFT(B5)="紀",-54322,54321)),
   B7年月日+IF(LEFT(B7)="紀",1406648,1515291),
   "y")
 )
 +(COUNTIF(B5:B7,"紀*")=1)*3800-4000)

角田

+(COUNTIF(B5:B7,"紀*")=1)*3800-4000)

紀~紀 ⇒ -4000 
紀~他 ⇒ -200
他~紀 ⇒ -200
他~他 ⇒ -4000

角田

紀2048/9/20<紀1900/1/1<BC1<AD1<1900/1/1<2048/9/20
 [54321]    [1]          [1]   [54321]
  ↓      ↓          ↓     ↓
B5年月日+IF(LEFT(B5)="紀",-54322,54321)
  ↓      ↓          ↓     ↓
 ABS[-1]  ABS[-54321]       [54322]  [108642]
  ↓      ↓          ↓     ↓
紀1900/1/1 > 紀2048/9/20      2048/9/21 2197/6/12

紀元前の大小が逆転して月日も変わってる?

> 紀元前2048年9月20日をシリアル値1として
という事か!

くまぷー

角田さん、詳細な分析、ありがとうございます。
今回は角田さんが参加してくれなかったら
どうなっていたことやら・・・

問題が大家の力量を大きく超えてしまったので
いろいろ、コメントできずに申し訳ありませんでしたm(__)m

しかし、ジョー3さんの情熱・・・
minさんの技術には頭が下がります。

仮にもなんらかの答を出した方々・・・

>みなさん凄すぎ(-.-) ×2

min

角田さんの式を見てみました。
なんか今回は難しく考えすぎたのかなと思った。
S**.**.**の方は考えたけど
昭和**年**月**日にするのをすっかり忘れていたし。

で、角田さんのを見ていたら単純に減らしてみたくなってやってみました。
250文字
=INT(ABS((IF(LEN(B5)>10,1-MID(B5,4,4),YEAR(LEFT(B5,4)&"年1月1日"))+TEXT(SUBSTITUTE(MID(B5,6+(LEN(B5)>10)*3,5),".","/"),"M.DD")/100)-(IF(LEN(B7)>10,1-MID(B7,4,4),YEAR(LEFT(B7,4)&"年1月1日"))+TEXT(SUBSTITUTE(MID(B7,6+(LEN(B7)>10)*3,5),".","/"),"M.DD")/100)))
これではだめなんでしょうか?
まだ、余計なカッコを外すことや「/100」を「%」に置き換えることで240文字くらいになるとはおもいますが、

さらに、配列数式にすればもっと大幅に減ると思いますけど。

角田

あぁ~言われてみれば、よくよく見れば・・・
何で、そこに気付かないワタシ! _| ̄|○

紀元前 1-YEAR(MID(B5,4,10))
紀元前 1-MID(B5,4,4)

西暦和暦 IF(LEFT(B5,1) 「/100」を「%」に置き換えることで
上でジョー3 の指摘で小数誤差が出てるんで、yyyymmddで整数演算後に1万割です。

jyo-3

>さらに、配列数式にすればもっと大幅に減ると思いますけど。
1・・・・・・
た、、たた、、、、、
たんしゅくおう・・・・・と、、、、、、

min

もうちょっと減らしてみました。
194
=INT(ABS(IF(LEN(B5)>10,1-MID(B5,4,4),YEAR(LEFT(B5,4)&"年1月1日"))-1/("m33."&MID(B5,6+(LEN(B5)>10)*3,5))-IF(LEN(B7)>10,1-MID(B7,4,4),YEAR(LEFT(B7,4)&"年1月1日"))+1/("m33."&MID(B7,6+(LEN(B7)>10)*3,5))))
あっているのか保証はありません。

配列数式なら145文字でした。

角田

あっ、不等号が・・・

西暦和暦 YEAR(LEFT(B5,4)&"年1月1日")
西暦和暦 IF(LEFT(B5,1)<"昭",YEAR(B5),YEAR(LEFT(B5,4)&"年1月1日"))

DATEDIFを使わない整数演算だから、4000も要らなかったですね。
初期の式のシリアル値の縛りを引き摺ったか・・・

角田

=ABS(TRUNC(
=INT(ABS(
あぁ~、順番変えるだけで、2文字短縮かぁ~

min

配列数式だとこんな感じ
{=INT(ABS(SUM(IF({1;0;1},(IF(LEN(B5:B7)>10,1-MID(B5:B7,4,4),YEAR(LEFT(B5:B7,4)&"年1月1日"))-1/("m33."&MID(B5:B7,6+(LEN(B5:B7)>10)*3,5)))*{1;0;-1}))))}
です。

ん、147かな?

角田

("m33."&MID(B7,6+(LEN(B7)>10)*3,5))

紀元前・西暦・和暦どれでも、月日部分の「1月1日からの日数?(閏年ベース)」

m33.1/23  m33.1-23 区切文字が混ざってても日付変換するとは!

それを
+1/日数
-1/日数

? 判らない ?

ジョー3

ほほーーー
147
きちんと動いてます。
すごいですねーーー。・・・・・・すばらしい。

ジョー3

ここで思い出した。
最初の頃の、、わたしの、予想(コメントで)・・・・

>>しかし、確かにこのままでは尋常ならざる文字数に・・・
>予感だけは、、、どなたかが、、、すっきり・・・・
>100文字台で、、、、・・・・・・も、も、もちろん、、、
>自分が自信!!・・・では、、ないですーーー・・・・・けど、、、、
あたったーーー・・・・・
(俺の自慢することでもないが)

ジョー3

角田さん:参加して、進行をリードして頂き、感謝でした。
minmaxさん、、、角田さんを、、もてなして頂いて、、ありがとうございました。
てことで、、
次の、sakudaさんの問題は、、息抜きできるかなーーー
きょう・・・出題かなーーー

あ、、、
超簡単かも知れない、、、問題、、
「牛」・・・・を、作りました。

角田

> +1/日数
> -1/日数
カッコの位置を間違えてた。

{=INT(
  ABS(
   SUM(
    IF({1;0;1},   //B6 除外
     (IF(LEN(B5:B7)>10,
       1-MID(B5:B7,4,4),        //紀元前の年
       YEAR(LEFT(B5:B7,4)&"年1月1日")  //西暦・和暦の年
     )-1/("m33."&MID(B5:B7,6+(LEN(B5:B7)>10)*3,5)) //通算日(1/1~,2/29有)の逆数?
     ,FALSE
    )*{1;0;-1} //B5 - B7
   )
  )
)}

角田

1月1日, 1月2日, 1月3日  12月30日, 12月31日
1/1 > 1/2 > 1/3 > ~ > 1/365 > 1/366
年[2000]から引くと
1999.0 > 1999.5 > 1999.666 > ~ > 1999.9972603 > 1999.9972677

ほ~、月日の順の大小関係が出来上がってる!

こんな、右斜め上38度な向きの並みではない発想がポンポン出て来る
minmax さんの脳みその解剖をしてみたい(笑)

でも、ここまで細かい小数を使ってるから、月日で1~2日差くらいの時には
私もジョー3に指摘された小数誤差の影響が出て来ますよね。

角田

1999.0 > 1999.5 > 1999.666

ブ~~~  不等号の向きが逆~~~

1月1日, 1月2日, 1月3日  12月30日, 12月31日
1/1 < 1/2 < 1/3 < ~ < 1/365 < 1/366
年[2000]から引くと
1999.0 < 1999.5 < 1999.666 < ~ < 1999.9972603 < 1999.9972677

角田

汗汗 逆数の方の大小までひっくり返してしまった(汗)

1月1日, 1月2日, 1月3日  12月30日, 12月31日
1/1 > 1/2 > 1/3 > ~ > 1/365 > 1/366
年[2000]から引くと
1999.0 < 1999.5 < 1999.666 < ~ < 1999.9972603 < 1999.9972677

ジョー3

場合のチェックしてて、、、、
分からなくなってしまった。

紀元前2024/2/29
紀元前1959/2/28
の場合は、、
私の式は、65年と算出され、、
他の式は、64年と算出される。。
はてはて、この場合は、どうだっけねーーーー
なんか、229---228 に、さらに紀元前が絡むと・・・頭が混乱してくる。

ジョー3

様々な場合のチェックその4?(だっけ)

紀元前2057/3/1
紀元前2024/3/1
なぜかminさんの驚異の短い式だけ、、
32年、、あとは全部33年、、
なぜか分からない・・・(式の全貌がまだ理解できてないから比較だけ)

>でも、ここまで細かい小数を使ってるから、月日で1~2日差くらいの時には
>私もジョー3に指摘された小数誤差の影響が出て来ますよね。
なのかどうかは分からない。
でも、目視では、、33年ですよね-

角田

> DATEDIFを使わない整数演算だから、4000も要らなかったですね。
やっぱり「4000+年」は必要です。

紀元前1920/11/30~紀元前2004/1/3 ⇒ 84年

(-1919&"1130")-(-2003&"0103") ⇒ -19191130-(-20030103) ⇒ 838973 ⇒ 83年

((4000+(-1919))&"1130")-((4000+(-2003))&"0103") ⇒ 20811130-19970103 ⇒ 841027 ⇒ 84年


角田

あれ? 
わたしの &MMDD じゃなくて、minmax さんの -1/通算日 の方だと
やっぱり[ 4000+ ]は無くて大丈夫なのか・・・

ちゃんと84年になる。う~ん

角田

> なぜかminさんの驚異の短い式だけ、、
> 32年、、あとは全部33年、
やっぱり小数誤差ですね。

INT(32.999999999999800) ⇒ 32

くまぷー

>次の、sakudaさんの問題は、、息抜きできるかなーーー
> きょう・・・出題かなーーー

いや、まだこの回のバトルが続いているので
もう少ししてからの方が良いかと・・・

>「牛」・・・・を、作りました。

送って下さい。m(__)m
このお題では久々に、ますたあさん登場か!!

ジョー3

>いや、まだこの回のバトルが続いているので
もう、私の心は、、、ぼこぼこ、、、、、かも、、、、

ジョー3

>このお題では久々に、ますたあさん登場か!!

あはは、、、ばればれ、、、でも、、、、、
もう少し、、、産みの苦しみを・・・・・

min

私は、角田さんのを適当にいじってだけなので、演算誤差まで考えていません。
たとえば、
144文字
{=INT(AVEDEV(IF({1;0;1},(IF(LEN(B5:B7)>10,1-MID(B5:B7,4,4),YEAR(LEFT(B5:B7,4)&"年1月1日"))+("m33."&MID(B5:B7,6+(LEN(B5:B7)>10)*3,5))%%)*{2;0;2})))}
だとどんなぐあいでしょ?

>もう少ししてからの方が良いかと・・・
それは残念。。

ジョー3

>いや、まだこの回のバトルが続いているので
>もう少ししてからの方が良いかと・・・

くまちゃーーん、、、、

だしてくれーーーーー、、、、

しんもんだいで、息抜きしないと・・・・・
・・・・・・・・・・・・・・・・
あの問題は、、、、・・・・・
・・・・・・・・・・・・・・・
行き詰まってしまう。


=気分転換しましょう!!

くまぷー

>くまちゃーーん、、、、
>だしてくれーーーーー、、、、

じゃあ、ちょっと待って下さい。
では113回と114回の2元中継ということで・・・

ジョー3

>2元中継ということで・・・
はは、、、、
・・・・・・・・・・・・・・・・・
どんなだろーーーー・・・・
・・・・・・・・・・・・・・・・・・


む印

ず~と働いておりましたので、結局間に合いませんでした、、
完全に仕上がってもいませんが、一応やっていたということで・・・・、、、
{=YEAR(ABS(IF(COUNTIF(5:7,"紀*")=1,SUBSTITUTE(SUBSTITUTE(TEXT(IF(LEN(B5)"z",3-(B5:B7>"昭")),MID("0MTSH",FIND(LEFT(B5:B7)," 明大昭平紀"&PI()),1))*{1;0;-1}))))-1900}

む印

あれ、またきれてしまいました、、、
やり直し、、
{=YEAR(ABS(IF(COUNTIF(5:7,"紀*")=1,SUBSTITUTE(SUBSTITUTE(TEXT(IF(LEN(B5)<11,B5,B7),"rr.m.d")&"日",".","年"),"年","月",2)-EDATE(MID(VLOOKUP("紀*",B:B,1,),4,10),YEAR(LEFT(IF(LEN(B5)<11,B5,B7),4)&"年1月1日")*24),SUM(REPLACE(B5:B7,1,IF(B5:B7>"z",3-(B5:B7>"昭")),MID("0MTSH",FIND(LEFT(B5:B7)," 明大昭平紀"&PI()),1))*{1;0;-1}))))-1900}

こんどからは、ちゃんとプレビューしてから投稿しますm(__)m

ジョー3

む印さん、、どうもです。
動かしてみました。
紀元前、紀元前が特に??
たとえば、
紀元前1948/3/2
紀元前1903/12/14
多くの方45年
む印さん44ねんですね、
・・・・・・

コメントの確認

コメントのプレビュー

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

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

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

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

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

処理中...

コメントを投稿

アカウント情報

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

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 メニュー