Heute im YOLD

15

Der Discordian-Kalender ist ein alternativer Kalender, der von Discordianern verwendet wird.

  1. Das Jahr der Zwietracht hat fünf Jahreszeiten mit einer Dauer von jeweils 73 Tagen: Chaos, Zwietracht, Verwirrung, Bürokratie und Nachwirkungen.
  2. Die diskordische Woche hat 5 Tage: Sweetmorn, Boomtime, Pungenday, Prickle-Prickle und Setting Orange. Jedes Jahr beginnt mit Sweetmorn (und im Chaos).
  3. Jedes f Ourth Jahr (die Happe n S mit Greg auszurichten o rian Sprung ja r s), ein zusätzlicher d ay zwischen Chaos 59 und 60 genannt Chaos eingefügt St. Tib Tag . Es liegt außerhalb der Diskordischen Woche, was bedeutet, dass der Tag nach dem Tibustag Orange wird, der Tag vor dem Prickeln.
  4. Die gregorianischen und diskordianischen Kalender stehen in einer Reihe; Beide beginnen am selben Tag, der im gregorianischen Kalender als 1. Januar und im diskordianischen als Chaos 1 bezeichnet wird.
  5. Das erste Jahr Unserer Lieben Frau der Zwietracht (YOLD 1) war 1166 v. Chr. Im Gregorianischen Kalender, was bedeutet, dass dieses Jahr (2017 n. Chr.) YOLD 3183 ist.
  6. Der Discordian-Kalender hat auch Feiertage, aber diese sind für diese Herausforderung nicht wichtig und Sie sollten sie nicht ausgeben oder irgendetwas darüber.

Schreiben Sie ein Programm oder eine Funktion, die das heutige Datum ausgibt oder zurückgibt (zum Zeitpunkt der Ausführung):

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

Das Format lautet "Today is $day_of_the_week, the $ordinal day of $season in the YOLD $year": $ day_of_the_week ist der großgeschriebene Wochentag, $ ordinal ist der Tag der Jahreszeit als Ordinal (1., 2., 3., 4., ...), $ season ist der großgeschriebene Wochentag (Titel-Fall) Saison und $ Jahr ist das Jahr.

Wenn Ihr Programm oder Ihre Funktion am Tibustag ausgeführt wird, sollte es stattdessen ausgegeben oder zurückgegeben werden "Today is St. Tib's Day in the YOLD $year".

Regeln:

  • Es gelten Standardlücken.
  • Wenn Ihre Sprache nicht in der Lage ist, das aktuelle Datum zu ermitteln, wird möglicherweise auch das aktuelle gregorianische Datum in einem angemessenen Format als Eingabe verwendet.
  • Dies ist , der kürzeste Code (pro Sprache) gewinnt.
  • Nachgestellte Leerzeichen sind in Ordnung.
  • Kapitalisierung Angelegenheiten.
  • Anrufe ddatein irgendeiner Form sind verboten
  • Es sollte gewährleistet sein, dass Ihr Programm von 3067 bis 3265 YOLD (1901 bis 2099 AD) funktioniert. Außerhalb dieses Bereichs können falsche Werte angegeben werden

Siehe auch:

L3viathan
quelle
4
Uneinigkeit ist ein cooler Instant Messaging-Client
Okx
1
Ich denke, heute ist der 16. Tag der Verwirrung? Welches Datum stellt das Beispiel dar?
user202729
2
unabhängig
Jonathan Allan
1
@ user202729 Ja, das Datum im Beispiel stammt aus der Zeit, als ich die Challenge ursprünglich geschrieben habe. Ich werde es aktualisieren, um das heutige Datum anzuzeigen, das in der Tat der 16. Tag der Verwirrung ist.
L3viathan
1
@ L3viathan in diesem Fall (für diejenigen, die eine Sprache mit einem großen einheimischen Typ verwenden) können Sie klarstellen, a) wie man mit Jahren der Jahrhundertwende umgeht, die keine Schaltjahre in der gregorianischen Cal sind, da "jedes vierte Jahr" der diskordischen Cal widerspricht mit "stimmt mit der gregorianischen überein" b) wie man Jahre vor Einführung der gregorianischen Cal behandelt. Ich schlug den maximalen Bereich vor, der durch Ihre aktuelle Spezifikation richtig definiert wird. Wenn Sie dies ablehnen, sollten Sie definieren, was das Programm außerhalb dieses Bereichs tun soll. Sie sollten auch vermeiden, die vorhandene Antwort ungültig zu machen. en.wikipedia.org/wiki/Gregorian_calendar
Level River St

Antworten:

5

Mathematica, 403 401 Bytes

Version, um die Anzahl der Bytes zu zählen: (Leerzeichen und Zeilenumbrüche entfernt - leider ist dieser Teil ziemlich schwer)

"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 zu lesen:

"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~"-"

Die Antwort kann durch Ersetzen DateString@"ISOOrdinalDate"durch mit einem beliebigen Datum getestet werdenDateString[{year,month,day},"ISOOrdinalDate"] für year, monthund dayersetzt durch die Zahlen.

user202729
quelle
Wie kann ich Mathematica-Code testen?
L3viathan
6
"Wot no builtin?"
Jonathan Allan
4

Python 2, 423 Bytes

Kurzfassung:

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)

Längere, besser lesbare Form:

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
    )

Update: Mit Hilfe der tollen @Neil und @EriktheOutgolfer behoben. Aber @Jonathans Antwort ist viel kürzer.

jammon
quelle
2
Willkommen bei Programming Puzzles & Code Golf!
Dada
3
Erzeugt dies das richtige Suffix für den 21., 22., 23. ... 73.? @ L3viathan y%4<1würde funktionieren, aber ich glaube nicht 1-y%4.
Neil
1
44-Byte-Trivialgolf.
Erik der Outgolfer
@EriktheOutgolfer Können Sie keine weiteren 4 Bytes speichern, indem Sie die eVariable entfernen ?
Neil
Willkommen bei PPCG! Schöner erster Beitrag. Ich hatte vor, Ihnen hier und da ein wenig Zeit zu lassen, bemerkte und behebte jedoch das Suffix-Problem und spielte den Code mehr als ich dachte, sodass ich schließlich meine eigene Version einreichte.
Jonathan Allan
2

Python 2 , 346 Bytes

Hinweis: Dies ist ein Golf (und eine Korrektur) von Jammons Antwort - ich dachte ursprünglich, ich würde einen Kommentar einreichen, aber ich habe mich am Ende ziemlich verändert (plus die Tag-Suffixe wurden korrigiert).

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]

Probieren Sie es online! oder sehen Sie einige fest codierte Testdaten .

Jonathan Allan
quelle
Ich nehme nicht an, dass es e%10*(e/9!=1)funktioniert?
Neil
Nein, dann würde es drucken 11st, 12stund 13st(wenn e/91 ist, würde es mit Null multiplizieren und das minwürde diese Null auswählen)
Jonathan Allan
2

JavaScript (ES6), 387.380 Byte

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

Nimmt einen optionalen Datumsparameter an. Ungolfed:

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
quelle
1

C #, 392 Bytes

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

Voll / Formatierte Version:

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
quelle
1

Pyth , 295 Bytes

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

Hinweis: Enthält Binärdateien. Das Kopieren und Einfügen von hier ist möglicherweise nicht sicher. Das Kopieren und Einfügen von TIO sollte funktionieren.

Probieren Sie es online!

Sie können beliebige Daten testen, indem Sie .d2zu Beginn ein 3-Tupel (Jahr, Monat, Tag) wie folgt ersetzen :(2020 2 29) .

Dies war ein bisschen nervig, da Pyth keine Möglichkeit hat, "Tag des Jahres" zu bekommen, also musste ich es selbst berechnen.

randomdude999
quelle