故事背景

在我的老家,西南边陲的某个小县城,因为物资匮乏、基础设施落后,“赶集”这项活动不知流传了多少年。以县城北部区域的四个乡镇为界,每天都有一个集,暂且就叫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])
}

快捷指令

最后

借助一个简单的数学求余就能解决生活中的问题,即使现在常年在外,但每当回想起家乡、回想起家乡的集市,我还是会掏出手机看下今天是什么集,大概这就是乡愁吧!