Hoje no YOLD

15

O calendário Discordian é um calendário alternativo usado pelos Discordians.

  1. O ano discordante tem 5 temporadas, cada uma com 73 dias de duração: Caos, Discórdia, Confusão, Burocracia e Consequências.
  2. A semana discordante tem 5 dias: Sweetmorn, Boomtime, Pungenday, Prickle-Prickle e Setting Orange. Todo ano começa com Sweetmorn (e no Caos).
  3. Cada f ano ourth (que happe n s para alinhar com Greg o rian salto sim r s), um extra d é inserido entre ay caos 59 e 60 caos chamado dia de St Tib . Fica fora da semana discordiana, o que significa que o dia seguinte ao dia do St. Tib será Laranja, no dia anterior a Prickle-Prickle.
  4. Os calendários gregoriano e discordiano se alinham; ambos começam no mesmo dia, que é chamado 1º de janeiro no calendário gregoriano, e Caos 1 no calendário discordiano.
  5. O primeiro ano de Nossa Senhora da Discórdia (YOLD 1) foi 1166 aC no calendário gregoriano, o que significa que este ano (2017 AD) é YOLD 3183.
  6. O calendário discordiano também tem feriados, mas eles não são importantes para esse desafio e você não deve produzi-los ou qualquer coisa sobre eles.

Escreva um programa ou função que produza ou retorne a data de hoje (no momento da execução):

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

O formato é "Today is $day_of_the_week, the $ordinal day of $season in the YOLD $year", onde $ day_of_the_week é o dia da semana em maiúsculas (título), $ ordinal é o dia da temporada como ordinal (1, 2, 3, 4, ...), $ season é a capitalização temporada (título) e $ ano é o ano.

Se seu programa ou função for executado no dia de São Tib, ele deve gerar ou retornar "Today is St. Tib's Day in the YOLD $year".

Regras:

  • Aplicam-se brechas padrão.
  • Se o seu idioma de escolha não tem como obter a data atual, também pode levar a data gregoriana atual em qualquer formato razoável como entrada.
  • Este é o , o código mais curto (por idioma) vence.
  • O espaço em branco à direita é bom.
  • Problemas de capitalização.
  • As chamadas ddatede qualquer forma são proibidas
  • É garantido que seu programa funcione de 3067 a 3265 YOLD (1901 a 2099 dC), fora desse intervalo, ele pode fornecer valores incorretos

Veja também:

L3viathan
fonte
4
discord é um cliente legal de mensagens instantâneas
Okx
1
Eu acho que hoje é o 16º dia de confusão? Que data o exemplo representa?
user202729
2
não relacionado #
Jonathan Allan
1
@ user202729 Sim, a data no exemplo é de quando eu originalmente escrevi o desafio, vou atualizá-lo para mostrar a data de hoje, que é de fato o 16º dia de Confusão.
L3viathan
1
@ L3viathan nesse caso (para aqueles que usam um idioma com grande tipo nativo), você pode esclarecer a) como lidar com os anos do século que não são anos bissextos na escala gregoriana, já que "a cada quatro anos" da escala discordiana contradiz com "alinha com o gregoriano" b) como lidar anos antes da introdução do gregoriano cal. Eu estava sugerindo o intervalo máximo que é definido corretamente pelas suas especificações atuais. Se você rejeitar isso, defina o que o programa deve fazer fora desse intervalo. Além disso, você deve evitar a invalidação da resposta existente. en.wikipedia.org/wiki/Gregorian_calendar
Level River St

Respostas:

5

Mathematica, 403 401 bytes

Versão para contar o número de bytes: (espaços removidos e novas linhas - infelizmente esta parte é bastante difícil)

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

Versão a ler:

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

A resposta pode ser testado com data arbitrária, substituindo DateString@"ISOOrdinalDate"por DateString[{year,month,day},"ISOOrdinalDate"]para year, monthe daysubstituído por números.

user202729
fonte
Como posso testar o código do Mathematica?
L3viathan
6
"Não está embutido?"
Jonathan Allan
4

Python 2, 423 bytes

Versão curta:

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 mais longa e mais legível:

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
    )

Atualização: corrigida com a ajuda dos ótimos @Neil e @EriktheOutgolfer. Mas a resposta de @ Jonathan é muito menor.

jammon
fonte
2
Bem-vindo à programação de quebra-cabeças e código de golfe!
Dada
3
Isso produz o sufixo certo para 21, 22, 23 e 73? @ L3viathan y%4<1funcionaria, mas acho que não 1-y%4.
11117 Neil
1
Golfe trivial de 44 bytes.
Erik the Outgolfer
@EriktheOutgolfer Não é possível salvar outros 4 bytes eliminando a evariável?
11117 Neil
Bem-vindo ao PPCG! Bom primeiro post. Eu estava planejando lhe dar um pouco de folga aqui e ali, mas notei e corrigi o problema do sufixo e joguei o código mais do que eu pensava, então acabei enviando minha própria versão.
Jonathan Allan
2

Python 2 , 346 bytes

Nota: Este é um golfe (e correção) da resposta de jammon - eu originalmente pensei em enviar um comentário, mas mudei bastante no final (além dos sufixos do dia foram corrigidos).

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]

Experimente online! ou veja algumas datas de teste codificadas .

Jonathan Allan
fonte
Suponho que não e%10*(e/9!=1)funcione?
Neil
Não, então seria imprimir 11st, 12ste 13st(quando e/9é 1 seria multiplicar por zero eo minescolheria que zero)
Jonathan Allan
2

JavaScript (ES6), 387 380 bytes

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

Toma um parâmetro de data opcional. 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
fonte
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);}

Versão completa / formatada:

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

Pitão , 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

Nota: contém binário, pode não ser seguro copiar e colar a partir daqui. A cópia e colagem do TIO deve funcionar.

Experimente online!

Você pode testar datas arbitrárias substituindo .d2 no início por uma tupla de três (ano, mês, dia) assim:(2020 2 29) .

Este foi um pouco chato, já que Pyth não tem como obter o "dia do ano", então eu mesmo tive que calcular.

randomdude999
fonte