To coroczne zadanie, w porządku


22

Biorąc pod uwagę liczbę 1 ≤ n ≤ 365, wyślij n-ty dzień roku w formacie „Dzień-miesiąc”. Na przykład, biorąc pod uwagę 1, powinieneś wypisać „1 stycznia”, bez „z”.

Zostanie użyty kalendarz gregoriański, a program nie powinien uwzględniać lat przestępnych, więc twój program nigdy nie powinien wypisywać „29 lutego” w żadnych okolicznościach. Można zastosować dowolną metodę, o ile jest ona zgodna ze wspomnianym wcześniej formatem „Dzień-miesiąc”. Twój program powinien również poprawnie wypisywać liczby porządkowe, co oznacza, że ​​zawsze powinien wypisywać odpowiednio 1., 2., 3., odpowiednio 1, 2 lub 3 liczby dzienne dla każdego wejścia. Dopuszczalne są spacje wiodące lub inne wcięcia.

To jest golf golfowy, więc wygrywa najkrótsze rozwiązanie postaci.

Przypadki testowe:

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
Czy musisz też wymusić komunikat o błędzie dla numerów> 365? Czy program może po prostu założyć, że to nieprawidłowe dane wejściowe i nie będzie musiał tego obsługiwać?
Rɪᴋᴇʀ

5
Ponieważ nie wszyscy są rodzimymi użytkownikami języka angielskiego, możesz dodać, że dnia 11, 12 i 13 otrzymują „th”, liczby kończące się na „1” get „st”, „2” get „nd”, „3” dostać „rd”, a wszystkie pozostałe dostać „th”.
Adám

9
Zaraz, nie przyjmuj odpowiedzi tak szybko. Szczególnie złe odpowiedzi!
Adám

6
Należy dodać co najmniej 11(11 th stycznia) i 21(21 st stycznia) do przypadków testowych.
Arnauld

1
Podczas edytowania przypadków testowych możesz podać dokładny format przypadków testowych. Kilku ankieterów uważało, że 123=to część wymaganej wydajności. Lub po prostu edytuj przypadki testowe, aby przeczytać coś w stylu: 365daje31st December
Adám

Odpowiedzi:


9

PHP ,38 40 30 28 bajtów

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

Wypróbuj online!

Uruchom z danymi php -nFwejściowymi pochodzi z STDIN. Przykład (powyższy skrypt o nazwie 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

Wyjaśnienie

Zbuduj znacznik czasu epoki dla pożądanego dnia w 1970 r. (Dogodnie nie rok przestępny), mnożąc day number * number of seconds per day(86400). Dałoby to jednak o jeden dzień wyższą wartość, dlatego pomnożymy ją przez number of seconds in a day - 1(86399), co dla zakresu liczb wejściowych (1 ≤ n ≤365) spowoduje oznaczenie czasu końca każdego poprawnego dnia. Następnie skorzystaj z wbudowanego formatowania daty PHP dla danych wyjściowych.


dlaczego jest to -nkonieczne?
Ven

@Ven może nie być we wszystkich przypadkach, ale po prostu wyłącza wszelkie ustawienia w lokalnym php.ini, które mogą powodować niespójne zachowanie.
640 KB

6

Galaretka ,  79 78  77 bajtów

-1 naprawiający błąd :) (nie powinien wstępnie transponować w celu znalezienia indeksu, powinien być po odwróceniu, ale wtedy możemy ogonić zamiast głowy)
-1 używając odbicia ( ⁽©ṅ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

Pełny program, który drukuje wynik

Wypróbuj online!

W jaki sposób?

zaktualizuje to później ...

⁽©ṅ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
„Standardowa sztuczka” jest niesamowita.
Ven

Zgadzam się z @Ven , świetna sztuczka! Zapisał również bajt w mojej odpowiedzi 05AB1E w porównaniu ze skompresowanym łańcuchem "thstndrd"podzielonym na części o rozmiarze 2 ( .•oθ2(w•2ô), więc dzięki. :)
Kevin Cruijssen

1
To musi być jeden z najdłuższych programów Jelly, jakie kiedykolwiek widziałem.
JAD

6

C # (interaktywny kompilator Visual C #) , 115 113 109 98 bajtów

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;

Dzięki @someone za oszczędność 9 bajtów

Wypróbuj online!


1
@KevinCruijssen Mam moduły niesprawne, należy je teraz naprawić.
Wcielenie nieznajomości

.code.tio(2,22): error CS0165: Use of unassigned local variable 'p'Wygląda na to, że struct nie działa.
JAD

var g=new DateTime().AddDays(n-1)działa jednak
JAD

@JAD błąd z mojej strony, naprawiony
of Ignorance


5

Python 3.8 (wersja wstępna) , 112 bajtów

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

Wypróbuj online!

Co dziwne, nie muszę nawiasować d:=(t:=gmtime(~-x*86400), prawdopodobnie dlatego, że interpreter sprawdza tylko, czy ()wokół wyrażenia przypisania są znaki, a nie, czy samo wyrażenie jest w nawiasie.

-2 dzięki gwaugh .
-5 dzięki xnor .


5

Perl 6 , 166 161 bajtów

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

Wypróbuj online!

Twarde kody wszystkich nazw miesięcy, które zajmują większość miejsca. Człowieku, Perl 6 naprawdę potrzebuje odpowiedniego formatyzatora daty.


4

Hack, 115 59 39 bajtów

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

Ponieważ @gwaugh doszedł do tego samego rozwiązania, co moje, kiedy grałem w golfa, zamiast tego zamieszczam to w Hack :).


Wow, wielkie umysły myślą podobnie. :) +1 do pana!
640 KB

@gwaugh haha, nie wiedziałem, że mogę mieć program na najwyższym poziomie. Zedytuję mój, aby był na najwyższym poziomie, i znajdę sposób, aby uzyskać lepszy wynik ;-)
Ven

1
@gwaugh Zamiast tego zrobił mój Hack.
Ven

1
Prawdopodobnie zechcesz określić parametr swojego roku przestępnego w swoim mktime()wywołaniu, w przeciwnym razie zwróci on nieprawidłowy wynik, jeśli zostanie uruchomiony w roku przestępnym. (musiałem zrobić z moją odpowiedzią).
640 KB

4

JavaScript (ES6),  117  113 bajtów

Zaoszczędź 4 bajty dzięki @tsh

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

Wypróbuj online!

Skomentował

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

Bez wbudowanej daty, 188 bajtów

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]

Wypróbuj online!


Nie działa na 11, 12, 13 każdego miesiąca
Data wygasła

1
@ExpiredData Dziękujemy za zgłoszenie tego. Naprawiono teraz.
Arnauld

Zignoruj ​​mój komentarz, popełniłem błąd ID10T.
asgallant

Nie jestem pewien, w jaki sposób nodejs radzi sobie z tagami językowymi, ale wydaje się, że użycie 0będzie działało jak użycie "en". A zmiana na toLocaleStringoszczędziłaby 4 bajty. 110 bajtów
tsh

@tsh Wygląda na toLocaleStringto, że korzysta z domyślnych ustawień systemu, gdy przekazuje nierozpoznany ciąg znaków lub wartość liczbową. Może to być wszystko. Ten parametr jest zasadniczo nieskuteczny w instancji TIO, ponieważ i tak instalowane są tylko angielskie lokalizacje .
Arnauld

4

Smalltalk, 126 bajtów

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
Nie znam Smalltalk, ale czy to prawda 11th,12th,13th? Jeśli poprawnie odczytam, podziel liczbę całkowitą przez 10, ale to by oznaczało, że to by się zakończyło 11st,12nd,13rd, chyba że coś innego w kodzie naprawi to, gdy nie jestem tego świadomy.
Kevin Cruijssen

@KevinCruijssen Masz rację. Dziękuję za zwrócenie mojej uwagi na to. Będę musiał wydać więcej bajtów, aby to naprawić.
Leandro Caniglia

1
@KevinCruijssen, Gotowe. Dzięki jeszcze raz.
Leandro Caniglia

3

C # (interaktywny kompilator Visual C #) , 141 139 133 124 122 bajtów

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

Dzięki Arnauldowi za szybszą metodę usuwania 11,12,13-tego oszczędzania 4 bajtów

Wypróbuj online!


Używając C # 8, można to sprowadzić do: 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 Kompilator interaktywny nie obsługuje obecnie zmiany poziomu języka na „podgląd”.
Arcanox


Jestem prawie pewien, że musisz dodać średnik poDataTime s
Embodiment of Ignorance


3

MySQL, 47 45 42 bajtów

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

Rok 1901 można zastąpić dowolnym rokiem, który był / nie jest rokiem przestępnym.

Edycja: zapisano dwa bajty, usuwając spacje i kolejne trzy bajty, zmieniając rok na 1, dzięki @Embodyment Ignorance .


Czy możesz usunąć spacje między 1901, ni ciąg?
Wcielenie nieznajomości

@EmbodimentofIgnorance tak mogę, dziękuję!
NicolasB

A dlaczego nie zastąpić 1901 rokiem takim jak 1? 1 nie jest rokiem przestępnym, a jest o 3 bajty krótszy
Embodiment of Ignorance

@EmbodimentofIgnorance zrobione i zrobione :-)
NicolasB

3

05AB1E , 81 79 78 76 75 74 73 71 70 69 69 bajtów

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

-9 bajtów dzięki @Grimy .
-1 bajt dzięki dzięki standard thesztuczce @ JonathanAllan th,st,nd,rd, której użył w swojej odpowiedzi na galaretkę .

Wypróbuj online lub sprawdź wszystkie możliwe przypadki testowe .

Wyjaśnienie:

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

Zobacz moją wskazówkę 05AB1E, aby zrozumieć, dlaczego:

  • (sekcja Jak korzystać ze słownika? ) ”……‚應…ä†ï€¿…Ë…ê†Ä…æ…Ì…Í”jest"December January February March April May June July August September October November"
  • (sekcja Jak korzystać ze słownika? ) …thŠØjest"th standards"
  • (sekcja Jak kompresować duże liczby całkowite? ) •ΘÏF•jest5254545

1
-2 bajty przy użyciu 5в28 + do kompresji: TIO
Grimmy

1
Używanie S to dobry pomysł, ponownie -1 bajt: TIO
Grimmy

1
@Grimy Dzięki za bajt -1 dla •EË7Óæ•S₂+, ale twój -3 golf nie działa niestety. Indeksowanie automatycznie zawija się w 05AB1E, więc 5st,6nd,7rd,25st,26nd,27rd,29stbędzie źle. PS: gdyby to zadziałało, mogłoby być za dodatkowe -1. :)
Kevin Cruijssen

1
-1 ponownie (użycie „standardów” zamiast „standardów” eliminuje potrzebę Á).
Grimmy

1
-1 ( •C.ñÒā•do •ΘÏF•º, dodatkowe cyfry nie mają znaczenia)
Grimmy

2

bash, 82 80 bajtów

-2 bajty dzięki tylko @ ASCII

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

TIO

bash + data GNU, 77 bajtów

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


@ Tylko ASCII, tak odejmowanie 100s na każdy dzień, 100 * 365 = 36500s, czyli mniej niż jeden dzień (86400), działa również z 86399 (odejmowanie 1s dziennie)
Nahuel Fouilleul

: / wciąż wygląda naprawdę długo, ale nie znalazłem jeszcze lepszego sposobu
tylko ASCII

2

Shell + coreutils, 112 90 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. Edycja: Zapisano 22 bajtów dzięki @NahuelFouilleul. Wyjaśnienie:

date -d0-12-31\ $1day

Obliczyć liczbę dni po pierwszym dniu poprzedzającym rok bez przestępowania. (Niestety nie można wykonać obliczeń daty względnej @-1.)

+%-dth\ %B|sed

Podaj dzień miesiąca (bez wiodącego zera) thi pełną nazwę miesiąca.

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

Naprawić 1st, 2nd, 3rd, 21st, 22nd, 23rdi 31st.

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

Przywróć 11thdo 13th.


widziałem tę odpowiedź po mojej, mogłem uratować 18 bajtów za pomocą jednego polecenia sed, również sw daysmożna usunąć, 19aw1969
Nahuel Fouilleul

@NahuelFouilleul Ten ostatni używa Bash-ism, więc powinien zostać opublikowany jako osobna odpowiedź, ale dziękuję za inne wskazówki!
Neil

2

Galaretka , 115 114 101 97 bajtów

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

Wypróbuj online!

Długie według standardów galaretki, ale zrobione z pierwszych zasad.

Dzięki @JonathanAllan za zaoszczędzenie 13 bajtów dzięki lepszemu zrozumieniu kompresji łańcuchów.


“£ṢtẒ⁽ẹ½MḊxɲȧėAṅ ɓaṾ¥D¹ṀẏD8÷ṬØ»Ḳ¤zaoszczędziłoby 13 (Compress.dictionary szuka wiodącej przestrzeni i ma do tego specjalną obsługę).
Jonathan Allan

2

Arkusze Google, 118 103 86 bajtów

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

Nie mogę edytować komentarza, więc oto działająca wersja kodu Arkuszy Google.

Wypróbuj online!


1

Czerwony , 124 bajty

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

Wypróbuj online!

Dodaje n- 1 dni do 1-1-1 (1 stycznia 2001), aby utworzyć datę, niż używa metody Arnaulda do indeksowania sufiksów miesięcznych. Szkoda, że czerwony ma indeks 1, co wymaga dodatkowej modyfikacji. Dobrą rzeczą jest to, że Red zna nazwy miesięcy :)


1

APL (NARS), 235 znaków, 470 bajtów

{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 to liczba, którą w podstawie 4 można zsumować do (12–28) w celu uzyskania długości każdego miesiąca ... 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 

0

C (gcc) , 174 155 bajtów

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;}

Wypróbuj online!


-2

Python 3 , 95 bajtów

Datetimed it: P

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

Wypróbuj online!


2
Nie generuje to porządkowych sufiksów i ma wiodące zera w numerze dnia. Jest ofto również niepotrzebne
Jo King
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.