今天,WPS的JS宏戰(zhàn)勝了VBA
話不多說,今天被人問了一個簡單的問題:已知有12個人,每4人一組,分成3組,如何將所有可能的分組列到Excel表里?
高中數學痛擊我.jpg
好吧,很容易知道共有C(12,4)*C(8,4)*C(4,4)/A(3,3)共5775種可能性。
自然而然,我們會去EH論壇找大佬求排列組合的VBA代碼,然后腦子就短路了,這VBA寫的遞歸也太。。。占腦子的緩存了,自己寫的時候顧頭不顧腚,怕不是得了老年癡呆。
幸好,我們用過python的itertools,知道有排列組合庫這種巨人的肩膀,另外,前兩天有個重大發(fā)現(xiàn),就是WPS的JS宏可以直接用npm里很多的js模塊,趕快去搜,找到了這個generatorics/generatorics.js at master · acarl005/generatorics · GitHub
很好,只要把js代碼粘貼到WPS宏編輯器的一個模塊里,然后點擊工具-選項-編譯,去掉禁止全局變量的兩個選項,一般的排列組合問題就變成一個for循環(huán)的事了。
比如,有6個公司,每個公司4個部門,要從中選出來自不同公司、不同部門的4人,列出所有可能的組合,就可以這樣:

簡單說就是先對行的“組合”循環(huán),再對列的“排列”循環(huán)即可。
書歸正傳,由于開頭的那個問題是組合嵌套組合,所以還是躲不開要寫遞歸啊,通過學習這個排列組合模塊的寫法,發(fā)現(xiàn)G.combination是一個遞歸的生成器,所以我們在外面再套一層遞歸的生成器即可,就像這樣:

5775行,50毫秒出結果,這一刻我覺得JS宏完勝,當然標題是有點震驚那味了,但僅憑可以使用npm里的大量的js模塊,JS宏覺得值得一用。
最后推薦一些有用的模塊:
6tail的lunar.js,豐富又完善的農歷庫
fastest-levenshtein,編輯距離計算庫,用來模糊匹配不規(guī)范的公司簡寫
lodash,可以拆出功能來用
ramda等等不用多說