有些月份是完全对称的,这意味着它们具有中心对称和反射对称,比如February of 2010:
February 2010
┌──┬──┬──┬──┬──┬──┬──┐
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
└──┴──┴──┴──┴──┴──┴──┘ 有些月份只有中心对称,比如February of 1996或当前月份,April of 2018:
February 1996
┌──┬──┬──┬──┐
│ │ │ │ │
┌──┬──┬──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┴──┴──┘
│ │ │ │ │
└──┴──┴──┴──┘
April 2018 ┌──┐
│ │
┌──┬──┬──┬──┬──┬──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┴──┴──┴──┴──┴──┘
│ │
└──┘还有一些是不对称的,比如上个月,March of 2018:
March 2018
┌──┬──┬──┬──┐
│ │ │ │ │
┌──┬──┬──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┘
│ │ │ │ │ │ │
└──┴──┴──┴──┴──┴──┘以日期形式接受输入,例如:
2018.042018.032010.021996.02输出相应的对称性。
2018.04 -> centrally symmetric2018.03 -> asymmetric2010.02 -> symmetric1996.02 -> centrally symmetric发布于 2018-04-01 08:49:29
由于@Neil保存了6个字节
接受当前语法(year)(month)中的输入。返回非对称的false,中心对称的true和完全对称的0。
y=>m=>(n=(g=_=>new Date(y,m--,7).getDay())()+g())&&n==7我们定义函数g(),它返回yyyy/mm/01的工作日,作为0=星期一到6=星期日之间的整数。
g = _ => new Date(y, m--, 7).getDay()因为getDay()本机返回0= Sunday到6= range,所以我们将结果转移到预期的范围,而是查询第7天。
然后我们定义:
n = g() + g()因为Date的构造函数需要一个0索引的月份,而且g()在传递日期之后会减少m,所以我们实际上首先计算下一个月的第一天的工作日,然后再添加当前的那个工作日。
完全对称的月份从星期一开始,然后是一个月,这个月也从星期一开始。这只有在非闰年的二月才有可能。
- Feb -------------- - Mar --------------
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
-------------------- --------------------
01 02 03 04 05 06 07 01 02 03 04 05 06 07
08 09 10 11 12 13 14 08 09 10 11 12 13 14
15 16 17 18 19 20 21 15 16 17 18 19 20 21
22 23 24 25 26 27 28 22 23 24 25 26 27 28
29 30 31这导致n= 0。
集中对称月份是指其第一天和下一个月的工作日和下一个月之和为7的月份。
- M ---------------- - M+1 --------------
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
-------------------- --------------------
0 1 [2] 3 4 5 6 0 1 2 3 4 [5] 6
-------------------- --------------------
01 02 03 04 05 01 02
06 07 08 09 10 11 12 03 04 05 06 07 07 09
13 14 15 16 17 18 19 ...
20 21 22 23 24 25 26
27 28 29 30 31因此进行了第二个测试:n == 7。
使用泽勒同余。与其他版本相同的I/O格式。
y=>m=>(n=(g=_=>(Y=y,((m+(m++>2||Y--&&13))*2.6|0)+Y+(Y>>2)-6*~(Y/=100)+(Y>>2))%7)()+g())&&n==7发布于 2018-04-01 11:56:31
SET DATEFIRST 1SELECT CASE WHEN a+b<>8THEN'a'WHEN a=1THEN''ELSE'centrally 'END+'symetric'FROM(SELECT DATEPART(DW,f)a,DATEPART(DW,DATEADD(M,1,f)-1)b FROM (SELECT CONVERT(DATETIME,REPLACE(s,'.','')+'01')f FROM t)y)x上面的查询考虑了严格的输入/输出格式规则。
输入来自名为s的表的列t:
CREATE TABLE t (s CHAR(7))
INSERT INTO t VALUES ('2018.04'),('2018.03'),('2010.02'),('1996.02')未高尔夫球:
SET DATEFIRST 1
SELECT *, CASE WHEN a+b<>8 THEN 'a' WHEN a=1 AND b=7 THEN '' ELSE 'centrally ' END+'symetric'
FROM (
SELECT *,DATEPART(WEEKDAY,f) a,
DATEPART(WEEKDAY,DATEADD(MONTH,1,f)-1) b
FROM (SELECT *,CONVERT(DATETIME,REPLACE(s,'.','')+'01')f FROM t)y
) xSQLFiddle 1
SET DATEFIRST 1SELECT CASE WHEN a+b<>8THEN 1WHEN a=1THEN\END FROM(SELECT DATEPART(DW,d)a,DATEPART(DW,DATEADD(M,1,d)-1)b FROM t)x如果可以更改输入和输出的格式,我将选择在这个月的第一天,在名为datetime的d列中输入:
CREATE TABLE t (d DATETIME)
INSERT INTO t VALUES ('20180401'),('20180301'),('20100201'),('19960201')输出结果将是1,0,对于中心系统是NULL。
如果我们可以在配置为英式语言的服务器(或登录名)上运行它,我们可以删除SET DATEFIRST 1,节省15个字节。
SQLFiddle 2
发布于 2018-04-01 09:20:38
import Data.Time.Calendar
import Data.Time.Calendar.WeekDate
a%b=((\(_,_,a)->a).toWeekDate.fromGregorian a b$1)!gregorianMonthLength a b
1!28=2
4!29=1
7!30=1
3!31=1
_!_=0中心对称返回2,对称返回1,不对称返回0。
https://codegolf.stackexchange.com/questions/160993
复制相似问题