哑铃片的组合有几种,以及二猫的编程解决

一副哑铃,有可替换的哑铃片 0.75kg,1.25kg,2kg,2.5kg每种各4片。可以组合出哪些重量?

1. 我哥给我一副哑铃

回老家,我哥给我一对可调节哑铃。

之前我有6.5kg*2kg哑铃一对,用来练深蹲、单侧或双侧俯身划船,农夫行走和土耳其起立。份量有点轻,但是没有更重的。还有3kg*2哑铃一对,是邦哥带我去迪卡侬买的,用来练肩。他说,不用太重,你感觉侧平举不太费劲就对了。一直用到现在,刚刚才有一点觉得轻,但是没有刚好稍微重一点儿的,因此没有进步的意愿。还有2对1kg哑铃,俯身或俯卧练肩后侧或肩胛,有时希望稍微重一点点点。

我哥给我的这对哑铃可调,共16片哑铃片,0.75kg,1.25kg,2kg,2.5kg共4种,每种各4片。哑铃杆2根,每根1.1kg。

我装配出8kg*2哑铃,当天晚上就练了一轮肱二头肌。果然比6.5kg的要给力,略微有点过于给力。第二天晚上,第三天晚上,肱二头肌拉伸时有微微疼痛。还试了左右分别5组土耳其起立,也果然比6.5kg*2要难。我想,是不是应该降一下重量,比6.5kg高5~10%,这样成长曲线更平滑一些,痛苦能少点。

如果有个表格,能把这副哑铃所有能组合出的重量都列出,我每次查找下一个5~10%进步的选项就可以了。最大重量是每个哑铃13(+杆重1.1)kg,练肩的话,我今生也不会达到。总重五十多斤,抱着深蹲对我可见的未来也足够。

问题是,都有哪些组合呢?

2. 用EXCEL试试

凡事,先用最简单的工具试试。Excel最简单,各种计算,特别是简单场景的,无出其右者。有人可能觉得C最简单,或者觉得Python最简单。你得在发着低烧,要求速度的时候,看出错率和体力消耗。这才是简单。

图1 Virgin Python,惟真楼的巨蟒

Excel有求组合和排列的函数,就是英文单词 combin 和 permut 或变形。我刚一输入函数就觉得“不对”。一,这两个函数的作用是求组合和排列的数量,而我要的是列表,仅仅数量对我不够。二,相同重量的组合,对我而言可以算同一种。如何判断?Excel 是否能像 C++ STL 那样支持自定义的谓词呢?十有八九不能。这样对多数用户过于复杂,容易用错。况且,我对谓词的要求是判断求和相等,通用的谓词定义需要何种计算能力,是不是得图灵机等价,那么这里需要用VBA才行。

再查,Excel 365版本以后的,支持给出组合和排列的条目。我手头的版本过低,不知道有多低,不过,想想发行时间应该不足以支持。试了下 一个array类函数{=PERMUT(A2:A4,3)},又试了ctrl-shift-enter组合键,果然不能工作。

再往下就是用VBA或者某个特别的插件,进入奇技淫巧模式了。

3. 二猫出手

所以,这种活儿就应该用C语言。穷举,判断条件自定义。找二猫,问“我有这么个问题”。我没说“这事挺简单”,虽然不确定,但是隐约觉得还有坑。

二猫说“简单,能做。”

然后开始问我尚未细化的需求。俩哑铃是不是需要相同重量?每个哑铃杆有两端,这两端是否需要相同重量?相同重量,使用不同的哑铃片,比如 2 == 1.25+0.75,这算一种还是两种?我又一次体会到 需求难提,用人类语言尽述心中所想的难度,以及为什么会有《猴爪》这样的故事。

没多一会儿,程序就出来了。核心代码大致如下。

我说,输出改成这样的格式吧,这里加几个空格,那里加两个\t,这里乘以2,那里对齐。二猫体会到需求变更是工程中的常态,用户经常在看到输出效果以后才知道“那不是我想要的”;可能程序员最花时间的那部分,做完以后,用户说“这个不重要”,请删除。

最重要最复杂的业务逻辑完成以后,我和二猫不约而同地对剩余的工作采用了额外的工具,而不是修改程序。二猫写了段以map为准的代码,把数据吃进去再排出来,去除完全相同的重复。核心代码大致如下。

我用excel去除重量相同的重复,调整格式,分别得到重量列表和组合列表。

这样,我们得到了以下表格。能够看到相同重量有多种哑铃片组合方式。

双手两手相同重量,不去重复,最右列是哑铃片的组合。

单手,不去重复,最右列是哑铃片的组合。

4.赞叹精妙设计

观察上述两个表格,我发现,我并不太需要哑铃片的组合。只要告诉我这个重量是可行的/,对我来讲信息就足够了。有了可以得到这个信心,很容易算出组合的方式。就算我的口算能力一塌糊涂,也可以再根据想要的重量查上面的两张表格。

因此,我删除哑铃片的组合,去除相同重量的重复行,得到下述两个表格。简洁多了。

双手,杆两端平衡,按相同重量去除重复。

单手,杆两端平衡,按相同重量去重。

观察这两张表格可以发现,哑铃片重量的选择应该是精心设计过的。哑铃总重的增量,绝大多数是0.5kg。增加0.5kg对于提高训练难度,经常不是特别大,也不特别小,相当适合。个别增量是0.25或者1。

再回顾哑铃片的种类,0.75kg,1.25kg,2kg,2.5kg,如果使用分数是 5/2,4/2,5/4,3/4,有点意思。转换成以1/4的倍数表示,那么4种哑铃为 10,8,5,3。这几个数字看起来眼熟得多,隐约有人民币面值的种类,以及质数、合数之类的印象。好了,应该是精心设计过的。就到这里吧,赶紧去锻炼——莫等闲,锈了新哑铃。

Leave a Reply

Your email address will not be published. Required fields are marked *