Aujourd'hui dans le YOLD

15

Le calendrier Discordien est un calendrier alternatif utilisé par les Discordiens.

  1. L'année discordienne a 5 saisons, chacune d'une durée de 73 jours: Chaos, Discord, Confusion, Bureaucracy et The Aftermath.
  2. La semaine discordienne a 5 jours: Sweetmorn, Boomtime, Pungenday, Prickle-Prickle et Setting Orange. Chaque année commence avec Sweetmorn (et dans Chaos).
  3. Chaque f UATRIÈME année (qui happe n s aligner avec Greg o saut rian oui r s), un supplément d ay est inséré entre Chaos 59 et 60 Chaos appelé le jour de Saint - Tib . C'est en dehors de la semaine discordienne, ce qui signifie que le lendemain du jour de la Saint-Tib sera Setting Orange, la veille de Prickle-Prickle.
  4. Les calendriers grégorien et discordien s'alignent; les deux commencent le même jour, qui est appelé le 1er janvier dans le calendrier grégorien, et Chaos 1 dans le calendrier discordien.
  5. La première année de Notre-Dame de la Discorde (YOLD 1) était 1166 BC dans le calendrier grégorien, ce qui signifie que cette année (2017 AD) est YOLD 3183.
  6. Le calendrier discordien a également des jours fériés, mais ils ne sont pas importants pour ce défi et vous ne devez pas les publier ou quoi que ce soit à leur sujet.

Écrivez un programme ou une fonction qui génère ou renvoie la date du jour (au moment de l'exécution):

Today is Boomtime, the 16th day of Confusion in the YOLD 3183

Le format est "Today is $day_of_the_week, the $ordinal day of $season in the YOLD $year", où $ day_of_the_week est le jour de la semaine en majuscule (titre-cas), $ ordinal est le jour de la saison en tant qu'ordinal (1er, 2e, 3e, 4e, ...), $ season est le capitalisé (titre-cas) saison, et $ année est l'année.

Si votre programme ou votre fonction est exécutée le jour de la Saint-Tib, elle devrait plutôt sortir ou retourner "Today is St. Tib's Day in the YOLD $year".

Règles:

  • Des échappatoires standard s'appliquent.
  • Si la langue de votre choix n'a aucun moyen d'obtenir la date actuelle, elle peut également prendre la date grégorienne actuelle dans n'importe quel format raisonnable comme entrée.
  • C'est le , le code le plus court (par langue) l'emporte.
  • La fin des espaces blancs est acceptable.
  • La capitalisation est importante.
  • Appeler ddatede quelque façon que ce soit est interdit
  • Votre programme doit être garanti pour fonctionner de 3067 à 3265 YOLD (1901 à 2099 AD), en dehors de cette plage, il peut donner des valeurs incorrectes

Voir également:

L3viathan
la source
4
discord est un super client de messagerie instantanée
Okx
1
Je pense qu'aujourd'hui est le 16e jour de confusion? Quelle date représente l'exemple?
user202729
2
non apparenté
Jonathan Allan
1
@ user202729 Oui, la date de l'exemple est celle à laquelle j'ai écrit le défi à l'origine, je vais le mettre à jour pour afficher la date d'aujourd'hui, qui est en effet le 16e jour de confusion.
L3viathan
1
@ L3viathan dans ce cas (pour ceux qui utilisent une langue avec un grand type natif) pouvez-vous clarifier a) comment gérer les années du tournant du siècle qui ne sont pas des années bissextiles dans le cal grégorien comme "tous les 4 ans" du cal discordien contredit avec "s'aligne sur le grégorien" b) comment gérer les années avant l'introduction du cal grégorien. Je proposais la plage maximale qui est correctement définie par vos spécifications actuelles. Si vous refusez cela, vous devez définir ce que le programme doit faire en dehors de cette plage. Vous devez également éviter d'invalider la réponse existante. en.wikipedia.org/wiki/Gregorian_calendar
Level River St

Réponses:

5

Mathematica, 403 401 octets

Version pour compter le nombre d'octets: (espaces supprimés et sauts de ligne - malheureusement cette partie est assez difficile)

"Setting Orange"["Sweetmorn","Boomtime","Pungenday","Prickle-Prickle"][[#~Mod~5]]<>", the "<>SpokenString@p[[Mod[#,73,1]]]~StringExtract~2<>" day of "<>{"Chaos","Discord","Confusion","Bureaucracy","The Aftermath"}[[⌈#/73⌉]]&;
Row@{"Today is ",#2," in the YOLD ",1166+#}&[#,If[4∣#,If[#2>60,%[#2-1],If[#2<60,%@#2,"St.Tib's Day"]],%@#2]]&@@FromDigits/@DateString@"ISOOrdinalDate"~StringSplit~"-"

Version à lire:

"Setting Orange"["Sweetmorn", "Boomtime", "Pungenday", 
     "Prickle-Prickle"][[#~Mod~5]] <>
   ", the " <>
   SpokenString@p[[Mod[#, 73, 1]]]~StringExtract~2 <>
   " day of " <>
   {"Chaos", "Discord", "Confusion", "Bureaucracy", 
     "The Aftermath"}[[Ceiling[#/73]]] &;
Row@{
      "Today is ",
      #2,
      " in the YOLD ",
      1166 + #
      } &[#,
   If[4 ∣ #,
    If[#2 > 60, %[#2 - 1],
     If[#2 < 60, %@#2, "St.Tib's Day"]
     ], %@#2
    ]] & @@ FromDigits /@ DateString@"ISOOrdinalDate"~StringSplit~"-"

La réponse peut être testé avec la date arbitraire en remplaçant DateString@"ISOOrdinalDate"par DateString[{year,month,day},"ISOOrdinalDate"]des year, monthet dayremplacés par des numéros.

user202729
la source
Comment puis-je tester le code Mathematica?
L3viathan
6
"Tu n'as pas intégré?"
Jonathan Allan
4

Python 2, 423 octets

Version courte:

import time
y,d=time.gmtime()[0::7]
t="Today is "
o=" in the YOLD "+`y+1166`
if y%4<1 and d>59:
 if d==60:print"%sSt. Tib's Day%s%d"%(t,o);quit()
 d-=1
s,e=divmod(d-1,73)
print t+["Sweetmorn","Boomtime","Pungenday","Prickle-Prickle","Setting Orange"][(d-1)%5]+", the %d%s day of %s"%(e+1,'tsnrthtddh'[min(e*(e/10-1 and 1)%10,4)::5],["Chaos","Discord","Confusion","Bureaucracy","The Aftermath"][s]+o)

Forme plus longue et plus lisible:

import time

# now = time.strptime("2017.06.11", "%Y.%m.%d")  # for testing
now = time.gmtime()
year, day_of_year = now[0::7]
leapyear = year % 4 < 1
today = "Today is "
yold = " in the YOLD " + `y+1166`

if leapyear and day_of_year>59:
    if day_of_year==60:
        print "%sSt. Tib's Day%s%d"% (today, yold)
        quit()  # dirty, but ... hey.
    day_of_year -= 1
season, day = divmod(day_of_year-1,73)

print today + \
    ["Sweetmorn", "Boomtime", "Pungenday", "Prickle-Prickle", "Setting Orange"][(day_of_year-1)%5] + \
    ", the %d%s day of %s" % (
        day+1,
        'tsnrthtddh'[min(day*(day/10-1 and 1)%10,4)::5],
        ["Chaos", "Discord", "Confusion", "Bureaucracy", "The Aftermath"][season] + yold
    )

Mise à jour: corrigé avec l'aide des grands @Neil et @EriktheOutgolfer. Mais la réponse de @Jonathan est beaucoup plus courte.

jammon
la source
2
Bienvenue sur Programmation Puzzles & Code Golf!
Dada
3
Est-ce que cela produit le bon suffixe pour les 21, 22, 23 ... 73e? @ L3viathan y%4<1fonctionnerait, mais je ne pense pas 1-y%4.
Neil
1
Golf trivial de 44 octets.
Erik the Outgolfer
@EriktheOutgolfer Ne pouvez-vous pas enregistrer encore 4 octets en éliminant la evariable?
Neil
Bienvenue chez PPCG! Bon premier post. J'ai l' intention de vous donner un peu ici et là, mais on a remarqué et corrigé le problème de suffixe et le code plus joué au golf que je pensais alors je fini par présenter ma propre version.
Jonathan Allan
2

Python 2 , 346 octets

Remarque: il s'agit d'un golf (et d'une correction) de la réponse de jammon - à l'origine, je pensais soumettre un commentaire, mais j'ai finalement changé un peu (en plus, les suffixes de jour ont été corrigés).

import time
y,d=time.gmtime()[::7]
t="Today is %s in the YOLD "+`y+1166`
r=y%4<1<59<d
d-=r+1
e=d%73
print t%[["Sweetmorn","Boomtime","Pungenday","Prickle-Prickle","Setting Orange"][d%5]+", the %d%s day of "%(e+1,'snrttddh'[min(e%10+3*(e/9==1),3)::4])+["Chaos","Discord","Confusion","Bureaucracy","The Aftermath"][d/73],"St. Tib's Day"][(r*d)==58]

Essayez-le en ligne! ou consultez des dates de test codées en dur .

Jonathan Allan
la source
Je ne suppose pas que ça e%10*(e/9!=1)marche?
Neil
Non, alors il s'imprimerait 11st, 12stet 13st(quand e/9est 1 il se multiplierait par zéro et le minramasserait ce zéro)
Jonathan Allan
2

JavaScript (ES6), 387 380 octets

f=(d=new Date(),a=d.getDate()-1,y=d.getFullYear()+1166)=>d.getMonth()?f(d,a+d.getDate(d.setDate(0))):`Today is ${y%4-2|a<59||59-a--?`Sweetmorn,Boomtime,Pungenday,Prickle-Prickle,Setting Orange`.split`,`[a%5]+`, the ${d=a%73+1}${[,`st`,`nd`,`rd`][d-10-(d%=10)&&d]||`th`} day of `+`Chaos,Discord,Confusion,Bureaucracy,The Aftermath`.split`,`[a/73|0]:`St. Tib's Day`} in the YOLD `+y

Prend un paramètre de date facultatif. Non golfé:

function discordian(date) {
    var a = date.getDate();
    while (date.getMonth()) {
        date.setDate(0);
        a += date.getDate();
    }
    if (date.getYear() % 4 == 0) {
        if (a == 60) return "Today is St. Tib's day in the YOLD " + (date.getYear() + 1166);
        if (a > 60) a--;
    }
    var weekday = ['Setting Orange', 'Sweetmorn', 'Boomtime', 'Pungenday', 'Prickle-Prickle'][a % 5];
    var seasonday = (a - 1) % 73 + 1;
    var ordinal = seasonday % 10 == 1 && seasonday != 11 ? 'st' : seasonday % 10 == 2 && seasonday != '12' : 'nd' : seasonday % 10 == 3 && seasonday != '13' ? 'rd' : 'th';
    var season = ['Chaos', 'Discord', 'Confusion', 'Bureaucracy', 'The Aftermath'][Math.floor((a - 1) / 73)];
    return "Today is " + weekday + ", the " + seasonday + ordinal + " day of " + season + " in the YOLD " + (date.getYear() + 1166);
}
Neil
la source
1

C #, 392 octets

using System;s=>{var t=DateTime.Now;int d=t.DayOfYear,y=t.Year,m=d%73;return"Today is "+(DateTime.IsLeapYear(y)&d==60?"St. Tib's Day":"Sweetmorn|Boomtime|Pungenday|Prickle-Prickle|Setting Orange".Split('|')[d%5-1]+", the "+ m+(m<2|m==21|m>30?"st":m==2|m==22?"nd":m==3|m==23?"rd":"th")+" day of "+"Chaos|Discord|Confusion|Bureaucracy|The Aftermath".Split('|')[d/73])+" in the YOLD "+(y+1166);}

Version complète / formatée:

using System;

class P
{
    static void Main()
    {
        Func<string, string> f = s =>
        {
            var t = DateTime.Now;
            int d = t.DayOfYear, y = t.Year, m = d % 73;

            return "Today is " + (DateTime.IsLeapYear(y) & d == 60
                   ? "St. Tib's Day"
                   : "Sweetmorn|Boomtime|Pungenday|Prickle-Prickle|Setting Orange".Split('|')[d % 5 - 1] +
                     ", the " +
                     m +
                     (m < 2 | m == 21 | m > 30 ? "st" : m == 2 | m == 22 ? "nd" : m == 3 | m == 23 ? "rd" : "th") +
                     " day of " +
                     "Chaos|Discord|Confusion|Bureaucracy|The Aftermath".Split('|')[d / 73])
                   + " in the YOLD " + (y + 1166);
        };

        Console.WriteLine(f(null));

        Console.ReadLine();
    }
}
TheLethalCoder
la source
1

Pyth , 295 octets

J.d2A<J2Kt+s<+,31 28*2t*3,30 31tH@J2=Y&&!%G4<58K!qH3=N%K73%"Today is %s in the YOLD %d",@,++@c"SweetmornZBoomtimeZPungendayZPrickle-PrickleZSetting Orange"\Z%K5%", the %d%s day of ",+N1@c"stndrdth"2h.mb,3+%NT*3q1/N9@c." yNlSFk.»&ô?Z#u!%ô6'mçM«_ôvëû¹)+¬<"\Z/K73"St. Tib's Day"q*YK59+G1166

Remarque: contient du binaire, il n'est peut-être pas sûr de copier-coller à partir d'ici. Le copier-coller de TIO devrait fonctionner.

Essayez-le en ligne!

Vous pouvez tester les dates arbitraires en remplaçant .d2au début d'un 3-tuple de (année, mois, jour) comme ceci: (2020 2 29).

Celui-ci était un peu ennuyeux car Pyth n'a aucun moyen d'obtenir le "jour de l'année", j'ai donc dû le calculer moi-même.

randomdude999
la source