C'est une tâche annuelle, d'accord

22

Étant donné un nombre 1≤n≤365, sortez le nième jour de l'année au format "Day-numberth Month". Par exemple, étant donné 1, vous devez sortir "1er janvier", sans "de".

Le calendrier grégorien sera utilisé et le programme ne devrait pas prendre en compte les années bissextiles, de sorte que votre programme ne devrait jamais afficher "29 février" en aucune circonstance. N'importe quelle méthode peut être utilisée, tant qu'elle suit le format "Day-numberth Month" mentionné précédemment. Votre programme doit également sortir correctement les ordinaux, ce qui signifie qu'il doit toujours sortir les 1er, 2e, 3e, 1, 2 ou 3 respectivement, les nombres de jours pour toute entrée. Les espaces de tête ou autres indentations sont autorisés.

C'est le golf de code, donc la solution la plus courte par les personnages l'emporte.

Cas de test:

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
la source
4
De plus, devez-vous forcer un message d'erreur sur les nombres> 365? Le programme peut-il simplement supposer qu'il s'agit d'une entrée non valide et qu'il n'aura pas besoin de gérer cela?
Rɪᴋᴇʀ
5
Comme tout le monde n'est pas anglophone, vous pouvez ajouter que les numéros de jour 11, 12 et 13 obtiennent "th", les nombres se terminant par "1" get "st", "2" get "nd", "3" obtenir "rd", et tous les autres obtenir "th".
Adám
9
Whoa, n'accepte pas les réponses si vite. Surtout pas de mauvaises réponses!
Adám
6
Vous devez ajouter au moins 11(11 e Janvier) et 21(21 er Janvier) aux cas de test.
Arnauld
1
Et pendant que vous modifiez des cas de test, spécifiez peut-être exactement le format de votre cas de test. Quelques répondants ont pensé que cela 123=faisait partie de la sortie requise. Ou simplement modifier vos cas de test pour lire quelque chose comme: 365donne31st December
Adám

Réponses:

9

PHP ,38 40 30 28 octets

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

Essayez-le en ligne!

Exécuter avec l' php -nFentrée provient de STDIN. Exemple (script ci-dessus nommé 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

Explication

Construisez un horodatage d'époque pour le jour souhaité en 1970 (ce n'est pas une année bissextile) en multipliant le day number * number of seconds per day(86400). Cependant, cela donnerait un jour de plus, alors au lieu de cela, multipliez par number of seconds in a day - 1(86399) qui, pour la plage de numéros d'entrée (1≤n≤365), résultera de l'horodatage de la fin de chaque jour correct. Ensuite, utilisez simplement le formatage de date intégré de PHP pour la sortie.

640 Ko
la source
pourquoi est-ce -nnécessaire?
Ven
@Ven, ce n'est peut-être pas dans tous les cas, mais désactive simplement tous les paramètres du php.ini local qui pourraient créer un comportement incohérent.
640 Ko
6

Gelée ,  79 78  77 octets

-1 correction d'un bug :) (ne doit pas pré-transposer pour trouver l'index, doit post-inverser, mais alors nous pouvons suivre plutôt que head)
-1 en utilisant la réflexion ( ⁽©ṅ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

Un programme complet qui imprime le résultat

Essayez-le en ligne!

Comment?

mettra à jour cela plus tard ...

⁽©ṅ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
la source
4
L'astuce «standard the» est incroyable.
Ven
Je suis d'accord avec @Ven , super astuce! Il a également enregistré un octet dans ma réponse 05AB1E par rapport à la chaîne compressée "thstndrd"divisée en parties de taille 2 ( .•oθ2(w•2ô), donc merci. :)
Kevin Cruijssen
1
Ce doit être l'un des programmes Jelly les plus longs que j'aie jamais vus.
JAD
6

C # (Visual C # compilateur interactif) , 115 113 109 98 octets

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;

Merci à @someone pour avoir économisé 9 octets

Essayez-le en ligne!

Incarnation de l'ignorance
la source
1
@KevinCruijssen J'ai mis les modules en panne, devrait être corrigé maintenant.
Incarnation de l'ignorance
.code.tio(2,22): error CS0165: Use of unassigned local variable 'p'Il semble que la chose struct ne fonctionne pas.
JAD
var g=new DateTime().AddDays(n-1)fonctionne bien
JAD
@JAD erreur de ma part, corrigé
Incarnation de l'ignorance
110 octets je pense
mon pronom est monicareinstate
5

Python 3.8 (version préliminaire) , 112 octets

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

Essayez-le en ligne!

Curieusement, je n'ai pas à mettre de parenthèses d:=(t:=gmtime(~-x*86400), probablement parce que l'interpréteur vérifie uniquement s'il y a des ()caractères autour de l'expression d'affectation et non pas que l'expression elle-même est entre parenthèses.

-2 merci à gwaugh .
-5 grâce à xnor .

Erik le Outgolfer
la source
5

Perl 6 , 166 161 octets

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

Essayez-le en ligne!

Hardcode tous les noms de mois, ce qui occupe la majeure partie de l'espace. Mec, Perl 6 a vraiment besoin d'un bon formateur de date.

Jo King
la source
4

Hack, 115 59 39 octets

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

Depuis que @gwaugh a obtenu la même solution que la mienne pendant que je jouais au golf, je poste plutôt ceci dans Hack :).

Ven
la source
Wow, les grands esprits pensent de la même façon. :) +1 à vous monsieur!
640 Ko
@gwaugh haha, je ne savais pas que je pouvais simplement avoir un programme de haut niveau. Je vais éditer le mien pour le rendre de haut niveau aussi, et trouver un moyen d'obtenir un meilleur score e ;-)
Ven
1
@gwaugh a fait mien Hack à la place.
Ven
1
Vous voudrez probablement spécifier un paramètre d'année non bissextile à votre mktime()appel, sinon il retournera la mauvaise sortie s'il est exécuté sur une année bissextile. (devait faire à ma réponse).
640 Ko
4

JavaScript (ES6),  117  113 octets

4 octets enregistrés grâce à @tsh

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

Essayez-le en ligne!

Commenté

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

Sans date intégrée, 188 octets

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]

Essayez-le en ligne!

Arnauld
la source
Échoue les 11, 12 et 13 de chaque mois
Données expirées
1
@ExpiredData Merci d'avoir signalé cela. Fixé maintenant.
Arnauld
Ignorer mon commentaire, j'ai fait une erreur ID10T.
asgallant
Je ne sais pas comment nodejs gère les balises de langue, mais il semble que l'utilisation 0fonctionnerait comme l'utilisation "en". Et changer pour toLocaleStringéconomiser 4 octets. 110 octets
tsh
@tsh Il semble que toLocaleStringle système utilise les paramètres par défaut du système lorsqu'il reçoit une chaîne non reconnue ou une valeur numérique. Donc ça peut être n'importe quoi. Ce paramètre est fondamentalement inefficace sur une instance TIO, car seuls les paramètres régionaux anglais sont installés de toute façon.
Arnauld
4

Smalltalk, 126 octets

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
la source
1
Je ne connais pas Smalltalk, mais est-ce correct 11th,12th,13th? Si je lis correctement, vous divisez le jour par 10, mais cela signifierait que cela se traduirait par 11st,12nd,13rd, à moins que quelque chose d'autre dans le code ne corrige cela alors que je ne suis pas au courant.
Kevin Cruijssen
@KevinCruijssen Vous avez raison. Merci d'avoir attiré mon attention sur ce point. Je devrai dépenser quelques octets supplémentaires pour résoudre ce problème.
Leandro Caniglia
1
@KevinCruijssen, Fait. Merci encore.
Leandro Caniglia
3

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

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

Merci à Arnauld pour la méthode plus rapide de suppression de 11,12,13e, économisant 4 octets

Essayez-le en ligne!

Données expirées
la source
En utilisant C # 8, cela peut être réduit à: 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 Le compilateur interactif ne semble pas prendre en charge la modification de son niveau de langage en "aperçu" pour le moment, cependant.
Arcanox
116 octets
Incarnation de l'ignorance
Je suis sûr que vous devez ajouter un point-virgule après leDataTime s
Embodiment of Ignorance
3

R , 158 134 octets

-24 octets @Nick Kennedy pour avoir joué au golf sur le "st", le "nd", le "rd" et le "th". Merci!

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

Essayez-le en ligne!

CT Hall
la source
1
Que diriez-vous tio.run/##HYxBCsIwEEWvIoEwMzDVRldi40K8hQgdmwQV20oSd949xm4e/… pour 134 octets
Nick Kennedy
Oui, j'ai besoin de `if`mieux apprendre . Merci.
CT Hall
3

MySQL, 47 45 42 octets

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

1901 peut être remplacée par toute année qui était / n'est pas une année bissextile.

Edit: enregistré deux octets en supprimant les espaces et trois autres octets en changeant l'année à 1, grâce à @Embodyment of Ignorance .

NicolasB
la source
Pouvez-vous supprimer les espaces entre 1901, net la chaîne?
Incarnation de l'ignorance
@EmbodimentofIgnorance oui je peux, merci!
NicolasB
Aussi, pourquoi ne pas remplacer 1901 par une année comme 1? 1 n'est pas une année bissextile, et c'est 3 octets de moins
Embodiment of Ignorance
@EmbodimentofIgnorance fait et fait :-)
NicolasB
3

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

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

-9 octets grâce à @Grimy .
-1 octet grâce au tour de @ JonathanAllan standard thepour th,st,nd,rd, qu'il a utilisé dans sa réponse Jelly .

Essayez-le en ligne ou vérifiez tous les cas de test possibles .

Explication:

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

Consultez cette astuce 05AB1E pour comprendre pourquoi:

  • (section Comment utiliser le dictionnaire? ) ”……‚應…ä†ï€¿…Ë…ê†Ä…æ…Ì…Í”est"December January February March April May June July August September October November"
  • (section Comment utiliser le dictionnaire? ) …thŠØest"th standards"
  • (section Comment compresser les grands entiers? ) •ΘÏF•est5254545
Kevin Cruijssen
la source
1
-2 octets en utilisant 5 × 28 + pour la compression: TIO
Grimmy
1
Utiliser S est une bonne idée, -1 octet à nouveau: TIO
Grimmy
1
@Grimy Merci pour le -1 octet pour •EË7Óæ•S₂+, mais votre golf -3 ne fonctionne malheureusement pas. L'indexation s'enroule automatiquement dans 05AB1E, donc l' 5st,6nd,7rd,25st,26nd,27rd,29sterreur sera erronée. PS: si cela avait fonctionné, aurait pu être pour un -1 supplémentaire. :)
Kevin Cruijssen
1
-1 à nouveau (en utilisant "th standards" au lieu de "standard the" supprime le besoin de Á).
Grimmy
1
-1 ( •C.ñÒā•à •ΘÏF•º, les chiffres supplémentaires n'ont pas d'importance)
Grimmy
2

bash, 82 80 octets

-2 octets grâce à @ ASCII uniquement

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

TIO

bash + date GNU, 77 octets

a=(th st nd rd);set `date -d@$[$1*86399] +%e\ %B`;echo $1${a[$1%30%20]-th} $2
Nahuel Fouilleul
la source
80?
uniquement à ASCII
@ ASCII uniquement, oui en soustrayant 100s pour chaque jour, 100 * 365 = 36500s qui est inférieur à un jour (86400), fonctionne également avec 86399 (soustrayez 1s par jour)
Nahuel Fouilleul
: / semble toujours très long mais n'a pas encore trouvé de meilleur moyen
ASCII uniquement
2

Coquille + coreutils, 112 90 octets

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

Essayez-le en ligne! Le lien inclut des cas de test. Edit: 22 octets enregistrés grâce à @NahuelFouilleul. Explication:

date -d0-12-31\ $1day

Calculez le nombre de jours après le premier jour précédant une année non bissextile. (Malheureusement, vous ne pouvez pas faire de calculs de date relative à partir de@-1 .)

+%-dth\ %B|sed

Sortie le jour du mois (sans zéro devant), th et le nom complet du mois.

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

Réparer 1st, 2nd, 3rd, 21st, 22nd, 23rdet 31st.

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

Restaurer 11thvers 13th.

Neil
la source
j'ai vu cette réponse après la mienne, pourrait économiser 18 octets en utilisant une commande sed, également sdans dayspeut être supprimé, et 19dans1969
Nahuel Fouilleul
@NahuelFouilleul Ce dernier utilise un Bash-ism devrait donc être publié comme une réponse séparée, mais merci pour les autres conseils!
Neil
2

Gelée , 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

Essayez-le en ligne!

Longtemps selon les normes Jelly, mais fait à partir des premiers principes.

Merci à @JonathanAllan pour avoir économisé 13 octets grâce à une meilleure compréhension de la compression des chaînes.

Nick Kennedy
la source
“£ṢtẒ⁽ẹ½MḊxɲȧėAṅ ɓaṾ¥D¹ṀẏD8÷ṬØ»Ḳ¤économiserait 13 (Compress.dictionary recherche un espace de tête et a une gestion spéciale pour cela).
Jonathan Allan
2

Google Sheets, 118 103 86 octets

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

Je ne peux pas modifier mon commentaire , voici une version de travail du code Google Sheets.

Essayez-le en ligne!

Zylviij
la source
1

Rouge , 124 octets

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

Essayez-le en ligne!

Ajoute n- 1 jour au 1-1-1 (1er janvier 2001) pour former une date, puis utilise la méthode d'Arnauld pour indexer les suffixes du mois. Dommage que le rouge soit indexé 1, cela nécessite des ajustements supplémentaires. La bonne chose est que Red connaît les noms des mois :)

Galen Ivanov
la source
1

APL (NARS), 235 caractères, 470 octets

{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 est le nombre qui en base 4 peut être additionné à (12⍴28) pour obtenir la durée de chaque mois ... 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
la source
0

C (gcc) , 174155 octets

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

Essayez-le en ligne!

GPS
la source
-2

Python 3 , 95 octets

Datetimed it: P

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

Essayez-le en ligne!

Kerosenic
la source
2
Cela ne produit pas les suffixes ordinaux et a des zéros en tête dans le nombre de jours. Ce ofn'est pas nécessaire non plus
Jo King