มันเป็นงานประจำปีใช่มั้ย


22

ให้หมายเลข1≤n≤365ส่งออกวันที่ n ของปีในรูปแบบ "วันเดือนปีที่" ตัวอย่างเช่นที่ได้รับ 1 คุณควรส่งออก "วันที่ 1 มกราคม" โดยไม่มี "ของ"

ปฏิทินเกรโกเรียนจะถูกนำมาใช้และโปรแกรมไม่ควรคิดเป็นปีอธิกสุรทินดังนั้นโปรแกรมของคุณไม่ควรส่งออก "29 กุมภาพันธ์" ในทุกกรณี สามารถใช้วิธีการใดก็ได้ตราบใดที่เป็นไปตามรูปแบบ "วันเดือนปีที่" ระบุไว้ก่อนหน้า โปรแกรมของคุณควรส่งออกอันดับที่ถูกต้องซึ่งหมายความว่ามันควรจะออก 1, 2, 3, ควร 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"
อดัม

9
โอ้โหไม่ยอมรับคำตอบอย่างรวดเร็ว โดยเฉพาะอย่างยิ่งไม่ใช่คำตอบที่ผิด !
อดัม

6
คุณควรจะเพิ่มอย่างน้อย11(11 THมกราคม) และ21(21 เซนต์มกราคม) กับกรณีการทดสอบ
Arnauld

1
และในขณะที่คุณกำลังแก้ไขกรณีทดสอบอาจระบุว่ารูปแบบกรณีทดสอบของคุณคืออะไร ผู้ตอบสองคนคิดว่า123=เป็นส่วนหนึ่งของผลลัพธ์ที่ต้องการ หรือเพียงแค่การแก้ไขกรณีทดสอบของคุณเพื่ออ่านสิ่งที่ชอบ365ให้31st December
อดัม

คำตอบ:


9

PHP ,38 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

คำอธิบาย

สร้างการประทับเวลาของยุคสำหรับวันที่ต้องการในปี 1970 (ไม่ใช่ปีอธิกสุรทิน) โดยการคูณday number * number of seconds per day(86400) อย่างไรก็ตามสิ่งนี้จะให้ผลหนึ่งวันที่สูงขึ้นดังนั้นแทนที่จะคูณด้วย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เคล็ดลับที่ยอดเยี่ยม! นอกจากนี้ยังบันทึกไบต์ในคำตอบ 05AB1E ของฉันเมื่อเปรียบเทียบกับสตริงที่บีบอัด"thstndrd"แยกออกเป็นส่วนขนาด 2 ( .•oθ2(w•2ô) ดังนั้นขอบคุณ :)
Kevin Cruijssen

1
นี่เป็นหนึ่งในโปรแกรมเยลลี่ที่ยาวที่สุดที่ฉันเคยเห็นมา
JAD

6

C # (Visual C # Interactive Compiler) , 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 ฉันได้รับ modulos ไม่เป็นระเบียบควรได้รับการแก้ไขแล้ว
ศูนย์รวมแห่งความไม่รู้

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

ลองออนไลน์!

ฮาร์ดโค้ดชื่อเดือนทั้งหมดซึ่งใช้พื้นที่ส่วนใหญ่ ผู้ชาย Perl 6 ต้องการตัวจัดรูปแบบวันที่ที่เหมาะสมจริงๆ


4

แฮ็ค, 115 59 39 ไบต์

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

เนื่องจาก @gwaugh ไปถึงทางออกเดียวกับฉันในขณะที่ฉันเล่นกอล์ฟฉันจึงโพสต์สิ่งนี้ใน Hack แทน :)


ว้าวจิตใจที่ดีคิดเหมือนกัน :) +1 ถึงคุณครับ!
640KB

@ gwaugh haha ​​ฉันไม่รู้ว่าฉันสามารถมีโปรแกรมระดับบนสุดได้ ฉันจะแก้ไขเหมืองที่จะทำให้มันระดับบนสุดเกินไปและหาวิธีที่จะได้รับดีกว่า SCOR อี ;-)
Ven

1
@gwaugh ทำการแฮ็คของฉันแทน
Ven

1
คุณอาจต้องการระบุพารามิเตอร์ปีที่ไม่ก้าวกระโดดในการmktime()โทรของคุณมิฉะนั้นจะส่งคืนผลลัพธ์ที่ไม่ถูกต้องหากทำงานในปีอธิกสุรทิน (ต้องทำเพื่อคำตอบของฉัน)
640KB

4

JavaScript (ES6),  117  113 ไบต์

บันทึกแล้ว 4 ไบต์ขอบคุณ@tsh

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
asgallant

ผมไม่แน่ใจว่าวิธีการจัดการแท็กภาษา nodejs แต่ดูเหมือนว่าการใช้จะทำงานกับการใช้0 "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 # Interactive คอมไพเลอร์) , 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

R , 158 134 ไบต์

-24 bytes @Nick Kennedy สำหรับการเล่น 'st', 'nd', 'rd', & 'th' ขอบคุณ!

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

ลองออนไลน์!


1
วิธีการเกี่ยวกับtio.run/##HYxBCsIwEEWvIoEwMzDVRldi40K8hQgdmwQV20oSd949xm4e/สำหรับ 134 ไบต์
Nick Kennedy

ใช่ฉันต้องเรียนรู้ให้`if`ดีขึ้น ขอบคุณ
CT Hall

3

MySQL, 47 45 42 ไบต์

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

1901 สามารถถูกแทนที่ด้วยปีใด ๆ ที่เป็น / ไม่ใช่ปีอธิกสุรทิน

แก้ไข: บันทึกไบต์ที่สองโดยการลบช่องว่างและอีกสามไบต์โดยการเปลี่ยนปี 1 ขอบคุณ@Embodyment ของอวิชชา


คุณสามารถลบช่องว่างระหว่าง1901, nและสตริงได้หรือไม่?
ศูนย์รวมแห่งความไม่รู้

@EmbodimentofIgnorance ใช่ฉันทำได้ขอบคุณ!
NicolasB

นอกจากนี้ทำไมไม่เปลี่ยนปี 1901 เป็นปีเช่น 1 1 ไม่ใช่ปีอธิกสุรทินและสั้นลง 3 ไบต์
ศูนย์รวมของความไม่รู้

@EmbodimentofIgnorance ทำและทำ :-)
NicolasB

3

05AB1E , 81 79 78 76 75 74 73 71 70 69 ไบต์

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

-9 ไบต์ขอบคุณที่@Grimy
-1 ไบต์ขอบคุณที่ @ JonathanAllan ของstandard theเคล็ดลับสำหรับการth,st,nd,rdที่เขาใช้ในคำตอบของเขาวุ้น

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบเป็นไปได้ทั้งหมด

คำอธิบาย:

•ΘÏ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
-2 bytes โดยใช้5в28 + สำหรับการบีบอัด: TIO
Grimmy

1
การใช้ S เป็นความคิดที่ดี -1 ไบต์อีกครั้ง: TIO
Grimmy

1
@Grimy ขอบคุณสำหรับ -1 ไบต์•EË7Óæ•S₂+แต่กอล์ฟ -3 ของคุณไม่ได้ทำงานอย่างน่าเสียดาย การจัดทำดัชนีจะล้อมรอบใน 05AB1E โดยอัตโนมัติดังนั้น5st,6nd,7rd,25st,26nd,27rd,29stจะผิด PS: ถ้ามันจะทำงานได้อาจจะเพิ่ม -1 :)
Kevin Cruijssen

1
-1 อีกครั้ง (โดยใช้ "มาตรฐาน th" แทน "มาตรฐาน" จะลบความต้องการออกÁ)
Grimmy

1
-1 ( •C.ñÒā•ถึง•ΘÏF•ºตัวเลขพิเศษไม่สำคัญ)
Grimmy

2

ทุบตี, 82 80 ไบต์

-2 ไบต์ต้องขอบคุณ @ 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


@ ASCII เท่านั้นลบใช่ 100s ในแต่ละวัน 100 * 365 = 36500s ซึ่งน้อยกว่าหนึ่งวัน (86400) ใช้งานได้กับ 86399 (ลบ 1s ต่อวัน)
Nahuel 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 /'

ลองออนไลน์! ลิงค์มีกรณีทดสอบ แก้ไข: บันทึกแล้ว 22 ไบต์ขอบคุณ @NahuelFouilleul คำอธิบาย:

date -d0-12-31\ $1day

คำนวณจำนวนวันหลังจากวันแรกก่อนปีที่ไม่ได้ก้าวกระโดด (น่าเศร้าที่คุณไม่สามารถทำการคำนวณวันที่สัมพันธ์@-1กันได้)

+%-dth\ %B|sed

เอาท์พุทวันของเดือน (ไม่นำศูนย์) th, และชื่อเต็มเดือน

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

แก้ไขปัญหาขึ้น1st, 2nd, 3rd, 21st, 22nd, และ23rd31st

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

เรียกคืนไป11th13th


ฉันเห็นคำตอบนี้หลังจากที่ฉันจะสามารถประหยัด18bytesใช้คำสั่ง sed หนึ่งยังsอยู่ในdaysสามารถถอดออกได้และ19ใน1969
Nahuel Fouilleul

@NahuelFouilleul สุดท้ายนี้ใช้ Bash-ism ดังนั้นควรโพสต์เป็นคำตอบแยกต่างหาก แต่ขอบคุณสำหรับเคล็ดลับอื่น ๆ !
Neil

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 มองหาพื้นที่ชั้นนำและมีการจัดการเป็นพิเศษสำหรับมัน)
Jonathan Allan


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-1 (1-Jan-2001) เพื่อจัดรูปแบบวันที่แทนที่จะใช้วิธีของ 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นี้ยังไม่จำเป็น
โจกษัตริย์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.