Сьогодні в YOLD


15

Discordian календар є альтернативою календар , використовуваний Discordians.

  1. Рік дискурда має 5 сезонів, кожен триває 73 дні: хаос, розбрат, сум'яття, бюрократія та наслідки.
  2. Тиждень дискурда має 5 днів: Sweetmorn, Boomtime, Pungenday, Pickle-Pickle і Setting Orange. Кожен рік починається з Sweetmorn (і в Хаосі).
  3. Кожен е ourth рік (який Happe п про вирівнюванні з Грегом про РИАН стрибка та г s), додатковий d ау вставляються між Хаосом 59 і Хаосом 60 під назвою День Святого тиб в . Це поза тижня Дискорда, тобто день після Дня святого Тиба стане Помаранчевим, за день до Укріл-Укріл.
  4. Григоріанський і Дискордійський календарі вишикуються; обидва починаються в той самий день, який називається 1 січня за григоріанським календарем, а Хаос 1 - у Дискордіанський.
  5. Перший Рік Богоматері Розбрату (YOLD 1) в григоріанському календарі був 1166 р. До н.е., тобто цей рік (2017 р. Н. Е.) - це 3183 рік.
  6. У календарі Discordian також є свята, але вони не важливі для цього виклику, і ви не повинні виводити їх або нічого про них.

Напишіть програму або функцію, яка виводить або повертає сьогоднішню дату (на момент виконання):

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

Формат "Today is $day_of_the_week, the $ordinal day of $season in the YOLD $year", де $ day_of_the_week є великим літером (титульний регістр) день тижня, $ порядковий день сезону як порядковий (1-й, 2-й, 3-й, 4-й, ...), $ сезон - з великої літери (заголовок) сезон, і $ рік - це рік.

Якщо ваша програма або функція виконується в день святого Тиба, вона повинна замість цього вивести або повернутись "Today is St. Tib's Day in the YOLD $year".

Правила:

  • Застосовуються стандартні лазівки.
  • Якщо у вашій мові вибору немає способу отримати поточну дату, вона також може взяти поточну дату григоріанської форми в будь-якому розумному форматі як вхідну.
  • Це , виграє найкоротший код (на кожну мову).
  • Пробіл пробілів у порядку.
  • Капіталізація має значення.
  • Дзвінки ddateбудь-яким способом заборонені
  • Ваша програма повинна гарантувати роботу від 3067 до 3265 YOLD (1901 до 2099 н.е.), поза цим діапазоном, вона може давати неправильні значення

Дивись також:


4
discord - це класний клієнт для обміну миттєвими повідомленнями
Okx

1
Я думаю, сьогодні 16 день плутанини? Яку дату представляє приклад?
користувач202729


1
@ user202729 Так, дата в прикладі починається з того часу, коли я спочатку написав виклик, я оновлю його, щоб показати сьогоднішню дату, яка справді є 16-м днем ​​плутанини.
L3viathan

1
@ L3viathan у цьому випадку (для тих, хто використовує мову з великим рідним типом), чи можете ви уточнити: а) як поводитися з рубежем сторічних років, які не є високосними в григоріанській мові, оскільки "кожен 4-й рік" дискордного кал суперечить з "узгоджується з григоріанським" б) як поводитися за роки до введення григоріанської кал. Я пропонував максимальний діапазон, який правильно визначений вашою поточною специфікацією. Якщо ви відкинете це, вам слід визначити, що програма повинна робити поза цим діапазоном. Також слід уникати недійсності існуючої відповіді. en.wikipedia.org/wiki/Gregorian_calendar
Річка Рівня Св.

Відповіді:


5

Математика, 403 401 байт

Версія для підрахунку кількості байтів: (видалені пробіли та нові рядки - на жаль, ця частина досить складна)

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

Версія для читання:

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

Відповідь можна перевірити з довільною датою, замінивши DateString@"ISOOrdinalDate"на DateString[{year,month,day},"ISOOrdinalDate"]і year, monthі dayзамінити цифрами.


Як я можу перевірити код Mathematica?
L3viathan

6
"Не вбудовано?"
Джонатан Аллан

4

Пітон 2, 423 байт

Коротка версія:

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)

Більш довга, зручна для читання форма:

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
    )

Оновлення: виправлено за допомогою великих @Neil та @EriktheOutgolfer. Але відповідь @Jonathans набагато коротша.


2
Ласкаво просимо на головоломки програмування та код гольфу!
Дада

3
Чи створює це правильний суфікс для 21-го, 22-го, 23-го… 73-го? @ L3viathan y%4<1буде працювати, але я не думаю, що 1-y%4буде.
Ніл


@EriktheOutgolfer Ви не можете зберегти ще 4 байти, усунувши eзмінну?
Ніл

Ласкаво просимо до PPCG! Гарний перший пост. Я був планую дати вам трохи тут і там, але помітив і виправив проблему суфікса і golfed коду більше , ніж я думав , так що я в кінцевому підсумку представивши свою версію.
Джонатан Аллан

2

Python 2 , 346 байт

Примітка: Це гольф (і виправлення) відповіді джемона - я спочатку думав, що надішлю коментар, але в кінці кінців змінив (плюс суфікси дня були виправлені).

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]

Спробуйте в Інтернеті! або ознайомтеся з твердими датами тестування .


Я не думаю, що e%10*(e/9!=1)працює?
Ніл

Ні, тоді воно надрукується 11st, 12stі 13st(коли e/91, він помножиться на нуль, і minвибрав би цей нуль)
Джонатан Аллан

2

JavaScript (ES6), 387 380 байт

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

Бере необов'язковий параметр дати. Безголівки:

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 байти

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

Повна / відформатована версія:

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 байт

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

Примітка: містить двійкові файли, не копіюючи їх тут. Копіювання-вставлення з TIO повинно працювати.

Спробуйте в Інтернеті!

Ви можете перевірити довільні дати, замінивши .d2на початку з 3-кортежем (рік, місяць, день) , як це: (2020 2 29).

Це було трохи дратівливо, оскільки Pyth не має жодного способу отримати "день року", тому мені довелося сам обчислити його.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.