\begingroup

在美国,夏令时

编写执行以下操作的最短的完整程序、函数或代码片段:

  • 以年份作为输入。
  • 输出两个日期:DST 开始的日期和 DST 结束的日期。
  • 对于此挑战,0 或负年份的行为未定义。

测试用例

Year -> Start, End
2021 -> Mar 14, Nov 07
2022 -> Mar 13, Nov 06
2023 -> Mar 12, Nov 05
2024 -> Mar 10, Nov 03
2025 -> Mar 09, Nov 02
2026 -> Mar 08, Nov 01
2027 -> Mar 14, Nov 07
1    -> Mar 11, Nov 04
1234 -> Mar 12, Nov 05
9999 -> Mar 14, Nov 07

\endgroup

4

  • \begingroup
    不同,后者要求以特定格式输入当前年份的下一个开始/结束日期。此挑战不需要特定格式,需要 2 个输出值,并且需要年份作为输入。
    \endgroup


    – 

  • \begingroup
    鉴于月份是固定的并且年份是输入,我们可以将两天输出为整数吗?(特别是如果我们没有“日期”类型?)
    \endgroup


    – 

  • \begingroup
    可能值得注意的是,这并不是美国夏令时的时间,而是美国当前按照公历实施夏令时的时间。(例如,2001 年美国夏令时是从 4 月 1 日到 10 月 28 日;公元 11 月的第一个星期日是 6 日 [当然,当时还没有美国夏令时])
    \endgroup


    – 

  • 1
    \begingroup
    @JonathanAllan 输出 2 个整数是可以接受的。
    \endgroup


    – 


8 个回答
8

\begingroup

,59字节

[ <year> march 2 over november 1 [ sunday-of-month ] 2bi@ ]

[         ! a function
<year>    ! create timestamp from integer year input
march     ! change from jan 1 to march 1
2         ! push 2 to indicate we want second sunday
over      ! create a copy of the timestamp on top of stack
november  ! change from march 1 to november 1
1         ! push 1 to indicate we want first sunday

[ sunday-of-month ] 2bi@  ! change both timestamps to nth sunday of month

]         ! end function

\endgroup

3

  • \begingroup
    您是否需要包含USING(如import在 Python 中)?
    \endgroup


    – 

  • 1
    \begingroup
    @JonathanAllan
    \endgroup


    – 

  • \begingroup
    啊,有道理。
    \endgroup


    – 

\begingroup

,63 字节

lambda x:(w:=7-date(x,3,1).weekday(),w+7)
from datetime import*

输出是日期的元组(11 月日期,然后是 3 月日期)。对于 >9999 的年份,此方法无效。

\endgroup

\begingroup

,67 字节

y=>[(g=d=>(s=new Date(y+99,-1186,d)).getDay()?g(d-1):s)(14),g(252)]

虽然很蠢,但很管用

,60 字节

不支持部分古代年份(1-2位数字)

y=>[(g=d=>(s=new Date(y,2,d)).getDay()?g(d-1):s)(14),g(252)]

\endgroup

1

  • \begingroup

    \endgroup


    – 

\begingroup

 21 20  19

:4:“ıd¢‘_/__3%7+8,1

一个单子链接,它接受年份作为正整数,并输出三月和十一月的天数作为一对整数。

或者查看

如何?

:4:“ıd¢‘_/__3%7+8,1 - Link: integer Year
:4                  - {Year} integer divide by four
  :                 - integer divide by:
   “ıd¢‘            -   code-page indices = [25, 100, 1]
                        -> [Year//100, Year//400, Year//4]
        _/          - reduce by subtraction
          _         - subtract {Year}
           _3       - subtract three
             %7     - modulo seven
                      -> Delta = (Year//100 - Year//400 - Year//4 - Year - 3) % 7
               +8,1 - add [8, 1]
                      -> [8+Delta, 1+Delta]

\endgroup

\begingroup

-MDate::Manip -a 5,55 字节

say ParseDate"$_@F"for"2nd sun in mar","1st sun in nov"

\endgroup

1

  • 1
    \begingroup
    1000 年以下无效
    \endgroup


    – 

\begingroup

+ 日期,45 字节

let n=8-`date +%u -d $1/3/8`;echo $((7+n)) $n

链接包含测试用例。说明:给出从表示星期一到表示星期日+%u的数字,减去表示 11 月第一个星期日的日期;加上 表示 3 月第二个星期日的日期。1787

遗憾的是,GNUdate对工作日的支持似乎仅适用于相对于今天的日期。

\endgroup

\begingroup

,30字节

NθI⁺⟦⁸¦¹⟧﹪⁻⁺⁴÷θ¹⁰⁰⁺⁺÷θ⁴⁰⁰÷θ⁴θ⁷

链接为代码的详细版本。说明:

Nθ                              Input year as a number
            ⁴                   Literal integer `4`
           ⁺                    Plus
              θ                 Input year
             ÷                  Integer divided by
               ¹⁰⁰              Literal integer `100`
          ⁻                     Subtract
                     θ          Input year
                    ÷           Integer divided by
                      ⁴⁰⁰       Literal integer `400`
                   ⁺            Plus
                          θ     Input year
                         ÷      Integer divided by
                           ⁴    Literal integer `4`
                  ⁺             Plus
                            θ   Input year
         ﹪                      Modulo
                             ⁷  Literal integer `7`
   ⁺                            Vectorised add
     ⁸                          Literal integer `8`
       ¹                        Literal integer `1`
    ⟦   ⟧                       Make into list
  I                             Cast to string
                                Implicitly print

\endgroup

\begingroup

3.8,46 字节

lambda y:[n:=(y//100-y//400-y//4-y-3)%7+8,n-7]

一个未命名的函数,接受年份并返回三月和十一月两天的列表。

\endgroup