Microsoft Excel World Championship 2025-2025EXCEL大赛,折纸

赛事链接
B站看到的一个博主张云翼_like,讲了自己参加比赛,提供了题目下载链接,下载下来自己做一下

第一题

通过Reference列的数据来获取右侧对应列表

应该有其他字符串的解析方法,我是java开发,正则比较熟悉,对excel的语法不是很懂

通过REGEXP进行解析

复制代码
获取到所有的数字字符串
=REGEXP(G61, "\d", 0)  

通过INDEX获取到单个数字
=INDEX(REGEXP(G61, "\d", 0), 1) 
=INDEX(REGEXP(G61, "\d", 0), 2)

通过INDEX获取到映射表数字
=INDEX(
$K$66:$N$69,
INDEX(REGEXP(G61, "\d", 0), 1),
INDEX(REGEXP(G61, "\d", 0), 2)
) 

第二题

在Sheet (of Paper)页获取到以Center Cell列对应为中心,大小为size列的正方形的形状数字的求和

复制代码
先随意找个cell,点一下获取到单元格的样式
='Sheet (of Paper)'!K7

通过INDIRECT来获取到中心单元格位置
=INDIRECT("'Sheet (of Paper)'!" & H93)

因为是中心,所以size肯定是奇数,因此用减一除以2的方式,就能获取到
通过OFFSET,获取到左上角位置
=OFFSET(
    INDIRECT(
        "'Sheet (of Paper)'!" & H93
    ),
    (1 - G93) / 2,
    (1 - G93) / 2
)
通过OFFSET,获取到右下角位置
        OFFSET(
            INDIRECT(
                "'Sheet (of Paper)'!" &
                     H93
            ),
            (G93 - 1) / 2,
            (G93 - 1) / 2
        )
然后求和一下即可获得结果
=SUM(
    OFFSET(
        INDIRECT(
            "'Sheet (of Paper)'!" & H93
        ),
        (1 - G93) / 2,
        (1 - G93) / 2
    ) : 
        OFFSET(
            INDIRECT(
                "'Sheet (of Paper)'!" &
                     H93
            ),
            (G93 - 1) / 2,
            (G93 - 1) / 2
        )
)

第三题

通过Top Left Cell列对应单元格定位,往右下扩展8x8的一个区域,通过对称的形式,把右边的覆盖左边的

复制代码
思路很明显还是INDIRECT获取到对应位置,OFFSET获取到8x8的范围,正则解析到Reference列的RC对应行列
因为对称关系,12345678其实对应12344321,这个可以通过MIN(val,9-val)进行判断

定位到左上角
=INDIRECT("'Sheet (of Paper)'!" & G136)
定位到右下角
=OFFSET(INDIRECT("'Sheet (of Paper)'!" & G136),8,8)
定位R
=INDEX(REGEXP(H136, "\d", 0), 1)
定位C,此时我观察到所有C都大于4,因此不需要通过MIN进行二次判断,直接用9减去就行了
=9 - INDEX(REGEXP(H136, "\d", 0), 2)
最后结果
=INDEX(
    INDIRECT(
        "'Sheet (of Paper)'!" & G136
    ) : 
        OFFSET(
            INDIRECT(
                "'Sheet (of Paper)'!" &
                     G136
            ),
            8,
            8
        ),
    INDEX(REGEXP(H136, "\d", 0), 1),
    9 - INDEX(REGEXP(H136, "\d", 0), 2)
)

第四题

看起来很麻烦,通过左上角单元格定位,规定size大小的一个nxn的块,然后通过Direction的方向进行对折,最后获取到Reference列对应的值

复制代码
size通过offset解决
左上角通过INDIRECT定位
现在问题是对折的方向然后对解析到R或者C进行判断
我的第一反应是通过IFS进行4向判断单独处理
4向判断
=IFS(
    I178 = "↑",
    1,
    I178 = "↓",
    2,
    I178 = "←",
    3,
    I178 = "→",
    4
)
再次观察到不应该先判断4向,应该先通过size和左上角定位nxn块
先获取到nxn块
INDIRECT(H178):OFFSET(INDIRECT(H178),G178,G178)

有点复杂,引入辅助列

观察到RC已经要超过2位数了,正则改成"\d+"

计算对折后的R或者C,

假设size为8

往上对折,C不变,R映射关系为12345678对应87655678,MAX(val,9-val)

往下对折,C不变,R映射关系为12345678对应12344321,MIN(val,9-val)

同理当左右对折时,R也是如此

R的转换

复制代码
=IFS(
    I178 = "↑",
    MAX(
        K178,
        G178 + 1 - K178
    ),
    I178 = "↓",
    MIN(
        K178,
        G178 + 1 - K178
    ),
    I178 = "←",
    K178,
    I178 = "→",
    K178
)

C的转换

复制代码
=IFS(
    I178 = "←",
    MAX(
        L178,
        G178 + 1 - L178
    ),
    I178 = "→",
    MIN(
        L178,
        G178 + 1 - L178
    ),
    I178 = "↑",
    L178,
    I178 = "↓",
    L178
)

最后获取就简单了

复制代码
=INDEX(
    INDIRECT(
        "'Sheet (of Paper)'!"
             & H178
    ) : 
        OFFSET(
            INDIRECT(
                "'Sheet (of Paper)'!"
                     & H178
            ),
            G178,
            G178
        ),
    M178,
    N178
)

第五题

和第四题一样就是增加了两次对折

第一印象应该是就是多加一些辅助列即可,解析Directions,然后进行两次转换,观察到这不是传统的对折,而只是简单的对称。因此两个更换顺序是无影响的

引入辅助列直接成功了

第六题

通过一个Direction斜向对折,然后获取到对应Quadrant1/4块的求和

Excel处理行列有点麻烦,不知道怎么写个循环

观察当对折方向和取值方向相同时直接取原始块的(n/2)x(n/2)块的求和即可(最简单)

当方向相反时没有意义

当方向垂直时,取1/4块的斜向一半的求和

同向的很容易写出来,就是堆砌条件就行了

复制代码
=IFS(
    I266 = J266,
    IFS(
        I266 = "↘",
        SUM(
            INDIRECT("'Sheet (of Paper)'!" & H266) : 
                OFFSET(
                    INDIRECT("'Sheet (of Paper)'!" & H266),
                    G266 / 2 - 1,
                    G266 / 2 - 1
                )
        ),
        I266 = "↙",
        SUM(
            OFFSET(
                INDIRECT("'Sheet (of Paper)'!" & H266),
                0,
                G266 / 2
            ) : 
                OFFSET(
                    INDIRECT("'Sheet (of Paper)'!" & H266),
                    G266 / 2 - 1,
                    G266 - 1
                )
        ),
        I266 = "↗",
        SUM(
            OFFSET(
                INDIRECT("'Sheet (of Paper)'!" & H266),
                G266 / 2,
                0
            ) : 
                OFFSET(
                    INDIRECT("'Sheet (of Paper)'!" & H266),
                    G266 - 1,
                    G266 / 2 - 1
                )
        ),
        I266 = "↖",
        SUM(
            OFFSET(
                INDIRECT("'Sheet (of Paper)'!" & H266),
                G266 / 2,
                G266 / 2
            ) : 
                OFFSET(
                    INDIRECT("'Sheet (of Paper)'!" & H266),
                    G266 - 1,
                    G266 - 1
                )
        )
    ),
    I266 <> J266,
    2
)

垂直方向的很难入手,想了很久,没找到方法,咨询了AI对于半区求和的方法,AI给出的方法就是通过SUM+IF进行判断处理,SUM通过COLUMN和ROW的大小来确定该值是否加上去,同时了解到了LET函数

相关推荐
骆驼爱记录3 小时前
Word样式检查器使用指南
自动化·word·excel·wps·新人首发
千逐685 小时前
多物理场耦合气象可视化引擎:基于 Flutter for OpenHarmony 的实时风-湿-压交互流体系统
flutter·microsoft·交互
热爱生活的五柒5 小时前
wps office/word 表格左对齐后 文字前仍有空白,如何解决
excel
吹牛不交税5 小时前
安装Framework4.0时提示:Microsoft .NET Framework 4 已是此操作系统的一部分。不需要安装 .NET Framework
microsoft·.net
程序员敲代码吗7 小时前
在Excel中快速进行精确数据查找的方法
excel
wfserial19 小时前
c#使用微软自带speech选择男声仍然是女声的一种原因
microsoft·c#·speech
CodeToGym20 小时前
【Java 办公自动化】Apache POI 入门:手把手教你实现 Excel 导入与导出
java·apache·excel
山岚的运维笔记1 天前
SQL Server笔记 -- 第20章:TRY/CATCH
java·数据库·笔记·sql·microsoft·sqlserver
凯子坚持 c1 天前
CANN 性能剖析实战:从原始事件到交互式火焰图
windows·microsoft
qq_297574671 天前
【实战】POI 实现 Excel 多级表头导出(含合并单元格完整方案)
java·spring boot·后端·excel