这是一项年度任务,好


22

给定数字1≤n≤365,以“天数月”格式输出一年中的第n天。例如,给定1,您应输出“ 1st January”,不带“ of”。

将使用公历,该程序不应计入leap年,因此您的程序在任何情况下均不应输出“ 2月29日”。只要遵循前面提到的“日数月”格式,就可以使用任何方法。您的程序还应该正确输出序号,这意味着它应该始终输出1st,2nd,3rd,应该分别将1、2或3作为任何输入的日期。允许前导空格或其他缩进。

这是代码高尔夫,所以最短的解决方案就是胜出。

测试用例:

1 gives 1st January
2 gives 2nd January
3 gives 3rd January
365 gives 31st December
60 gives 1st March
11 gives 11th January

4
另外,是否需要在数字> 365上强制显示错误消息?程序是否可以仅假定输入无效并且不需要处理?
Rɪᴋᴇʀ

5
由于不是每个人都是说英语的人,因此您可能需要将数字11、12和13加上“ th”,以“ 1”结尾的数字得到“ st”,“ 2”得到“ nd”,“ 3”获得“ rd”,所有其他获得“ th”。
阿达姆(Adám)

9
哇,不要这么快就接受答案。特别是没有错误的答案!
阿达姆(Adám)

6
您应该至少在测试用例中添加11(1月11 )和21(1月21 )。
Arnauld 13:30

1
而且,当您编辑测试用例时,也许可以指定确切的测试用例格式。一些回答者认为这123=是必需输出的一部分。:或者干脆修改测试用例阅读像365给人31st December
亚当

Answers:


9

PHP38 40 30 28字节

<?=date("jS F",86399*$argn);

在线尝试!

php -nF输入来自的运行STDIN。示例(脚本名为y.php):

$ echo 1|php -nF y.php
1st January
$ echo 2| php -nF y.php
2nd January
$ echo 3| php -nF y.php
3rd January
$ echo 11|php -nF y.php
11th January
$ echo 21|php -nF y.php
21st January
$ echo 60|php -nF y.php
1st March
$ echo 365|php -nF y.php
31st December

说明

通过将day number * number of seconds per day(86400)乘以构造1970年所需日期(通常不是a年)的纪元时间戳。但是,这会产生高出一天的结果,因此乘以number of seconds in a day - 1(86399),对于输入数字范围(1≤n≤365),将得到每正确一天结束时的时间戳记。然后,只需使用PHP的内置日期格式进行输出即可。


为什么有-n必要?
Ven

@Ven可能并非在所有情况下都有效,而只是禁用了本地php.ini中可能造成不一致行为的任何设置。
640KB

6

果冻 79 78  77 字节

-1修复错误:)(不应预先转置以找到索引,而应反向后转,但我们可以尾部而不是头部)
-1使用反射⁽©ṅB+30_2¦2-> ⁽0ṗb4+28m0

⁽0ṗb4+28m0SRṁRƲœiµṪȮ%30%20«4ị“nḄƲf⁷»s3¤Ṗ,ị“£ṢtẒ⁽ẹ½MḊxɲȧėAṅ ɓaṾ¥D¹ṀẏD8÷ṬØ»Ḳ¤$K

完整的程序可以打印结果

在线尝试!

怎么样?

稍后会更新...

⁽©ṅB+30_2¦2SRṁRƲZœiµḢȮ%30%20«4ị“nḄƲf⁷»s3¤Ṗ,ị“...»Ḳ¤$K - Main Link: integer, n
⁽©ṅB+30_2¦2SRṁRƲZœi - f(n) to get list of integers, [day, month]
⁽©ṅ                 - compressed literal 2741
   B                - to a list of binary digits -> [ 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1]
    +30             - add thirty                    [31,30,31,30,31,30,31,31,30,31,30,31]
         ¦          - sparse application...
        2           - ...to indices: [2]
       _  2         - ...action: subtract two       [31,28,31,30,31,30,31,31,30,31,30,31]
               Ʋ    - last four links as a monad - i.e. f(x):
           S        -   sum x                       365
            R       -   range                       [1..365]
              R     -   range x (vectorises)        [[1..31],[1..28],...]
             ṁ      -   mould like                  [[1..31],[32..59],...]
                Z   - transpose                     [[1,32,...],[2,33,...],...]
                 œi - 1st multi-dimensional index of n  -> [day, month]

µḢȮ%30%20«4ị“nḄƲf⁷»s3¤Ṗ,ị“...»Ḳ¤$K - given [day, month] format and print
µ                                  - start a new monadic chain - i.e. f(x=[day, month])
 Ḣ                                 - head -- get the day leaving x as [month])
  Ȯ                                - print it (with no newline) and yield it
   %30                             - modulo by thirty
      %20                          - modulo by twenty
         «4                        - minimum of that and four
                     ¤             - nilad followed by link(s) as a nilad:
            “nḄƲf⁷»                -   dictionary words "standard"+" the" = "standard the"
                   s3              -   split into threes = ["sta","nda","rd ","the"]
           ị                       - index into
                      Ṗ            - remove rightmost character
                               ¤   - nilad followed by link(s) as a nilad:
                         “...»     -   dictionary words "January"+" February"+...
                              Ḳ    -   split at spaces = ["January","February",...]
                        ị          - index into (vectorises across [month])
                       ,           - pair                  e.g. ["th", ["February"]]
                                K  - join with spaces           ["th ", "February"]
                                   - print (implicitly smashes)   th February

4
“标准的”把戏是惊人的。
Ven

我同意@Ven的绝妙技巧!与将压缩字符串分成大小为2()的部分相比,它还在我的05AB1E答案中节省了一个字节,所以谢谢。:)"thstndrd".•oθ2(w•2ô
Kevin Cruijssen

1
这必须是我见过的最长的果冻程序之一。
JAD

6

C#(Visual C#中交互式编译器)115个 113 109 98字节

g=>$"{f=(g=p.AddDays(g-1)).Day}{"tsnr"[f=f%30%20<4?f%10:0]}{"htdd"[f]} {g:MMMM}";DateTime p;int f;

感谢@someone节省了9个字节

在线尝试!


1
@KevinCruijssen我弄错了模数,应该立即修复。
的无知的体现

.code.tio(2,22): error CS0165: Use of unassigned local variable 'p'似乎struct东西不起作用。
JAD

var g=new DateTime().AddDays(n-1)尽管有效
JAD

我的@JAD错误已修复
无知的体现


5

Python 3.8(预发布),112字节

lambda x:str(d:=(t:=gmtime(x*86399)).tm_mday)+'tsnrhtdd'[d%5*(d%30%20<4)::4]+strftime(' %B',t)
from time import*

在线尝试!

奇怪的是,我不必加上括号d:=(t:=gmtime(~-x*86400),这可能是因为解释器仅检查()赋值表达式周围是否存在字符,而不是对表达式本身进行括号括起来。

-2感谢gwaugh
-5感谢xnor


5

Perl 6的166个 161字节

{~(.day~(<th st nd rd>[.day%30%20]||'th'),<January February March April May June July August September October November December>[.month-1])}o*+Date.new(1,1,1)-1

在线尝试!

对所有月份名称进行硬编码,这将占用大部分空间。伙计,Perl 6确实需要适当的日期格式。


4

哈克115 59 39字节

$x==>date("jS F",mktime(0,0,0,1,$x));

由于@gwaugh在打高尔夫球时获得了与我相同的解决方案,因此我将其发布在Hack中:)。


哇,好主意都一样。:)先生+1!
640KB

@gwaugh哈哈,我不知道我可以只拥有一个顶级程序。我将修改我的,使其顶级太,并找到一种方式来获得更好的SCORë;-)
法师

1
@gwaugh改为我的Hack。
Ven

1
您可能需要为mktime()呼叫指定一个非-年参数,否则,如果在a年上运行,它将返回错误的输出。(必须回答我的问题)。
640KB

4

的JavaScript(ES6), 117个  113字节

@tsh节省了4个字节

d=>(n=(d=new Date(1,0,d)).getDate())+([,'st','nd','rd'][n%30%20]||'th')+' '+d.toLocaleString('en',{month:'long'})

在线尝试!

已评论

d =>                     // d = input day
  ( n =                  //
    ( d =                // convert d to
      new Date(1, 0, d)  //   a Date object for the non leap year 1901
    ).getDate()          // save the corresponding day of month into n
  ) + (                  //
    [, 'st', 'nd', 'rd'] // ordinal suffixes
    [n % 30 % 20]        // map { 1, 2, 3, 21, 22, 23, 31 } to { 'st', 'nd', 'rd' }
    || 'th'              // or use 'th' for everything else
  ) + ' ' +              // append a space
  d.toLocaleString(      // convert d to ...
    'en',                // ... the English ...
    { month: 'long' }    // ... month name
  )                      //

没有日期内置,188字节

f=(d,m=0)=>d>(k=31-(1115212>>m*2&3))?f(d-k,m+1):d+([,'st','nd','rd'][d%30%20]||'th')+' '+`JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecember`.match(/.[a-z]*/g)[m]

在线尝试!


每月11日,12日,13日失败
过期数据

1
@ExpiredData感谢您举报。立即修复。
Arnauld

忽略我的评论,我犯了一个ID10T错误。
令人敬畏的

我不确定nodejs如何处理语言标签,但是似乎using 0可以像using那样工作"en"。并更改为toLocaleString将节省4个字节。110字节
tsh

@tsh toLocaleString传递了无法识别的字符串或数值时,似乎正在使用系统默认设置。因此,可以是任何东西。此参数在TIO实例上基本上无效,因为无论如何都只安装英语语言环境
Arnauld

4

Smalltalk,126个字节

d:=Date year:1day:n.k:=m:=d dayOfMonth.10<k&(k<14)and:[k:=0].o:={#st.#nd.#rd}at:k\\10ifAbsent:#th.m asString,o,' ',d monthName

1
我不认识Smalltalk,但这对11th,12th,13th吗?如果我没看错,则可以将日期除以10的整数,但这将导致结果为11st,12nd,13rd,除非代码中的其他内容在我不知道的情况下得以解决。
Kevin Cruijssen

@KevinCruijssen你是对的。感谢您对此的关注。我需要花更多的字节来解决这个问题。
Leandro Caniglia

1
@KevinCruijssen,完成。再次感谢。
Leandro Caniglia

3

C#(Visual C#中交互式编译器)141个 139 133 124 122字节

a=>{var d=s.AddDays(a-1);int x=d.Day,m=x%30%20;return x+"thstndrd".Substring(m<4?m*2:0,2)+d.ToString(" MMMM");};DateTime s

感谢Arnauld提供了更快的删除11,12,13th的方法,节省了4个字节

在线尝试!


使用C#8,这可以简化为: a=>{var d=s.AddDays(a-1);int x=d.Day,m=x%30%20;return x+"thstndrd"[(m<4?m*2:0)..2]+$" {d:MMMM}";};DateTime s 但是,交互式编译器目前似乎不支持将其语言级别更改为“预览”。
Arcanox


我很确定您必须在DataTime s
无知


3

MySQL,47 45 42字节

SELECT DATE_FORMAT(MAKEDATE(1,n),"%D %M")

1901年可以用任何曾经/不是a年的年份代替。

编辑:感谢@Embodyment of Ignorance,通过删除空格节省了两个字节,将年份更改为1则节省了另外三个字节。


您可以删除和之间的空格1901, n吗?
无知的体现

@EmbodimentofIgnorance是的,我可以,谢谢!
NicolasB

另外,为什么不将1901替换为1?1不是a年,它短了3个字节
无知的体现

@EmbodimentofIgnorance完成了:-)
NicolasB

3

05AB1E81 79 78 76 75 74 73 71 70 69 字节

•ΘÏF•ºS₂+.¥-D0›©ÏθDT‰ć≠*4šß„—ÊØ3ôsè¨ð”……‚應…ä†ï€¿…Ë…ê†Ä…æ…Ì…Í”#®OèJ

-9个字节,感谢@Grimy
-1字节感谢@JonathanAllan的standard thetrick俩th,st,nd,rd,他在Jelly答案中使用了trick

在线尝试验证所有可能的测试用例

说明:

•ΘÏF        # Push compressed integer 5254545
     º       # Mirror it vertically: 52545455454525
      S      # Converted to a list of digits: [5,2,5,4,5,4,5,5,4,5,4,5,2,5]
       ₂+    # And 26 to each: [31,28,31,30,31,30,31,31,30,31,30,31,28,31]
             # (the additional trailing 28,31 won't cause any issues)
           # Undelta this list (with automatic leading 0):
             #  [0,31,59,90,120,151,181,212,243,273,304,334,365,393,424]
  -          # Subtract each from the (implicit) input-integer
   D0       # Duplicate the list, and check for each if it's positive (> 0)
      ©      # Store the resulting list in the register (without popping)
       Ï     # Only leave the values at those truthy indices
        θ    # And get the last value from the list, which is our day
D            # Duplicate this day
 T          # Take the divmod-10 of this day: [day//10, day%10]
   ć         # Extract the head; pop and push the remainder-list and head: [day%10], day//10
            # Check whether the day//10 is NOT 1 (0 if day//10 == 1; 1 otherwise)
     *       # Multiply that by the [day%10] value
      4š     # Prepend a 4 to this list
        ß    # Pop and push the minimum of the two (so the result is one of [0,1,2,3,4],
             # where the values are mapped like this: 1..3→1..3; 4..9→4; 10..19→0; 20..23→0..3; 24..29→4; 30,31→0,1)
 thŠØ       # Push dictionary string "th standards"
      3ô     # Split it into parts of size 3: ["th ","sta","nda","rds"]
        sè   # Swap and index the integer into this list (4 wraps around to index 0)
          ¨  # And remove the trailing character from this string
ð            # Push a space " "
”……‚應…ä†ï€¿…Ë…ê†Ä…æ…Ì…Í”
             # Push dictionary string "December January February March April May June July August September October November"
 #           # Split on spaces
  ®          # Push the list of truthy/falsey values from the register again
   O         # Get the amount of truthy values by taking the sum
    è        # Use that to index into the string-list of months (12 wraps around to index 0)
J            # Join everything on the stack together to a single string
             # (and output the result implicitly)

请参阅我的05AB1E技巧以了解原因:

  • (部分如何使用字典?”……‚應…ä†ï€¿…Ë…ê†Ä…æ…Ì…Í”"December January February March April May June July August September October November"
  • (部分如何使用字典?…thŠØ"th standards"
  • (部分如何压缩大整数?•ΘÏF•5254545

1
通过使用5в28+进行压缩可得到-2字节:TIO
Grimmy

1
使用S是一个好主意,再次为-1个字节:TIO
Grimmy

1
@Grimy感谢您提供-1个字节•EË7Óæ•S₂+,但是不幸的是您的-3 golf不能正常工作。索引会在05AB1E中自动回绕,因此5st,6nd,7rd,25st,26nd,27rd,29st将是错误的。PS:如果可以的话,可以再加上-1。:)
凯文·克鲁伊森

1
再次为-1(使用“ th standard”代替“ standard the”消除了对的需要Á)。
格里米

1
-1•C.ñÒā••ΘÏF•º,多余的数字无关紧要)
Grimmy

2

bash,82个 80字节

-2个字节,仅@ASCII

a=(th st nd rd);set `printf "%(%e %B)T" $[$1*86399]`;echo $1${a[$1%30%20]-th} $2

蒂奥

bash + GNU日期,77个字节

a=(th st nd rd);set `date -d@$[$1*86399] +%e\ %B`;echo $1${a[$1%30%20]-th} $2


@ ASCII只,是减去每天100S,100 * 365 = 36500s小于一天(86400),(按天减法1S)还可以与86399
纳乌艾尔乌Fouilleul

:/看起来确实很长,但是还没有找到更好的方法
仅使用ASCII

2

Shell + coreutils,112个 90字节

date -d0-12-31\ $1day +%-dth\ %B|sed 's/1th/1st/;s/2th/2nd/;s/3th/3rd/;s/\(1.\).. /\1th /'

在线尝试!链接包括测试用例。编辑:由于@NahuelFouilleul,节省了22个字节。说明:

date -d0-12-31\ $1day

计算非-年之前的第一天之后的天数。(遗憾的是,您无法从中进行相对日期计算@-1。)

+%-dth\ %B|sed

输出月份中的日期(不带前导零)th,和月份的全名。

's/1th/1st/;s/2th/2nd/;s/3th/3rd/;

修复了1st2nd3rd21st22nd23rd31st

s/\(1.\).. /\1th /'

恢复11th13th


我看到这个答案后我的,可以节省18bytes使用一个sed的命令,还sdays可以被移除,并191969
纳乌艾尔乌Fouilleul

@NahuelFouilleul最后一个人使用了Bash主义,因此应该作为一个单独的答案发布,但是感谢其他提示!
尼尔

2

果冻115个 114 101 97字节

%30%20¹0<?4Ḥ+ؽị“thstndrd”ṭ
“5<Ḟ’b4+28ÄŻ_@µ>0T,>0$ƇZṪµ1ịị“£ṢtẒ⁽ẹ½MḊxɲȧėAṅ ɓaṾ¥D¹ṀẏD8÷ṬØ»Ḳ¤,2ịÇƊṚK

在线尝试!

长期以果冻为标准,但是从第一原则开始的。

感谢@JonathanAllan通过更好地理解字符串压缩节省了13个字节。


“£ṢtẒ⁽ẹ½MḊxɲȧėAṅ ɓaṾ¥D¹ṀẏD8÷ṬØ»Ḳ¤将节省13(Compress.dictionary寻找领先空间并对其进行了特殊处理)。
乔纳森·艾伦


1

红色,124字节

func[n][d: 1-1-1 + n - 1[rejoin[d/4 either 5 > t: d/4 % 30 % 20[pick[th st nd rd]t + 1]['th]]pick system/locale/months d/3]]

在线尝试!

n在1-1-1(2001年1月1日)上加上-1天以形成日期,然后使用Arnauld的方法索引月份后缀。太糟糕了,红色是1索引的,这需要额外的调整。好消息是Red知道月份的名称:)


1

APL(NARS),235个字符,470个字节

{k←↑⍸0<w←+\v←(1-⍵),(12⍴28)+13561787⊤⍨12⍴4⋄k<2:¯1⋄d←1+v[k]-w[k]⋄(⍕d),({d∊11..13:'th'⋄1=10∣d:'st'⋄2=10∣d:'nd'⋄3=10∣d:'rd'⋄'th'}),' ',(k-1)⊃(m≠' ')⊂m←'January February March April May June July August September October November December'}

13561787是基数4可以累加为(12⍴28)的数字以获得每月的长度...测试:

  f←{k←↑⍸0<w←+\v←(1-⍵),(12⍴28)+13561787⊤⍨12⍴4⋄k<2:¯1⋄d←1+v[k]-w[k]⋄(⍕d),({d∊11..13:'th'⋄1=10∣d:'st'⋄2=10∣d:'nd'⋄3=10∣d:'rd'⋄'th'}),' ',(k-1)⊃(m≠' ')⊂m←'January February March April May June July August September October November December'}     
  ⊃f¨1 2 3 365 60 11
1st January  
2nd January  
3rd January  
31st December
1st March    
11th January 


-2

Python 3,95字节

日期:P

from datetime import *;f=lambda s:(datetime(2019,1,1)+timedelta(days=s-1)).strftime("%d of %B")

在线尝试!


2
这不会产生序数后缀,并且在天数中具有前导零。这of也是不必要的
Jo King
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.