Dzisiaj w YOLD

15

Dyskordianin kalendarz jest wykorzystywana przez innego harmonogramu Discordians.

  1. Rok discordian ma 5 sezonów, z których każdy trwa 73 dni: Chaos, Niezgoda, Zamieszanie, Biurokracja i Następstwa.
  2. Discordian week ma 5 dni: Sweetmorn, Boomtime, Pungenday, Prickle-Prickle i Setting Orange. Każdego roku zaczyna się od Sweetmorn (i w Chaosie).
  3. Każdy m lat ourth (co Happe n y wyrównać Greg O rian skok tak R e) dodatkowy d ay jest umieszczona pomiędzy chaosu 59 i chaos 60 zwany dzień St. TIB . Jest poza tygodniem Discordian, co oznacza, że ​​dzień po Dniu Świętego Tibia będzie miał Pomarańczowy, dzień przed Prickle-Prickle.
  4. Ustawiają się kalendarze gregoriański i dyskordian; oba zaczynają się tego samego dnia, który nazywa się 1 stycznia w kalendarzu gregoriańskim, i Chaos 1 w kalendarzu Discordian.
  5. Pierwszym rokiem Matki Boskiej Niezgodnej (1 ZŁOTO) był rok 1166 pne w kalendarzu gregoriańskim, co oznacza, że ​​w tym roku (2017 r.) Jest 318 ZŁ.
  6. Kalendarz Discordian ma również święta, ale nie są one ważne dla tego wyzwania i nie powinieneś ich przedstawiać, ani nic na ich temat.

Napisz program lub funkcję, która wyświetla lub zwraca dzisiejszą datę (w momencie wykonania):

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

Format jest taki "Today is $day_of_the_week, the $ordinal day of $season in the YOLD $year", w którym $ dzień_tygodnia to dzień tygodnia pisany wielkimi literami, $ porządkowy to dzień sezonu jako porządek dzienny (1., 2., 3., 4., ...), $ sezon jest pisany wielkimi literami (przypadek tytułowy), a rok to rok.

Jeśli twój program lub funkcja jest wykonywana w Dzień Świętego Tibia, powinna zamiast tego wyjść lub powrócić "Today is St. Tib's Day in the YOLD $year".

Zasady:

  • Obowiązują standardowe luki.
  • Jeśli twój wybrany język nie ma możliwości uzyskania bieżącej daty, może również przyjąć aktualną datę gregoriańską w dowolnym rozsądnym formacie jako dane wejściowe.
  • To jest , wygrywa najkrótszy kod (na język).
  • Końcowe białe znaki są w porządku.
  • Kwestie kapitalizacji.
  • Dzwonienie ddatew jakikolwiek sposób jest zabronione
  • Twój program powinien mieć gwarancję działania od 3067 do 3265 YOLD (1901 do 2099 AD), poza tym zakresem może on podawać nieprawidłowe wartości

Zobacz też:

L3viathan
źródło
4
discord to fajny klient komunikatorów internetowych
Okx,
1
Myślę, że dzisiaj jest 16 dzień zamieszania? Jaką datę reprezentuje ten przykład?
user202729,
2
niezwiązany
Jonathan Allan
1
@ user202729 Tak, data w przykładzie pochodzi z okresu, w którym napisałem wyzwanie, zaktualizuję go, aby wyświetlał dzisiejszą datę, która jest rzeczywiście szesnastym dniem zamieszania.
L3viathan
1
@ L3viathan w tym przypadku (dla tych, którzy używają języka z dużym rodzimym typem) czy możesz wyjaśnić a) jak poradzić sobie z przełomem stulecia, które nie są latami przestępnymi w calach gregoriańskich, jako „co 4 lata” niezgody cal z „dostosowuje się do gregoriańskiego” b) jak radzić sobie lata przed wprowadzeniem gregoriańskiego kal. Sugerowałem maksymalny zakres, który jest właściwie zdefiniowany przez twoją obecną specyfikację. Jeśli to odrzucisz, powinieneś zdefiniować, co program powinien robić poza tym zakresem. Ponadto należy unikać unieważniania istniejącej odpowiedzi. en.wikipedia.org/wiki/Gregorian_calendar
Level River St

Odpowiedzi:

5

Mathematica, 403 401 bajtów

Wersja zliczająca liczbę bajtów: (usunięte spacje i znaki nowej linii - niestety ta część jest dość trudna)

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

Wersja do przeczytania:

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

Odpowiedzią może być badany z dowolną datą zastępując DateString@"ISOOrdinalDate"przez DateString[{year,month,day},"ISOOrdinalDate"]o year, monthi dayzastąpione cyframi.

użytkownik202729
źródło
Jak mogę przetestować kod Mathematica?
L3viathan
6
„Nie masz wbudowanego?”
Jonathan Allan
4

Python 2, 423 bajtów

Krótka wersja:

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)

Dłuższa, bardziej czytelna forma:

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
    )

Aktualizacja: Naprawiono za pomocą świetnych @Neil i @EriktheOutgolfer. Ale odpowiedź @Jonathans jest znacznie krótsza.

jammon
źródło
2
Witamy w Programowaniu zagadek i Code Golf!
Dada
3
Czy to daje odpowiedni przyrostek dla 21., 22., 23.… 73? @ L3viathan y%4<1działałby, ale nie sądzę, 1-y%4by działał .
Neil
1
44-bajtowy golf.
Erik the Outgolfer,
@EriktheOutgolfer Czy nie możesz zapisać kolejnych 4 bajtów, eliminując ezmienną?
Neil
Witamy w PPCG! Niezły pierwszy post. I był zamiar dać trochę się tu i tam, ale zauważyłem, a problem został rozwiązany przyrostek i golfed kod więcej niż myślałem Chciałbym więc skończyło się składając własną wersję.
Jonathan Allan
2

Python 2 , 346 bajtów

Uwaga: To jest odpowiedź golfa (i poprawka) na odpowiedź jammona - początkowo myślałem, że prześlę komentarz, ale ostatecznie zmieniłem całkiem sporo (a ponadto dodałem sufiksy dnia).

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]

Wypróbuj online! lub zobacz kilka zakodowanych dat testów .

Jonathan Allan
źródło
Nie sądzę, że e%10*(e/9!=1)działa?
Neil,
Nie, to byłoby to wydrukować 11st, 12sti 13st(gdy e/9jest 1 to by mnożyć przez zero i minbędzie podnieść, że zero)
Jonathan Allan
2

JavaScript (ES6), 387 380 bajtów

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

Pobiera opcjonalny parametr daty. Nie golfowany:

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
źródło
1

C #, 392 bajtów

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

Wersja pełna / sformatowana:

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
źródło
1

Pyth , 295 bajtów

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

Uwaga: zawiera pliki binarne, kopiowanie i wklejanie może nie być bezpieczne. Kopiowanie i wklejanie z TIO powinno działać.

Wypróbuj online!

Można przetestować arbitralnych dat zastępując .d2na początku z 3-krotki (rok, miesiąc, dzień) w taki sposób: (2020 2 29).

To było trochę denerwujące, ponieważ Pyth nie ma sposobu na uzyskanie „dnia roku”, więc musiałem to obliczyć sam.

randomdude999
źródło