占位,已发邮件。
重新更改一下。邮件再发,以这个为准。 279个字符。
好险!
答案(279个字符):
=LEFT(TEXT(SUM(RIGHT(LARGE(LARGE(TEXT(FIND({0,1,2,3,4,5,6,7,8,9},A1:A18&5^19),"[>"&LEN(A1:A18)&"]!111111")*10+COLUMN(A:J)-1+ROW(1:18)*10^4+COLUMN(A:J)*10^8,ROW(1:10)*18)-(11-ROW(1:10))*10^8,ROW(1:10)))*10^(ROW(1:10)-1)),REPT(0,10)),COUNT(1/COUNTIF(A1:A18,"*"&(ROW(1:10)-1)&"*")))
解法中构成一个含数字所在位置和该数字信息数字串的方式是,列位置&行位置&数字位置&存在数字.
列位置的作用是在确定哪一行最早出现了数字时,不要取得其他数字所在的行中,比如在展开的同一行中(即一个单元格里的数字)可能会出现2,也可能出现7.
在构成串时为了标记没有找到的数字,使用了TEXT(,"[>"&LEN...),使得没找到的话使得"行位置"放大,从而再求最近发现行时不会被首先取到(因为首先取最小值),即使如果有个数字不出现,被取到了,在用最后一个LARGE取数时,会被第一个取到,由于最后是*10^(ROW(1:10)-1)),这样首先被取到的数在使用SUM(..**10^(ROW(1:10)-1)))后会排在最后一个,这样用LEFT按出现的数字个数取舍时会舍去.(这里留下了一个痛,就是虽然位置是排好了,结果是在尾部,致使后面不能用RIGHT(0&SUM,如果能放在头部就好了)
TEXT(,"[>"&LEN...)技巧的目的是为了在生成串是减少判断(结合5^19来排错),这样就能减少嵌套,是这个答案的关键.
其中LARGE(信息数字串,ROW(1:10)*18)来取各列中最小的数字串,是取最小值的一种用法,比SAMLL(信息数字串,ROW(1:10)*18-17)少3个字符,但在这里使用没有优势,因为还要用-(11-ROW(1:10))*10^8来去除列信息,该公式比起-ROW(1:10)*18多了5个字符 因此直接用SMALL更方便,将LARGE(信息数字串,ROW(1:10)*18)-(11-ROW(1:10))*10^8改成SMALL(信息数字串,ROW(1:10)*18-17)-ROW(1:10)*10^8后公式总长反而可以减2个字符.
TEXT(..,REPT(0,10))是为了防止0在第一个出现时会被丢失的问题.
COUNT(1/COUNTIF(A1:A18,"*"&(ROW(1:10)-1)&"*")) 用来计算出现的个数. 是比较简练的方法,但还不够简洁.
其中还可以优化的有:
将SUM(...*10^(ROW(1:10)-1)) 改成 SUM(...*10^ROW(2:11))%; 或SUM(..*1O^ROW(1:10))
COLUMN(A:J)-1写成COLUMN(J:S);
!111111前的!是不需要的,而且可以用1!e6代替.
ROW(1:18)*10^4 写成ROW(1:18)/1%%
TEXT(SUM..,REPT(0,10))补位应该用10^10+SUM()%. 或者SUM()**10^ROW(1:10)让其多以为时,采用10^11+SUM()
COUNT(1/COUNTIF(A1:A18,"*"&(ROW(1:10)-1)&"*")) 改成COUNT(MATCH("*"&ROW(1:10)-1&"*",A:A,))
本思路下,可写成(241):
=MID(10^11+SUM(RIGHT(LARGE(SMALL(TEXT(FIND(COLUMN(A:J)-1,A1:A18&5^19),"[>"&LEN(A1:A18)&"]1!e6")/1%+COLUMN(J:S)+ROW(1:18)/1%%+COLUMN(A:J)*10^9,ROW(1:10)*18-17)-ROW(1:10)*10^9,ROW(1:10)))*10^ROW(1:10)),2,COUNT(MATCH("*"&ROW(1:10)-1&"*",A:A,)))
涉险过关,答案正确,公式也适用于全空的情况, 长度小于280个字符,得3分. -willin2000
[ 本帖最后由 willin2000 于 2008-12-27 12:17 编辑 ] |