故事背景
在我的老家,西南边陲的某个小县城,因为物资匮乏、基础设施落后,“赶集”这项活动不知流传了多少年。以县城北部区域的四个乡镇为界,每天都有一个集,暂且就叫A、B、C、D集吧。没有官方通知,也没有统一组织方,到了日子大家就会不约而同的前往集市,采购生活用品、炫点小吃、添置衣物、卖点家里的劳动剩余。
赶集的规律是“空三赶四”,ABCDABCD如此循环往复,就A集来说就是A _ _ _ A _ _ _ A。
在早些年间农忙时节,家里人不知白天黑夜地在田间地头劳作,根本记不住今夕是何年,为了确定今天是什么集,经常需要跑出家门问问其他邻居,亦或是看看路上有没有前往集市的“马的”。日子一天一天过,集市的规律就如二十四节气般从来没有混乱过。
2020年新冠肆虐,为减少人员流动,很多自然村封村封路,更别提集市了。就这样集市暂停了一段时间,待情况好转,集市恢复了往常的热闹,还是固定的时间、固定过的地点,大家又聚集在了一起。周期循环规律并没有因为集市暂停而被打断,这让我好生惊讶。
抽象一下
观察规律
其实上面已经给出规律了,就是ABCDABCD循环,每隔三天重复一个集。
假设第1天是A集,那么第5天、第9天都是A集,按常见程序数组从0开始的惯例,那就是
第0天是A集,第4天、第8天都是A集。
如果我们已知2017-02-05是A集,要计算今天是什么集,其实就是计算今天距离2017-02-05相差多少天,然后对4取余,根据余数可得:
- 余数为0就是A集
- 余数为1就是B集
- 余数为2就是C集
- 余数为3就是D集
代码实现
Java版
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Test {
public static void main(String[] args) throws ParseException {
String[] names = new String[]{"A集", "B集", "C集", "D集"};
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date standard = dateFormat.parse("2007-02-05");
Calendar c1 = Calendar.getInstance();
c1.setTime(standard);
Calendar now = Calendar.getInstance();
int diff = now.get(Calendar.DAY_OF_YEAR) - now.get(Calendar.DAY_OF_YEAR);
System.out.println(names[diff % 4]);
}
}
Go版
package main
import (
"fmt"
"time"
)
const (
STANDARD = "2017-02-05"
)
var names = []string{"A集", "B集", "C集", "D集"}
func main() {
today := time.Now()
standard, _ := time.Parse("2006-01-02", STANDARD)
fmt.Println(names[int(today.Sub(standard).Hours()/24)%4])
}
快捷指令
最后
借助一个简单的数学求余就能解决生活中的问题,即使现在常年在外,但每当回想起家乡、回想起家乡的集市,我还是会掏出手机看下今天是什么集,大概这就是乡愁吧!