获取给定年份和月份中第n天的日期


17

介绍

人们通常将日期称为“ 2018年8月的第二个星期五”或“ 2012年3月的第四个星期日”。但是很难说那是什么日期!您的任务是编写一个接收年,月,周,整数的程序,并输出该日期。

挑战

  • 作为输入,您将获得一年,一个月,一周中的一天以及一个数字。

  • 您可以采用任何合理的格式进行输入,例如在星期几中使用字符串或在工作日中使用零索引,甚至可以在单个字符串中使用年和月。不过,请在回答中说明您的输入格式。

  • 告诉您目标月份的星期几的整数将是1-5的整数。该整数将永远不会指向不存在的一周中的某天(例如,2019年2月的第五个星期五,它不存在)。

  • 岁月永远是美好的。

  • 您的输出可以采用任何合理的格式,包括打印最终日期。但是,请解释您的输出格式和答案。

  • 在输出中提供年份和月份是可选的。另外,您可以假定日期是有效的。

输入和输出示例

考虑一下此输入,其格式为:年为4位数字,月为整数,星期几为字符串,序数为整数:

2019,3,Saturday,2
2019,12,Sunday,1
2019,9 Saturday,1

输出:

3月9
日12月1
日9月7日

这是,因此最短的答案为准。


1
我以为我也许可以使用GNU date,但是有趣的是,解析器在这里有一个有趣的解释
门把手

周号可以从0索引编制吗?
乔·金

当然,如果它适合您的程序
愚昧无知的体现

建议的测试案例:2018年,12,周日1
亚当

建议的测试用例:2019
Shaggy

Answers:


4

MediaWiki模板,19字节

{{#time:r|{{{1}}}}}

这是此PHP答案的MediaWiki模板ParserFunctions端口

注意:内部#time使用PHP strtotime


样本输入

{{#time:r | 2019年3月的第二个星期六}}

样本输出

2019年3月9日,星期六00:00:00 +0000


3

Japt,19个 15字节

输入是:年,月的0基索引,星期几的0基索引(0是星期日)&n

_XµW¶Ze}f@ÐUVYÄ

尝试一下

                    :Implicit input of U=year, V=month, W=weekday & X=n
       }f           :Output the first element generated by the right function that returns
                    : falsey (0) when passed through the left function
         @          :Right function. Y=0-based index of current iteration
          ÐUVYÄ     :  new Date(U,V,Y+1)
_                   :Left function. Z=date being passed
 Xµ                 :  Decrement X by
   W¶               :   Test W for equality with
     Ze             :    Z.getDay()

2

C#(Visual C#交互式编译器),59字节

(y,m,d,w)=>1+(d-(int)new DateTime(y,m,1).DayOfWeek+7)%7+7*w

在线尝试!

-27个字节,感谢@EmbodimentOfIgnorance!

减少打高尔夫球的代码...

// y: year
// m: month
// d: day of week (0 is Sunday)
// w: week number (0 based)
(y,m,d,w)=>
  // start on the first day of the month
  1+
  // determine the number of days to
  // the first occurrence of the
  // requested weekday
  (d-(int)new DateTime(y,m,1).DayOfWeek+7)%7+
  // add the number of requested weeks
  7*w

返回值是所请求日期的月份中的一天的整数。


如果您只返回允许的月份中的某天,则可以将其压缩为59字节
愚人节的体现

再次感谢您的提示-(今天是2倍;)我将更新我的答案。
dana

2

SmileBASIC,58 51 48 46 45字节

READ N,M$DTREAD M$OUT,,D,W?(5-W+D*2)MOD 7+N*7

输入形式为: week,year/month/weekday

  • week:星期数,0索引
  • year:年,4位数
  • month:月(1索引),2位- 0填充
  • weekday:星期几(1索引,1 =星期日),2位数字0填充

输出是一个月中的第几天,索引为0。
2019年3月的第二个星期六是1,2019/03/078(3月9日)

不打高尔夫球

READ WEEK,M$
DTREAD M$ OUT ,,D,W
'Functions in SB can output multiple values using OUT.
'In this case, we don't need the first 2 values, so no variables are given.

PRINT (5-W+ D*2) MOD 7 +WEEK*7

说明

输入表单经过专门选择,因此可以将年/月/日直接传递给DTREAD,这是一个解析YYYY/MM/DD字符串并以数字形式返回年/月/日并计算星期几的函数。

但是,请注意,在DTREAD期望每月的某天的地方,我们改用星期几。这使事情复杂化,但也意味着输入值更少,我们不需要/01在日期字符串的末尾添加。

DTREAD输出WD
W是工作日,DW每月的第几天。
(因此,如果您输入的7是工作日,D则将是7并且W将是该月的第7天是星期几)

该表达式(5-W+D*2)MOD 7用于获取输入工作日的第一个匹配项,作为该月的0索引日。(我主要通过反复试验弄清楚了这一点)

之后,该程序仅添加WEEK*7


我真的希望有单独的单词表示“星期几”和“每月几号”。


2

Perl 6的52 48个字节

{1+($^c+4-Date.new($^a,$^b,1).daycount)%7+$^d*7}

在线尝试!

匿名代码块,其输入内容为年,月,星期几(星期日为0)和星期数(索引为0)。输出是一个日期对象。

旧说明:

{                                                  } # Anonymous code block
 (   Date.new(         ))   # Create a new date with
              $^a,$^b,1     # With year, month and the first day
  $_=                       # Save in the variable $_
                         +  # Add to this
                           $^c+4                     # The given day plus 4
                          (     -.daycount)          # The number of days since 17 Nov, 1858
                                           %7        # Modulo 7 to get the correct day
                                             +$^d*7  # Plus the 7 times the number of weeks

我觉得周数必须是1索引
12Me21

@ 12Me21这个问题说输入是灵活的,但是我问我们是否将星期数作为0索引
Jo King

这似乎在其他月份都无效。我认为你需要$^c+4-$!.daycount
nwellnhof

@nwellnhof啊,我应该想到这一点,而不是反复试验,大声笑。应该立即修复
Jo King

1

MATL28 27字节

'1 'ihYO31:q+t8XOi=!A)i)1XO

这使用三个输入:

  • 月份和年份的字符串: 'March 2019'
  • 包含三个字母的字符串,首字母大写,表示星期几:' Sat'
  • 编号:2

输出是一个字符串,其中的年,月,日用破折号分隔09-Mar-2019

在线尝试!

说明

考虑输入'March 2019''Sat'2

'1 '    % Push this string
        % STACK: '1 '
ih      % Input string: month and year. Concatenate
        % STACK: '1 March 2019'
YO      % Convert to serial date number
        % STACK: 737485
31:q+   % Create vector [0 1 2 ... 30] and add element-wise
        % STACK: [737485 737486 737487 ... 737515]
t8XO    % Duplicate. Convert to date format 'ddd': day of week in three letters. Gives
        % a 2D char array
        % STACK: [737485 737486 737487 ... 737515], ['Fri'; 'Sat'; 'Sun'; ...; 'Sun']
i=      % Input string: day of week in three letters. Compare element-wise with broadcast
        % STACK: [737485 737486 737487 ... 737515],
        % [0 0 0; 0 0 0; ...; 1 1 1; 0 0 0; ... 1 1 1; ...]
!A      % True for rows containing only 1
        % STACK: [737485 737486 737487 ... 737515], [0 0 ... 1 ... 0 ... 1 ...]
)       % Index: uses the second vector as a mask into the first
        % STACK: [737486 737493 737500 737507 737514]
i)      % Input number. Index
        % STACK: 737493
1XO     % Convert to date format 'dd-mmm-yyyy'. Implicit display
        % STACK: '09-Mar-2019'

1

Python 3中92 82个字节

@Jo King获得82个字节

lambda y,m,d,w:z(y,m)[w-(z(y,m)[0][d]>0)][d]
from calendar import*
z=monthcalendar

在线尝试!

原始版本,92字节

from calendar import*
def f(y,m,d,w):
 x=monthcalendar(y,m)
 if x[0][d]:w-=1
 return x[w][d]

在线尝试!

将年份作为整数,将月份作为1索引的整数,将星期几作为0索引的整数,其中Monday是0,星期日是6,每月的星期几作为1索引的整数。

怎么运行的:

# import monthcalendar
from calendar import*
# function with 4 inputs
def f(y,m,d,w):
 # get a 2-D array representing the specified month
 # each week is represented by an array
 # and the value of each element is its date of the month
 # Monday is the 0th element of each week, Sunday is the 6th element
 # days of the first week of the month before the 1st are 0s 
 x=monthcalendar(y,m)
 # if the first week of the month includes the desired day of week
 # convert the week of month to 0-index so that it takes into account the first week
 if x[0][d]:w-=1
 # return the weekday of the week number specified
 return x[w][d]

1

R72 69字节

function(y,m,d,n,D=as.Date(paste0(y,-m,-1))+0:31)D[weekdays(D)==d][n]

在线尝试!

输入为:

  • 年份编号
  • 月数(1-12)
  • 当前语言环境中的工作日字符串(TIO要求英文名称带有大写字母)
  • 序数(1索引)


0

Groovy,46个字节

{y,m,d,w->r=new Date(y,m,7*w)
r-(r.day+7-d)%7}

在线尝试!

输入为自1900年以来的年份,以0索引的月份,以0索引的日期(星期日为0)和星期数



0

红色64 60字节

func[y m d n][a: to-date[1 m y]d - a/10 - 7 % 7 +(n * 7)+ a]

在线尝试!

以年,月和工作日为编号,以1索引,星期一是一周的第一天。


呵呵,to-date是一回事。也许这对圣诞节前夕格式挑战很有用
仅使用ASCII

@ASCII纯语言我们曾now用于挑战
Galen Ivanov

1
是的,但是我正在考虑其他方法(即<repeat " Eve"date2-date1 times>方法iirc)
仅ASCII的

@ASCII专用>> 25-Dec-2019 - 1-1-2019 == 358
Galen Ivanov,

0

APL(Dyalog Unicode),36 字节 SBCS

完整程序。提示输入[year,month](一月是1),然后输入日期(星期日是0),然后输入n(首先是1)。

date⎕⊃d/⍨⎕=7|d←(⍳31)+days⎕⊣⎕CY'dfns'

在线尝试!

⎕CY'dfns'Ç Ó p在y DFN和

 抛弃那个结果而赞成……

 提示控制台输入[year,month]数字

days[c]  天 [n]自0的 1899-12-31该月的

(⍳31)+ 加 ntegers 1 ... 31到

d← 存储在d(用于d AY数字)

7| 除以7时的除法余数(由于良好的时期,星期几,星期日为0)

⎕= 提示控制台输入星期几编号,并在等于星期几编号的位置获取掩码

d/⍨d用那个面具 过滤

⎕⊃ 提示控制台输入n并使用它从日期编号列表中进行选择

date[c]  日期时间戳 [n](小时,分钟,秒,毫秒的末尾加零)


单击[c]以获得代码,单击[ n]获得注释。


0

JavaScript(ES6),49个48字节

f=
(a,d,n)=>(d+6-new Date(...a,7).getDay())%7+n*7-6
<div oninput=o.textContent=f([+y.value,+m.value],+d.value,+n.value)>Year: <input id=y type=number value=2019><br>Month: <select id=m><option value=0>Jan<option value=1>Feb<option value=2>Mar<option value=3>Apr<option value=4>May<option value=5>Jun<option value=6>Jul<option value=7>Aug<option value=8>Sep<option value=9>Oct<option value=10>Nov<option value=11>Dec</select><br>Day: <select id=d><option value=0>Sun<option value=1>Mon<option value=2>Tue<option value=3>Wed<option value=4>Thu<option value=5>Fri<option value=6>Sat</select><br>Count: <input id=n type=number value=1 min=1 max=5><pre id=o>

将参数设为f([year, month], day, number)。星期中的月份和日期(从星期日开始)采用零索引。编辑:由于@Shaggy,节省了1个字节。


星期几的格式是星期日-星期六还是星期一-星期日?
无知的体现,

@EmbodimentofIgnorance对不起,我知道我忘记了一些东西。(现在,该片段使用select使其变得更容易。)
Neil

@EmbodimentofIgnorance,星期日0在JS中。
毛茸茸的

哦。我不知道,我不太熟悉Javascript。
无知的体现,


0

TSQL,106个字节

DECLARE @ datetime='2019',@m int=3,@w char(2)='saturday',@p int=2

SELECT dateadd(wk,datediff(d,x,dateadd(m,@m-1,@)-1)/7,x)+@p*7FROM(SELECT
charindex(@w,' tuwethfrsasu')/2x)x

输出:

2019-03-09 00:00:00.000

试试看


0

科特林131 84字节

由于只有ASCII的代码和注释,因此47个字节。

输入:年,月号,周日号,周号

单行上的所有整数1到最大值。周日编号是1的星期日到7的星期六。主程序使Date类失去1900,并且在调用lambda之前,月和工作日从零开始而不是从1开始。您可以在输入文本框中输入参数以尝试自己输入日期。

输出:Date类实例。主程序显示结果如下:UTC 2019 Sat Mar 09 00:00:00

有一个扩展版本,带有注释的注释为那些希望了解更多信息的人解释了代码。

{y,m,d,w->val r=java.util.Date(y,m,7*w)
r.setDate(r.getDate()-(r.getDay()+7-d)%7)
r}

在线尝试!


1
74-使用与Scala和Groovy答案相同的方法


1
不再需要导入命令,所以这不是问题:P
ASCII格式,仅
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.