Oggi in YOLD


15

Il calendario Discordiano è un calendario alternativo utilizzato dai Discordiani.

  1. L'anno discordiano ha 5 stagioni, ciascuna della durata di 73 giorni: caos, discordia, confusione, burocrazia e conseguenze.
  2. La settimana discordiana ha 5 giorni: Sweetmorn, Boomtime, Pungenday, Prickle-Prickle e Setting Orange. Ogni anno inizia con Sweetmorn (e nel caos).
  3. Ogni f anno QUARTA (che Happe n s per allinearsi con Greg o Rian salto yea r s), un extra d ay si inserisce tra Chaos 59 e 60 Chaos chiamato il giorno di San Tib . È al di fuori della settimana discordiana, il che significa che il giorno dopo il giorno di San Tib sarà Setting Orange, il giorno prima di Prickle-Prickle.
  4. I calendari gregoriano e discordiano si allineano; entrambi iniziano lo stesso giorno, che si chiama 1 ° gennaio nel calendario gregoriano, e Chaos 1 in quello discordiano.
  5. Il primo anno di Nostra Signora della Discordia (YOLD 1) fu il 1166 a.C. nel calendario gregoriano, il che significa che quest'anno (2017 DC) è YOLD 3183.
  6. Anche il calendario di Discordian ha festività, ma non sono importanti per questa sfida e non dovresti produrle o farci nulla.

Scrivi un programma o una funzione che genera o restituisce la data odierna (al momento dell'esecuzione):

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

Il formato è "Today is $day_of_the_week, the $ordinal day of $season in the YOLD $year", dove $ day_of_the_week è il giorno della settimana maiuscolo (title-case), $ ordinal è il giorno della stagione come ordinale (1 °, 2 °, 3 °, 4 °, ...), $ season è il maiuscolo (case del titolo) e $ year è l'anno.

Se il tuo programma o funzione viene eseguito il giorno di San Tib, dovrebbe invece essere emesso o restituito "Today is St. Tib's Day in the YOLD $year".

Regole:

  • Si applicano scappatoie standard.
  • Se la tua lingua preferita non ha modo di ottenere la data corrente, potrebbe anche prendere la data gregoriana corrente in qualsiasi formato ragionevole come input.
  • Questo è , vince il codice più breve (per lingua).
  • Lo spazio bianco finale va bene.
  • La capitalizzazione conta.
  • La chiamata ddatein qualsiasi modo è vietata
  • Il programma dovrebbe essere garantito per funzionare dal 3067 al 3265 YOLD (dal 1901 al 2099 d.C.), al di fuori di tale intervallo può fornire valori errati

Guarda anche:


4
discord è un fantastico client di messaggistica istantanea
Okx,

1
Penso che oggi sia il 16 ° giorno di confusione? Quale data rappresenta l'esempio?
user202729


1
@ user202729 Sì, la data nell'esempio è di quando ho scritto la sfida originariamente, la aggiornerò per mostrare la data odierna, che è davvero il 16 ° giorno di confusione.
L3viathan,

1
@ L3viathan in quel caso (per chi usa una lingua con un grande madrelingua) puoi chiarire a) come gestire gli anni del secolo che non sono anni bisestili nel calibro gregoriano come "ogni 4 ° anno" delle contraddizioni cal discordiane con "si allinea con il gregoriano" b) come gestire anni prima dell'introduzione del gregoriano cal. Stavo suggerendo la gamma massima che è correttamente definita dalla tua specifica attuale. Se lo rifiuti, dovresti definire cosa dovrebbe fare il programma al di fuori di questo intervallo. Inoltre, dovresti evitare di invalidare la risposta esistente. it.wikipedia.org/wiki/Gregorian_calendar
Level River St

Risposte:


5

Mathematica, 403 401 byte

Versione per contare il numero di byte: (spazi rimossi e newline - purtroppo questa parte è piuttosto 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~"-"

Versione da leggere:

"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 risposta può essere testata con data arbitraria sostituendo DateString@"ISOOrdinalDate"da DateString[{year,month,day},"ISOOrdinalDate"]per year, monthe daysostituito da numeri.


Come posso testare il codice Mathematica?
L3viathan,

6
"Non hai incorporato?"
Jonathan Allan,

4

Python 2, 423 byte

Versione breve:

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)

Forma più lunga e più leggibile:

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
    )

Aggiornamento: risolto con l'aiuto dei grandi @Neil e @EriktheOutgolfer. Ma la risposta di @Jonathans è molto più breve.


2
Benvenuto in Programmazione di puzzle e code golf!
Dada,

3
Questo produce il suffisso giusto per il 21, 22, 23 ... 73? @ L3viathan y%4<1funzionerebbe, ma non credo 1-y%4.
Neil,


@EriktheOutgolfer Non riesci a salvare altri 4 byte eliminando la evariabile?
Neil,

Benvenuti in PPCG! Bel primo post. Io stavo pensando di dare un po 'fuori qua e là, ma ho notato e risolto il problema suffisso e golfed il codice più che ho pensato così ho finito per la presentazione la mia versione.
Jonathan Allan,

2

Python 2 , 346 byte

Nota: questo è un golf (e una correzione) della risposta di Jammon : inizialmente pensavo di inviare un commento, ma alla fine ho cambiato un po '(più i suffissi del giorno sono stati corretti).

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]

Provalo online! o vedere alcune date dei test codificate .


Suppongo che non funzioni e%10*(e/9!=1)?
Neil,

No, quindi verrebbe stampato 11st, 12ste 13st(quando e/9è 1 si moltiplicherebbe per zero e lo minsceglierebbe quello zero)
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

Accetta un parametro data facoltativo. 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);
}

1

C #, 392 byte

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

Versione completa / formattata:

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

1

Pyth , 295 byte

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

Nota: contiene binario, potrebbe non essere sicuro copiare e incollare da qui. Copia e incolla da TIO dovrebbe funzionare.

Provalo online!

È possibile verificare le date arbitrarie sostituendo .d2al via con un 3-tupla di (anno, mese, giorno) in questo modo: (2020 2 29).

Questo è stato un po 'fastidioso poiché Pyth non ha alcun modo di ottenere "giorno dell'anno", quindi ho dovuto calcolarlo da solo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.