Сегодня в YOLD

15

Discordian календарь является альтернативой календарь , используемый Discordians.

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

Напишите программу или функцию, которая выводит или возвращает сегодняшнюю дату (во время выполнения):

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 - это день недели с заглавной буквы (case-title), $ ordinal - это день сезона как порядковый номер (1-й, 2-й, 3-й, 4-й, ...), $ season - с большой буквы. (title-case) сезон, а $ year - это год.

Если ваша программа или функция выполняется в День Святого Тибра, она должна вместо этого выводить или возвращать "Today is St. Tib's Day in the YOLD $year".

Правила:

  • Применяются стандартные лазейки.
  • Если ваш выбранный язык не может получить текущую дату, он также может принять текущую григорианскую дату в любом приемлемом формате в качестве входных данных.
  • Это , выигрывает самый короткий код (для каждого языка).
  • Задний пробел в порядке.
  • Вопросы капитализации.
  • Звонки ddateлюбым способом запрещены
  • Ваша программа должна гарантированно работать с 3067 до 3265 YOLD (с 1901 по 2099 г. н.э.), за пределами этого диапазона она может давать неправильные значения

Смотрите также:

L3viathan
источник
4
Discord - классный клиент для обмена мгновенными сообщениями
Okx
1
Я думаю сегодня 16 день путаницы? Какую дату представляет пример?
user202729
2
не связано
Джонатан Аллан
1
@ user202729 Да, в этом примере указана дата, когда я изначально написал задачу, я обновлю ее, чтобы показать сегодняшнюю дату, которая действительно является 16-м днем ​​путаницы.
L3viathan
1
@ L3viathan в этом случае (для тех, кто использует язык с большим нативным типом), вы можете уточнить: а) как обращаться с рублевыми годами, которые не являются високосными в григорианском кале, поскольку «каждый 4-й год» противоречивого кал противоречит с «выравнивает по григорианскому» б) как справиться с годами до введения григорианского кал. Я предлагал максимальный диапазон, который правильно определен вашей текущей спецификацией. Если вы отклоните это, вы должны определить, что программа должна делать за пределами этого диапазона. Также вы должны избегать аннулирования существующего ответа. ru.wikipedia.org/wiki/Gregorian_calendar
Level River St

Ответы:

5

Mathematica, 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заменены числами.

user202729
источник
Как я могу проверить код Mathematica?
L3viathan
6
"Разве нет встроенного?"
Джонатан Аллан
4

Python 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 намного короче.

jammon
источник
2
Добро пожаловать на программирование головоломок и Code Golf!
Дада
3
Создает ли это правильный суффикс для 21-го, 22-го, 23-го ... 73-го? @ L3viathan y%4<1будет работать, но я не думаю, что 1-y%4будет.
Нил
@EriktheOutgolfer Не можете ли вы сохранить еще 4 байта, удалив eпеременную?
Нил
Добро пожаловать в PPCG! Хороший первый пост. Я был планирую дать вам немного здесь и там, но заметил и исправил проблему суффикса и golfed кода больше , чем я думал , так что я в конечном итоге представив свою версию.
Джонатан Аллан
2

Python 2 , 346 байт

Примечание: это гольф (и исправление) ответа jammon - изначально я думал, что отправлю комментарий, но в конце я немного изменился (плюс суффиксы дня были исправлены).

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

Принимает необязательный параметр даты. 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 байта

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();
    }
}
TheLethalCoder
источник
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).

Этот был немного раздражающим, так как у Пита нет никакого способа получить «день года», поэтому мне пришлось вычислить его самому.

randomdude999
источник