ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH云课堂-专业的职场技能充电站 Excel转在线管理系统,怎么做看这里 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 EH云课堂直播课程免费学 打造核心竞争力的职场宝典
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 292|回复: 10

分享:数字转圈圈,烧脑VBA题,PowerQuery解法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-11-26 20:59 | 显示全部楼层 |阅读模式
本帖最后由 AbleZeng 于 2019-11-26 21:01 编辑

烧脑VBA题,PQ解法,鸣谢 飞天篮球猪 提供的技术帮助。相关文章:
PQ求助,一列数字,按照指定数字依次分段
Power Query求助:List顺序上下摆放
http://club.excelhome.net/thread-1509770-1-1.html
L9QH_9)4CPQZBU)EEEH)5BF.png
  1. let
  2.     Change1 = (x) =>Table.ToRows(Table.FromColumns(x)),
  3.     顺序 = {2..27},
  4.     Source = {1..225},
  5.     分组依据 = 分组依据[分组依据],
  6.     转换 = let  a = List.Buffer(Source),
  7.                 b = List.Buffer(分组依据),
  8.                 n = List.Count(b)
  9.             in List.Skip(
  10.                         List.Generate(()=>{"",0,0},
  11.                                       each _{2} <= n,
  12.                                       each {Text.Format("{#{0}..#{1}}",{ a{_{1}},a{_{1}+b{_{2}}-1} }),
  13.                                             _{1}+b{_{2}},
  14.                                             _{2}+1
  15.                                            },
  16.                                       each _{0}

  17.                         )
  18.                 ),
  19.     源数据 = List.Reverse(List.Transform(转换,each Expression.Evaluate(_))),
  20.     起始List = {List.First(源数据)} & {List.Reverse(List.FirstN(源数据,2){1})},
  21.     拼接 = let a = List.Buffer(起始List),
  22.                b = List.Buffer(源数据),
  23.                c = List.Buffer(顺序),
  24.                d = List.Max(顺序),
  25.                e = Change1
  26.             in List.Skip(
  27.                         List.Generate(()=>{a,0,0},
  28.                                       each _{1}<d,
  29.                                       each [i = Number.Mod(_{1},4),
  30.                                             r = {{ e(_{0}) & {b{c{_{2}}}},
  31.                                                    {b{c{_{2}}}} & e(_{0}),
  32.                                                    {List.Reverse(b{c{_{2}}})} & e(_{0}),
  33.                                                    e(_{0}) & {List.Reverse(b{c{_{2}}})}
  34.                                                  }{i},
  35.                                                  _{1}+1,
  36.                                                  _{2}+1}
  37.                                            ][r],
  38.                                       each _{0}

  39.                         )

  40.             ),
  41.     输出 = Table.FromRows(List.Last(拼接))
  42. in
  43.     输出
复制代码




评分

参与人数 1鲜花 +2 收起 理由
飞天篮球猪 + 2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-11-27 08:13 来自手机 | 显示全部楼层
螺旋矩阵有解法的,还有另外几种变式

评分

参与人数 1鲜花 +3 收起 理由
wdx223 + 3 太强大了

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-11-27 09:15 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-11-27 09:33 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-11-27 10:59 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-11-27 12:33 | 显示全部楼层
这种顺时针的n*n矩阵.....这个不是最优解,仅供参考
  1. let
  2.     Table.SpiralMatrix=(n)=>
  3.                             let
  4.                                 //先生成一张n×n的空表格t,然后ToRecords,比如15×15
  5.                                 t = Table.ToRecords(#table(List.Transform({0..n-1},Text.From),List.Repeat({List.Repeat({""},n)},n))),
  6.      
  7.                                 s = List.Accumulate( {0..Number.RoundDown((n-1)/2)},  //这个表示由外而内需要循环的圈数。
  8.                                                      {t,0},   //{源和变化后的records,每一圈循环的起始值在list{1..n*n}中的位置}
  9.                                                      (x,y)=>let i = (n-y)*4-(y+1)*4  //这个i表示每一圈循环的数的个数,比如第1圈56个数,第2圈48个数...
  10.                                                              in { List.Accumulate( List.Range({1..n*n},x{1},if i=0 then 1 else i), //每一圈循环的那些数取值
  11.                                                                                    {x{0},y,y}, //这里的y,y是指某行某列
  12.                                                                                    (s,c)=>let fld = Text.From(s{2}),
  13.                                                                                               rcd = Record.FromList({c},{fld}),
  14.                                                                                               lst = List.ReplaceRange(s{0},s{1},1,{s{0}{s{1}}&rcd})

  15.                                                                                            in if s{1}=y and s{2}=y then {lst,s{1},s{2}+1} else  //循环起点
  16.                                                                                               if s{1}=y and s{2}<n-y-1 then {lst,s{1},s{2}+1} else  //往右
  17.                                                                                               if s{1}<n-y-1 and s{2}=n-y-1 then {lst,s{1}+1,s{2}} else //往下
  18.                                                                                               if s{1}=n-y-1 and s{2}>y then {lst,s{1},s{2}-1} else  //往左
  19.                                                                                               {lst,s{1}-1,s{2}}){0}, //往上
  20.                                                                   x{1}+(n-y)*4-(y+1)*4 }  //下一次循环取数的起点位置
  21.                                                     ),

  22.                                r = Table.FromRecords(s{0})
  23.                            in
  24.                                r,

  25.     Output = Table.SpiralMatrix(15)
  26. in
  27.     Output
复制代码


评分

参与人数 2鲜花 +4 收起 理由
deadzlq + 2 优秀作品
AbleZeng + 2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-11-27 13:24 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-11-27 21:03 | 显示全部楼层
fyi...m行n列按顺时针方向行进由外而内的螺旋矩阵目前还没发现bug

m行n列顺时针螺旋矩阵.jpg

评分

参与人数 1鲜花 +2 收起 理由
AbleZeng + 2 太强大了

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-11-27 21:39 | 显示全部楼层
学习了学习了,这个就厉害了,第一次接触这个,比较震撼

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-11-27 21:53 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

关注官方微信,每天学会一个新技能

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2019-12-11 17:37 , Processed in 1.432962 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

沪公网安备 31011702000001号 沪ICP备11019229号

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师

快速回复 返回顶部 返回列表