It's a yearly task, alright

22

2

Given a number 1≤n≤365, output the nth day of the year in "Day-numberth Month" format. For example, given 1, you should output "1st January", without "of".

The Gregorian calendar will be used and the program should not account for leap years, so your program should never output "29th February" in any circumstance. Any method can be used, as long as it follows the "Day-numberth Month" format mentioned before. Your program should also output ordinals correctly, meaning it should always output 1st, 2nd, 3rd, should 1, 2 or 3 respectively be the day numbers for any input. Leading spaces or other indentation are allowed.

This is code golf, so the shortest solution by characters wins.

Test cases:

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

Andrew

Posted 2019-03-13T15:24:09.937

Reputation: 2 067

What is "Day-number Month" format? I'm assuming it's "20th March"? Or is it "20 March"? That makes a pretty big difference, if you need ordinals. – Rɪᴋᴇʀ – 2019-03-13T15:28:51.553

4Also, do you need to force an error message on numbers > 365? Can the program just assume that's invalid input and it won't need to handle that? – Rɪᴋᴇʀ – 2019-03-13T15:29:20.913

Can we output native Date object that is builtin to our language, without converting it to a string? If we do have to convert it to a string, do we have to output in that exact format? – Embodiment of Ignorance – 2019-03-13T15:31:31.170

I believe input validation is not allowed in challenges, at least to a point.

– CG One Handed – 2019-03-13T15:37:55.527

5As not everyone is a native English speaker, you may want to add that day numbers 11, 12, and 13 get "th", numbers ending in "1" get "st", "2" get "nd", "3" get "rd", and all other get "th". – Adám – 2019-03-13T15:38:11.140

So is it March 1st or 1st March? – Draco18s no longer trusts SE – 2019-03-13T15:47:30.430

The latter, I messed up. – Andrew – 2019-03-13T15:48:12.917

9Whoa, don't accept answers so quickly. Especially not wrong answers! – Adám – 2019-03-13T16:10:00.370

Whoops. I guess I'll check every answer and wait for a shorter one. – Andrew – 2019-03-13T16:11:04.610

This is 14 bytes in Dyalog APL 18.0: 'Doo Mmmm'∘⎕DN but it hasn't been released yet ;-(

– Adám – 2019-03-13T16:20:49.180

When it releases, tell me. – Andrew – 2019-03-13T16:22:00.213

6You should add at least 11 (11th January) and 21 (21st January) to the test cases. – Arnauld – 2019-03-13T16:30:58.653

1And while you're editing test cases, maybe specify what exactly your test case format is. A couple of answerers have thought that 123= was part of the required output. Or simply edit your test cases to read something like: 365 gives 31st December – Adám – 2019-03-13T16:36:03.163

I'm quite surprised this has not been asked before. Good question. – akozi – 2019-03-15T17:41:37.613

Answers

11

PHP, 38 40 30 28 bytes

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

Try it online!

Run with php -nF input is from STDIN. Example (above script named 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

Explanation

Construct an epoch timestamp for the desired day in 1970 (conveniently not a leap year) by multiplying the day number * number of seconds per day (86400). However, this would yield one day higher so instead multiply by number of seconds in a day - 1 (86399) which for the range of input numbers (1≤n≤365) will result with the timestamp of the end of each correct day. Then just use PHP's built-in date formatting for output.

640KB

Posted 2019-03-13T15:24:09.937

Reputation: 7 149

why's the -n necessary? – Ven – 2019-03-13T16:23:30.613

@Ven it might not be in all cases, but just disables any settings in local php.ini that might create inconsistent behavior. – 640KB – 2019-03-13T16:31:03.780

6

C# (Visual C# Interactive Compiler), 115 113 109 98 bytes

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;

Thanks to @someone for saving 9 bytes

Try it online!

Embodiment of Ignorance

Posted 2019-03-13T15:24:09.937

Reputation: 7 014

1@KevinCruijssen I got the modulos out of order, should be fixed now. – Embodiment of Ignorance – 2019-03-14T14:59:49.730

.code.tio(2,22): error CS0165: Use of unassigned local variable 'p' It appears that the struct thing doesn't work. – JAD – 2019-03-15T12:45:04.590

var g=new DateTime().AddDays(n-1) works though – JAD – 2019-03-15T12:50:32.963

@JAD mistake on my part, fixed – Embodiment of Ignorance – 2019-03-15T15:00:47.497

110 bytes I think – my pronoun is monicareinstate – 2019-06-15T15:15:40.243

@someone Haven't been golfing in a while, but found an even shorter way – Embodiment of Ignorance – 2019-06-20T13:21:24.680

100 bytes by rearranging stuff to get rid of return, braces and a semicolon. – my pronoun is monicareinstate – 2019-06-20T13:55:03.987

@someone Got it down to 98. Just one more till I beat the Jelly answer! – Embodiment of Ignorance – 2019-06-20T14:03:03.620

@Embodiment there is a 77-byte Jelly answer there. – my pronoun is monicareinstate – 2019-06-20T14:13:08.380

@someone My mistake, I didn't see the other one – Embodiment of Ignorance – 2019-06-21T03:40:23.320

6

Jelly,  79 78  77 bytes

-1 fixing a bug :) (shouldn't pre-transpose to find index, should post-reverse, but then we can tail rather than head)
-1 using reflection (⁽©ṅ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

A full program which prints the result

Try it online!

How?

will update this later...

⁽©ṅ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

Jonathan Allan

Posted 2019-03-13T15:24:09.937

Reputation: 67 804

5The "standard the" trick is amazing. – Ven – 2019-03-15T09:17:11.253

I agree with @Ven, great trick! It also saved a byte in my 05AB1E answer in comparison to the compressed string "thstndrd" split into parts of size 2 (.•oθ2(w•2ô), so thanks. :)

– Kevin Cruijssen – 2019-03-15T11:03:42.317

1This has to be one of the longest Jelly programs I have ever seen. – JAD – 2019-03-15T12:41:40.520

5

Python 3.8 (pre-release), 112 bytes

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

Try it online!

Weirdly enough, I don't have to parenthesize d:=(t:=gmtime(~-x*86400), probably because the interpreter only checks if there are () characters around the assignment expression and not that the expression itself is parenthesized.

-2 thanks to gwaugh.
-5 thanks to xnor.

Erik the Outgolfer

Posted 2019-03-13T15:24:09.937

Reputation: 38 134

5

Perl 6, 166 161 bytes

{~(.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

Try it online!

Hardcodes all the month names, which takes up most of the space. Man, Perl 6 really needs a proper date formatter.

Jo King

Posted 2019-03-13T15:24:09.937

Reputation: 38 234

4

JavaScript (ES6),  117  113 bytes

Saved 4 bytes thanks to @tsh

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

Try it online!

Commented

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
  )                      //

Without date built-ins, 188 bytes

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]

Try it online!

Arnauld

Posted 2019-03-13T15:24:09.937

Reputation: 111 334

Fails for 11th,12th,13th of each month – Expired Data – 2019-03-13T16:04:16.690

1@ExpiredData Thanks for reporting this. Fixed now. – Arnauld – 2019-03-13T16:16:38.187

Ignore my comment, I made an ID10T error. – asgallant – 2019-03-13T21:10:55.277

I'm not sure how nodejs handle language tags, but it seems using 0 would work as using "en". And changing to toLocaleString would save 4 bytes. 110 bytes

– tsh – 2019-03-14T02:39:32.187

@tsh It seems that toLocaleString is using the system default settings when it's passed an unrecognized string or a numeric value. So, it can be anything. This parameter is basically ineffective on a TIO instance, because only English locales are installed anyway.

– Arnauld – 2019-03-14T08:17:23.697

4

Hack, 115 59 39 bytes

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

Since @gwaugh got to the same solution as mine while I was golfing, I'm posting this in Hack instead :).

Ven

Posted 2019-03-13T15:24:09.937

Reputation: 3 382

Wow, great minds think alike. :) +1 to you sir! – 640KB – 2019-03-13T16:17:46.370

@gwaugh haha, I didn't know I could just have a top-level program. I'll edit mine to make it top-level too, and find a way to get a better scor e;-) – Ven – 2019-03-13T16:18:52.467

1@gwaugh Made mine Hack instead. – Ven – 2019-03-13T16:26:44.793

1You'll probably want to specify a non-leap year parameter to your mktime() call otherwise it will return the wrong output if run on a leap year. (had to do to my answer). – 640KB – 2019-03-13T16:42:48.013

4

Smalltalk, 126 bytes

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

Leandro Caniglia

Posted 2019-03-13T15:24:09.937

Reputation: 181

1I don't know Smalltalk, but is this correct for 11th,12th,13th? If I read correctly you integer-divide the day by 10, but that would mean it would result in 11st,12nd,13rd, unless something else in the code fixes this while I'm unaware of it. – Kevin Cruijssen – 2019-03-14T10:58:37.263

@KevinCruijssen You are right. Thanks for calling my attention on this. I'll need to spend some more bytes to fix this. – Leandro Caniglia – 2019-03-14T16:19:06.187

1@KevinCruijssen, Done. Thanks again. – Leandro Caniglia – 2019-03-15T01:58:15.823

3

C# (Visual C# Interactive Compiler), 141 139 133 124 122 bytes

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

Thanks to Arnauld for faster method of removing 11,12,13th saving 4 bytes

Try it online!

Expired Data

Posted 2019-03-13T15:24:09.937

Reputation: 3 129

Using C# 8, this can be reduced to:

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

The interactive compiler doesn't seem to support changing its language level to "preview" at this time, though. – Arcanox – 2019-03-13T19:07:09.583

116 bytes – Embodiment of Ignorance – 2019-03-13T20:02:25.307

I'm pretty sure you have to add a semi-colon after the DataTime s – Embodiment of Ignorance – 2019-03-14T01:31:42.647

3

R, 158 134 bytes

-24 bytes @Nick Kennedy for golfing the 'st', 'nd', 'rd', & 'th'. Thanks!

f=format;paste0(a<-as.double(f(d<-as.Date(scan(,''),'%j'),'%e')),`if`((a-1)%%10>2|a%/%10==1,'th',c("st","nd","rd")[a%%10]),f(d,' %B'))

Try it online!

CT Hall

Posted 2019-03-13T15:24:09.937

Reputation: 591

Yes, I need to learn \if`` better. Thanks. – CT Hall – 2019-03-13T20:09:45.273

3

05AB1E, 81 79 78 76 75 74 73 71 70 69 bytes

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

-9 bytes thanks to @Grimy.
-1 byte thanks to @JonathanAllan's standard the trick for th,st,nd,rd, which he used in his Jelly answer.

Try it online or verify all possible test cases.

Explanation:

•ΘÏ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)

See this 05AB1E tip of mine to understand why:

  • (section How to use the dictionary?) ”……‚應…ä†ï€¿…Ë…ê†Ä…æ…Ì…Í” is "December January February March April May June July August September October November"
  • (section How to use the dictionary?) …thŠØ is "th standards"
  • (section How to compress large integers?) •ΘÏF• is 5254545

Kevin Cruijssen

Posted 2019-03-13T15:24:09.937

Reputation: 67 575

1

-2 bytes by using 5в28+ for compression: TIO

– Grimmy – 2019-03-14T14:35:26.600

@Grimy Thanks! Too bad •!₆%ζ3•S and •CoAc•5в are the same amount of bytes. Almost thought I could save another byte by using a compressed integer instead of integer list. :) – Kevin Cruijssen – 2019-03-14T15:05:50.223

1

Using S is a good idea, -1 byte again: TIO

– Grimmy – 2019-03-14T15:45:33.687

Further -3 bytes by using T‰`s<Ā* for the ordinal suffix: TIO

– Grimmy – 2019-03-14T16:41:18.613

1@Grimy Thanks for the -1 byte for •EË7Óæ•S₂+, but your -3 golf doesn't work unfortunately. Indexing automatically wraps around in 05AB1E, so the 5st,6nd,7rd,25st,26nd,27rd,29st will be wrong. PS: if it would have worked, could have been for an additional -1. :) – Kevin Cruijssen – 2019-03-14T18:48:33.813

-1 – Grimmy – 2019-03-15T14:44:27.353

1-1 again (using "th standards" instead of "standard the" removes the need for Á). – Grimmy – 2019-03-19T16:52:08.653

@Grimy Ah, standards instead of standard. Dangit, why didn't I think of that myself.. I had tried …th†¥ for "th standard", but it of course gave a problem removing the last character of the rd. Can't believe I haven't thought of checking if standards is in the dictionary.. And hmm, didn't even knew th was in the dictionary either.. – Kevin Cruijssen – 2019-03-19T17:11:05.177

-2. Turns out undelta is a built-in (), which saves some work. – Grimmy – 2019-03-19T17:17:40.887

1-1 (•C.ñÒā• to •ΘÏF•º, the extra digits don't matter) – Grimmy – 2019-03-20T12:51:01.697

1@Grimy Oh, that's a nice one. And you just keep on golfing, don't you? :D – Kevin Cruijssen – 2019-03-20T13:05:21.183

130%20%4‚ -> T‰ć≠*4š for -1. – Grimmy – 2019-11-18T13:14:43.813

@Grimmy Of course he's still not done. ;p Thanks! Nice alternative for the mapping to 0..4. – Kevin Cruijssen – 2019-11-18T13:35:43.797

3

MySQL, 47 45 42 bytes

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

1901 can be replaced with any year that was/is not a leap year.

Edit: saved two bytes by removing spaces and another three bytes by changing the year to 1, thanks to @Embodyment of Ignorance.

NicolasB

Posted 2019-03-13T15:24:09.937

Reputation: 131

Can you remove the spaces between 1901, n and the string? – Embodiment of Ignorance – 2019-03-14T15:31:20.690

@EmbodimentofIgnorance yes I can, thanks! – NicolasB – 2019-03-14T15:32:02.387

Also, why not replace 1901 with a year like 1? 1 isn't a leap year, and it's 3 bytes shorter – Embodiment of Ignorance – 2019-03-14T15:32:47.043

@EmbodimentofIgnorance done and done :-) – NicolasB – 2019-03-14T15:35:23.687

2

Jelly, 115 114 101 97 bytes

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

Try it online!

Long by Jelly standards, but done from first principles.

Thanks to @JonathanAllan for saving 13 bytes through better understanding of string compression.

Nick Kennedy

Posted 2019-03-13T15:24:09.937

Reputation: 11 829

“£ṢtẒ⁽ẹ½MḊxɲȧėAṅ ɓaṾ¥D¹ṀẏD8÷ṬØ»Ḳ¤ would save 13 (Compress.dictionary looks for a leading space and has special handling for it). – Jonathan Allan – 2019-03-14T12:13:28.300

2

Shell + coreutils, 112 90 bytes

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

Try it online! Link includes test cases. Edit: Saved 22 bytes thanks to @NahuelFouilleul. Explanation:

date -d0-12-31\ $1day

Calculate the number of day(s) after the first day preceding a non-leap year. (Sadly you can't do relative date calculations from @-1.)

+%-dth\ %B|sed

Output the day of month (without leading zero), th, and the full month name.

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

Fix up 1st, 2nd, 3rd, 21st, 22nd, 23rd and 31st.

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

Restore 11th to 13th.

Neil

Posted 2019-03-13T15:24:09.937

Reputation: 95 035

i saw this answer after mine, could save 18bytes using one sed command, also s in days can be removed, and 19 in 1969

– Nahuel Fouilleul – 2019-03-14T11:09:56.337

@NahuelFouilleul That last one uses a Bash-ism so should be posted as a separate answer, but thanks for the other tips! – Neil – 2019-03-14T11:49:02.430

2

bash, 82 80 bytes

-2 bytes thanks to @ASCII-only

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

TIO

bash +GNU date, 77 bytes

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

Nahuel Fouilleul

Posted 2019-03-13T15:24:09.937

Reputation: 5 582

80? – ASCII-only – 2019-03-14T11:35:54.510

@ASCII-only, yes subtracting 100s for each day, 100*365 = 36500s which is less than one day (86400), works also with 86399 (subtract 1s by day) – Nahuel Fouilleul – 2019-03-14T11:42:04.930

:/ still looks really long but haven't found a better way yet – ASCII-only – 2019-03-14T11:52:50.840

2

Google Sheets, 118 103 86 bytes

=day(A1+1)&mid("stndrdth",min(7,1+2*mod(mod(day(A1+1)-1,30),20)),2)&text(A1+1," mmmm")

I can't edit my comment so, here's a working version of the Google Sheets code.

Try it Online!

Zylviij

Posted 2019-03-13T15:24:09.937

Reputation: 390

1

APL(NARS), 235 chars, 470 bytes

{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 is the number that in base 4 can be summed to (12⍴28) for obtain the lenght of each month... test:

  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 

RosLuP

Posted 2019-03-13T15:24:09.937

Reputation: 3 036

1

Red, 124 bytes

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]]

Try it online!

Adds n - 1 days to 1-1-1 (1-Jan-2001) to form a date, than uses Arnauld's method to index into month suffixes. Too bad Red is 1-indexed, this requires additional tweaking. The good thing is that Red knows the names of the months :)

Galen Ivanov

Posted 2019-03-13T15:24:09.937

Reputation: 13 815

0

C (gcc), 174 155 bytes

i;char a[99],*b="thstndrd";f(long x){x--;x*=86400;strftime(a,98,"%d   %B\0",gmtime(&x));i=*a==49?0:a[1]-48;a[2]=b[i=i>3?0:i*2];a[3]=b[++i];x=*a==48?a+1:a;}

Try it online!

GPS

Posted 2019-03-13T15:24:09.937

Reputation: 341

-2

Python 3, 95 Bytes

Datetimed it :P

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

Try it online!

Kerosenic

Posted 2019-03-13T15:24:09.937

Reputation: 1

2This doesn't produce the ordinal suffixes, and has leading zeroes in the day number. The of is also unnecessary – Jo King – 2019-03-19T12:10:10.533