首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >月份的对称性

月份的对称性
EN

Code Golf用户
提问于 2018-04-01 07:41:00
回答 5查看 2.7K关注 0票数 32

Introduction

有些月份是完全对称的,这意味着它们具有中心对称和反射对称,比如February of 2010

代码语言:javascript
复制
     February 2010
┌──┬──┬──┬──┬──┬──┬──┐ 
│  │  │  │  │  │  │  │ 
├──┼──┼──┼──┼──┼──┼──┤ 
│  │  │  │  │  │  │  │ 
├──┼──┼──┼──┼──┼──┼──┤ 
│  │  │  │  │  │  │  │ 
├──┼──┼──┼──┼──┼──┼──┤ 
│  │  │  │  │  │  │  │ 
└──┴──┴──┴──┴──┴──┴──┘ 

有些月份只有中心对称,比如February of 1996或当前月份,April of 2018

代码语言:javascript
复制
      February 1996
          ┌──┬──┬──┬──┐
          │  │  │  │  │
 ┌──┬──┬──┼──┼──┼──┼──┤
 │  │  │  │  │  │  │  │
 ├──┼──┼──┼──┼──┼──┼──┤
 │  │  │  │  │  │  │  │
 ├──┼──┼──┼──┼──┼──┼──┤
 │  │  │  │  │  │  │  │
 ├──┼──┼──┼──┼──┴──┴──┘
 │  │  │  │  │
 └──┴──┴──┴──┘

       April 2018  ┌──┐
                   │  │
 ┌──┬──┬──┬──┬──┬──┼──┤
 │  │  │  │  │  │  │  │
 ├──┼──┼──┼──┼──┼──┼──┤
 │  │  │  │  │  │  │  │
 ├──┼──┼──┼──┼──┼──┼──┤
 │  │  │  │  │  │  │  │
 ├──┼──┼──┼──┼──┼──┼──┤
 │  │  │  │  │  │  │  │
 ├──┼──┴──┴──┴──┴──┴──┘
 │  │
 └──┘

还有一些是不对称的,比如上个月,March of 2018

代码语言:javascript
复制
      March 2018
         ┌──┬──┬──┬──┐
         │  │  │  │  │
┌──┬──┬──┼──┼──┼──┼──┤
│  │  │  │  │  │  │  │
├──┼──┼──┼──┼──┼──┼──┤
│  │  │  │  │  │  │  │
├──┼──┼──┼──┼──┼──┼──┤
│  │  │  │  │  │  │  │
├──┼──┼──┼──┼──┼──┼──┘
│  │  │  │  │  │  │
└──┴──┴──┴──┴──┴──┘

任务

以日期形式接受输入,例如:

  • 2018.04
  • 2018.03
  • 2010.02
  • 1996.02

输出相应的对称性。

  • 2018.04 -> centrally symmetric
  • 2018.03 -> asymmetric
  • 2010.02 -> symmetric
  • 1996.02 -> centrally symmetric

规则

  • 这是代码高尔夫,所以最小的字节数获胜。
  • 标准的漏洞显然是不允许的。
  • 假设这一周从星期一开始(感谢安格斯阿纳尔德的建议)。
  • 只考虑1900年到2100年之间的年份(包括在内)。
  • 输入和输出格式规则是允许的,这意味着您可以使用任何与您选择的语言相对应的格式。
  • 将您的解决方案基于公历
EN

回答 5

Code Golf用户

回答已采纳

发布于 2018-04-01 08:49:29

JavaScript (ES6),55字节

由于@Neil保存了6个字节

接受当前语法(year)(month)中的输入。返回非对称的false,中心对称的true和完全对称的0

代码语言:javascript
复制
y=>m=>(n=(g=_=>new Date(y,m--,7).getDay())()+g())&&n==7

在网上试试!

怎么做?

我们定义函数g(),它返回yyyy/mm/01的工作日,作为0=星期一到6=星期日之间的整数。

代码语言:javascript
复制
g = _ => new Date(y, m--, 7).getDay()

因为getDay()本机返回0= Sunday到6= range,所以我们将结果转移到预期的范围,而是查询第7天。

然后我们定义:

代码语言:javascript
复制
n = g() + g()

因为Date的构造函数需要一个0索引的月份,而且g()在传递日期之后会减少m,所以我们实际上首先计算下一个月的第一天的工作日,然后再添加当前的那个工作日。

完全对称月份

完全对称的月份从星期一开始,然后是一个月,这个月也从星期一开始。这只有在非闰年的二月才有可能。

代码语言:javascript
复制
- 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的月份。

代码语言:javascript
复制
- 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。

没有内置,93个字节

使用泽勒同余。与其他版本相同的I/O格式。

代码语言:javascript
复制
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

在网上试试!

票数 22
EN

Code Golf用户

发布于 2018-04-01 11:56:31

T-SQL,213个字节(严格的I/O规则)

代码语言:javascript
复制
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

代码语言:javascript
复制
CREATE TABLE t (s CHAR(7))
INSERT INTO t VALUES ('2018.04'),('2018.03'),('2010.02'),('1996.02')

未高尔夫球:

代码语言:javascript
复制
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
) x

SQLFiddle 1

T-SQL,128个字节(允许I/O规则)

代码语言:javascript
复制
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

如果可以更改输入和输出的格式,我将选择在这个月的第一天,在名为datetimed列中输入:

代码语言:javascript
复制
CREATE TABLE t (d DATETIME)
INSERT INTO t VALUES ('20180401'),('20180301'),('20100201'),('19960201')

输出结果将是1,0,对于中心系统是NULL。

如果我们可以在配置为英式语言的服务器(或登录名)上运行它,我们可以删除SET DATEFIRST 1,节省15个字节。

SQLFiddle 2

票数 7
EN

Code Golf用户

发布于 2018-04-01 09:20:38

Haskell,170个字节

代码语言:javascript
复制
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。

票数 5
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/160993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档