今天是中心


36

给定日期作为任何方便格式的输入,请输出一个日历,其中该日期为五周窗口的确切中心。日历的标题必须包含星期几(即Su Mo Tu We Th Fr Sa)的两个字母的缩写。不允许使用三字母或其他缩写。

例如,April 2 2019作为输入,输出应为

Sa Su Mo Tu We Th Fr
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31  1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19

因此给定的日期是日历的正中间。

给定February 19 2020,输出

Su Mo Tu We Th Fr Sa
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
 1  2  3  4  5  6  7

对于September 14 1752,请显示以下内容:

Mo Tu We Th Fr Sa Su
28 29 30 31  1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  1

  • 输入和输出可以通过任何方便的方法给出。
  • 输入保证非空和有效(即,您绝不会收到""Feb 31等)。
  • 假设所有日期都为公历。
  • years年必须考虑在内。
  • 输入日期范围为Jan 1 1600Dec 31 2500
  • 您可以将其打印到STDOUT或将其作为功能结果返回。
  • 完整的程序或功能都是可以接受的。
  • 只要字符正确排列,任何数量的外部空格都是可以接受的。
  • 允许单位数天的前导零,也可以将单位数天对齐左对齐。
  • 禁止出现标准漏洞
  • 这是因此所有常用的高尔夫规则都适用,并且最短的代码(以字节为单位)获胜。

Answers:


12

R77 72字节

function(d,`~`=format)write(c(strtrim(d+-3:3~"%a",2),d+-17:17~"%e"),1,7)

在线尝试!

固定输出使用2个字母天的缩写。

-1字节strtrim感谢Aaron Hayman的支持

用前导0填充日期数字;将输入作为Date,可以使用来创建as.Date("YYYY/MM/DD")

R 答案的荒谬之词...


8

05AB1E175个 174 172 171 160 字节

¦WΘ1š-1šVтFY`2ô0Kθ4ÖUD2Qi\28X+ë<7%É31α}‹iY¬>0ëY1¾ǝDÅsD12‹i>1ë\1Dǝ¤>2}}ǝVY})DJIJk18+£35.£¬.•4ιõ÷‡o‹ƶ¸•2ôs`UÐ3‹12*+>13*5÷s3‹Xα©т%D4÷®т÷©4÷®·()DćsćsO7%._s€нT‰J«7ô»

输入格式[day, month, year]。输出与领先的0S表示个位数天,小写mo通过su(如果首字母大写是强制性的,可以添加1字节)。

在线尝试验证所有测试用例

这可能是我最长的05AB1E答案的新记录,然后我做了一些非常复杂的挑战...>> 编辑:嗯,好了,几乎.. p

重要说明: 05AB1E没有任何内置对象可用于Date对象或计算。关于日期的唯一内置函数是今天的年/月/日/小时/分钟/秒/秒/微秒。

因此,因此,您看到的几乎所有代码都是手动计算,用于计算前几天和后几天(包括经过几年的过渡并记住the年),并使用Zeller的全等值来计算星期几。

该代码的大部分都从我先前的05AB1E答案中复制而来,这也与以下说明有关。

说明:

我们从上个月的第一天开始:

¦          # Remove the first item (the days) from the (implicit) input
 W         # Get the minimum (without popping the list itself)
           # (since the year is guaranteed to be above 1599, this is the month)
  Θ        # Check if its exactly 1 (1 if 1, 0 if in the range [2,31])
   1š      # Prepend a 1 as list (so we now have either [1,1] or [1,0]
     -     # Subtract this from the month and year
      1š   # And prepend a 1 for the day
        V  # Pop and store this first day of the previous month in variable `Y`

然后,我将该日期用作开始日期,并计算接下来的100天:

тF    # Loop 100 times:
  Y`2ô0Kθ4ÖUD2Qi\28X+ë<731α}‹iY¬>0ëY1¾ǝDÅsD12i>1ë\1Dǝ¤>2}}ǝV
      #  Calculate the next day in line
      #  (see the linked challenge above for a detailed explanation of this)
   Y  #  And leave it on the stack
 })   # After the loop: wrap the entire stack into a list, which contains our 100 days

然后,以输入日期为中间,我只从列表中保留该输入日期之前的17和之后的17:

DJ          # Duplicate the 100 dates, and join the day/month/year together to strings
  IJ        # Push the input, also joined together
    k       # Get the 0-based index of the input in this list
            # (the joins are necessary, because indexing doesn't work for 2D lists)
     18+    # Add 18 to this index (18 instead of 17, because the index is 0-based)
        £   # Only leave the first index+18 items from the 100 dates
     35.£   # Then only leave the last 35 items

现在我们有35天了。下一步是计算星期几,并创建输出表的标题:

¬                # Get the first date of the list (without popping the list itself)
 .•4ιõ÷‡o‹ƶ¸•    # Push compressed string "sasumotuwethfr"
             2ô  # Split it into chunks of size 2
s                # Swap to get the first date again
 `UÐ312*+>13*5÷s3Xα©т%D4÷®т÷©4÷®·()DćsćsO7%
                 # Calculate the day of the week (sa=0; su=1; ...; fr=6)
                 # (see the linked challenge above for a detailed explanation of this)
  ._             # Rotate the list of strings that many times

看到这个05AB1E尖矿(部分如何压缩字符串不是字典的一部分吗?理解为什么.•4ιõ÷‡o‹ƶ¸•"sasumotuwethfr"

然后,我们根据之前创建的日期列表来创建日期以填充表格本身。我们将其与标题合并在一起。之后,我们可以打印最终结果:

s           # Swap to get the list of dates again
 €н         # Only leave the first item of each date (the days)
   T       # Take the divmod 10 of each
     J      # Join those divmod results together
            # (we now have leading 0s for single-digit days)
      «     # Merge this list together with the header list
       7ô   # Split it into chunks of size 7
         »  # Join each inner list by spaces, and then each string by newlines
            # (and output the result implicitly)

2
那是大量的工作!
Luis Mendo

2
是的,Java击败了05AB1E!:D我想是第一次;-)
OlivierGrégoire

@LuisMendo上一次完成大多数与链接的挑战有关的操作,但是是的,这是很多工作。
凯文·克鲁伊森

@OlivierGrégoire现在,我们再见了。;)
Kevin Cruijssen

@OlivierGrégoire现在,它又降低了,对不起。; p
Kevin Cruijssen

6

的JavaScript(ES6), 141个  126字节

借用节省了15个字节 .toUTCString().slice(0,2)尼尔的答案

将输入作为Date对象。

f=(d,n=0)=>n<42?(D=new Date(d-864e5*(24-n)),n<7?D.toUTCString().slice(0,2):(i=D.getDate())>9?i:' '+i)+`
 `[++n%7&&1]+f(d,n):''

在线尝试!


呵呵,当我最初编写它的时候,我可能发誓我的代码在第三个测试用例中失败了……那么,这可以节省我52个字节……
尼尔·

4

的JavaScript(Node.js的)205个 152 145字节

f=
d=>`012345`.replace(g=/./g,r=>`0123456
`.replace(g,c=>`${new Date(d-864e5*(24-c-r*7))[+r?`getUTCDate`:`toUTCString`]()}`.slice(0,2).padStart(3)))
<input type=date oninput=o.textContent=f(this.valueAsDate)><pre id=o>

在线尝试!将输入作为JavaScript Date对象或时间戳记。编辑:感谢@EmbodimentofIgnorance,它节省了1个字节,然后它允许我通过在输出中添加尾随换行符来进一步保存7个字节。当我发现自己要解决的问题实际上不是越野车时,节省了52个字节...


padStart(2)-> padStart(3),删除连接字符串中的-1个字节的空间
Ignorance的体现



2

Wolfram语言(Mathematica),123字节

(s=#;Grid@Join[{StringTake[ToString@DayName[s~d~#]&/@Range[-3,3],2]},Partition[Last@d[s,#]&/@Range[-17,17],7]])&
d=DatePlus

在线尝试!

我不知道为什么Grid在TIO上不起作用,但是这段代码输出了

在此处输入图片说明

@DavidC保存了1个字节


也许Grid因为TIO无法将图片中的内容居中而无法使用?
AdmBorkBork

@AdmBorkBork有一种方法可以在TIO中加载这样的图形。我想去年有人给我看过。但是我不记得该怎么做...所以,如果有人知道,请告诉我们!
J42161217

2

MATL34 33 31字节

YO-17:17+t7:)8XOO3Z(!1ew7XOU7e!

在线尝试!

说明

YO       % Implicit input. Convert to date number. This is a single number
         % that specifies the date
-17:17   % Push [-17 -16 ... 16 17]
+        % Add to date number, element-wise. This gives a row vector of 35
         % date numbers centered around the input date
t        % Duplicate
7:       % Push [1 2 ... 7]
)        % Index into the 35-element vector. This keeps the first 7 entries
8XO      % Convert to day-of-week in 3 letters. Gives a 3-col char matrix
O3Z(     % Write char 0 (equivalent to space for display purposes) into the
         % 3rd column
!1e      % Tranpose and linearize into a row. This produces a string such as
         % 'Tu We Th Fr Sa Su Mo ', to be used as column headings
w        % Swap. This brings to top the row vector of 35 date numbers
         % computed from the input
7XO      % Convert to day-of-month. Gives a 2-col char matrix
U        % Convert each row to number
7e!      % Reshape into 7-row matrix and transpose
         % Implicit display. This prints the string with the headings and
         % the matrix. The latter has a minimum-one-space separation between
         % columns, so it is aligned with the headings

2

Java(JDK),149字节

d->{d.add(5,-24);for(int i=0,w;i<42;d.add(5,1))System.out.printf("%c%2s",i%7<1?10:32,i++<7?"SaSuMoTuWeThFr".substring(w=d.get(7)%7*2,w+2):d.get(5));}

在线尝试!

学分



1
@KevinCruijssen等待...什么?我祝贺你!我尝试这样做,但是找不到方法,但是您做到了!非常好:-)
OlivierGrégoire

1
也许你看到更多的东西结合i,并j以某种方式?还是j++%7<1?10:32用一些按位魔术更短的东西?但我会留给你。我要去上班了,哈哈。;)
Kevin Cruijssen,

1
啊,当然..不错的团队合作!;)PS:w代表什么?为什么不h为标题?
Kevin Cruijssen

1
@KevinCruijssen w为“天W¯¯周刊”。同样,比特摆动只会导致(i%7+6)/7*22+10更长的时间。
OlivierGrégoire

2

的PHP197 189 187字节

for($d=date_create($argn)->sub($i=new DateInterval(P17D)),$i->d=1;$x++<35;$h.=$x<8?substr($d->format(D),0,2).' ':'',$d->add($i))$o.=str_pad($d->format(j),3,' ',2);echo wordwrap($h.$o,20);

在线尝试!

输入STDIN为日期字符串。用运行php -nF

$ echo April 2 2019|php -nF cal.php

Sa Su Mo Tu We Th Fr 
16 17 18 19 20 21 22 
23 24 25 26 27 28 29 
30 31  1  2  3  4  5 
 6  7  8  9 10 11 12 
13 14 15 16 17 18 19 

验证所有测试用例

174个字节,后补零位。


1

Excel VBA中,190个 159字节

谢谢@TaylorScott

Function z(i)
Dim d(5,6)
v=DateValue(i)-17
For x=1To 5
For y=0To 6
d(0,y)=Left(WeekdayName(Weekday(v+y)),2)
d(x,y)=day(v+y+(x-1)*7)
Next y,x
z=d()
End Function

以Excel VBA的有效日期字符串形式输入(例如2020年2月19日; 2020年2月19日; 2019年2月19日),并返回以给定日历为中心的数组。


通过从该解决方案中删除空格,可以将该解决方案降低到159,Function z(i) Dim d(5,6) v=DateValue(i)-17 For x=1To 5 For y=0To 6 d(0,y)=Left(WeekdayName(Weekday(v+y)),2) d(x,y)=Day(v+y+(x-1)*7) Next y,x z=d() End Function
Taylor Scott

@TaylorScott谢谢,仅使用了自动填充这些空间的内置编辑器。
威廉·波特


0

T-SQL,203个字节

DECLARE @f date='2020-02-19'

,@ char(20)=0,@d char(105)=0SELECT
@=left(format(d,'D'),2)+' '+@,@d=right(d,2)+char(32-n%7/6*19)+@d
FROM(SELECT dateadd(d,number-17,@f)d,number n
FROM spt_values WHERE'P'=type)x ORDER BY-n
PRINT @+'
'+@d

在线版本略有不同,此发布的版本可在MS-SQL Studio管理中使用。与在线版本相比,它节省了1个字节,但在线给出的结果不正确

在线尝试


0

Python 2,115个字节

from datetime import*
d=input()
for i in range(42):print(d+timedelta(i-24)).strftime('%'+'da'[i<7])[:2]+i%7/6*'\n',

在线尝试!

不知道是否允许...以STDIN形式输入date(year, month, day)。这也可以表示为__import__('datetime').date(year, month, day)。这些确实是__import__('datetime').date对象。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.