Hoy en el YOLD

15

El calendario discordiano es un calendario alternativo utilizado por los discordianos.

  1. El año discordiano tiene 5 estaciones, cada una de 73 días: Caos, Discordia, Confusión, Burocracia y Las secuelas.
  2. La semana discordiana tiene 5 días: Sweetmorn, Boomtime, Pungenday, Prickle-Prickle y Setting Orange. Cada año comienza con Sweetmorn (y en Chaos).
  3. Cada f años ourth (que Happe n es para alinear con Greg o rian salto sí r s), un extra d se inserta ay entre el caos 59 y el Caos 60 llamado el Día de San Tib . Está fuera de la semana discordiana, lo que significa que el día después del Día de San Tib será el Naranja, el día anterior a Prickle-Prickle.
  4. Los calendarios gregoriano y discordiano se alinean; ambos comienzan el mismo día, que se llama 1 de enero en el calendario gregoriano, y el Caos 1 en el discordiano.
  5. El primer año de Nuestra Señora de la Discordia (YOLD 1) fue 1166 AC en el calendario gregoriano, lo que significa que este año (2017 DC) es YOLD 3183.
  6. El calendario discordiano también tiene días festivos, pero no son importantes para este desafío y no debes publicarlos ni nada sobre ellos.

Escriba un programa o función que genere o devuelva la fecha de hoy (en el momento de la ejecución):

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

El formato es "Today is $day_of_the_week, the $ordinal day of $season in the YOLD $year", donde $ day_of_the_week es el día en mayúscula (título-caso) de la semana, $ ordinal es el día de la temporada como ordinal (1st, 2nd, 3rd, 4th, ...), $ season es en mayúscula (título-caso) temporada, y $ año es el año.

Si su programa o función se ejecuta en el Día de San Tib, en su lugar, debería generar o regresar "Today is St. Tib's Day in the YOLD $year".

Reglas:

  • Se aplican lagunas estándar.
  • Si su idioma de elección no tiene forma de obtener la fecha actual, también puede tomar la fecha gregoriana actual en cualquier formato razonable como entrada.
  • Este es el , gana el código más corto (por idioma).
  • El espacio en blanco al final está bien.
  • La capitalización importa.
  • ddateEstá prohibido llamar de cualquier manera
  • Se debe garantizar que su programa funcione de 3067 a 3265 YOLD (1901 a 2099 AD), fuera de ese rango puede dar valores incorrectos

Ver también:

L3viatán
fuente
44
discord es un
excelente
1
Creo que hoy es el día 16 de confusión? ¿Qué fecha representa el ejemplo?
user202729
2
no relacionado
Jonathan Allan
1
@ user202729 Sí, la fecha en el ejemplo es de cuando escribí originalmente el desafío, lo actualizaré para mostrar la fecha de hoy, que es el día 16 de Confusión.
L3viathan
1
@ L3viathan en ese caso (para aquellos que usan un idioma con un gran tipo nativo) ¿puede aclarar a) cómo manejar los años de cambio de siglo que no son años bisiestos en la gregoriana como "cada 4to año" de las contradicciones de la discordia cal con "se alinea con el gregoriano" b) cómo manejar años antes de la introducción del gregoriano cal. Estaba sugiriendo el rango máximo que está definido adecuadamente por su especificación actual. Si rechaza esto, debe definir qué debe hacer el programa fuera de ese rango. También debe evitar invalidar la respuesta existente. en.wikipedia.org/wiki/Gregorian_calendar
Level River St

Respuestas:

5

Mathematica, 403 401 bytes

Versión para contar el número de bytes: (espacios eliminados y nuevas líneas; desafortunadamente, esta parte es 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~"-"

Versión para leer:

"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 respuesta puede ser probada con fecha arbitraria mediante la sustitución de DateString@"ISOOrdinalDate"por DateString[{year,month,day},"ISOOrdinalDate"]para year, monthy daysustituye por números.

usuario202729
fuente
¿Cómo puedo probar el código de Mathematica?
L3viathan
66
"¿No has construido?"
Jonathan Allan
4

Python 2, 423 bytes

Version corta:

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 más larga y legible:

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
    )

Actualización: corregido con la ayuda de los grandes @Neil y @EriktheOutgolfer. Pero la respuesta de @Jonathans es mucho más corta.

jammon
fuente
2
¡Bienvenido a Program Puzzles & Code Golf!
Dada
3
¿Produce esto el sufijo correcto para el 21, 22, 23 ... 73? @ L3viathan y%4<1funcionaría, pero no creo 1-y%4que lo haga .
Neil
1
Golf trivial de 44 bytes.
Erik the Outgolfer
@EriktheOutgolfer ¿No puede guardar otros 4 bytes eliminando la evariable?
Neil
Bienvenido a PPCG! Bonito primer post. Yo estaba planeando para darle un poco aquí y allá, pero se dio cuenta y solucionado el problema y el sufijo Jugamos al golf el código más de lo que pensaba que iba a por lo que terminó la presentación de mi propia versión.
Jonathan Allan
2

Python 2 , 346 bytes

Nota: Este es un campo de golf (y una solución) de la respuesta de Jammon : originalmente pensé en enviar un comentario, pero al final cambié bastante (además, los sufijos diarios se han solucionado).

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]

Pruébalo en línea! o ver algunas fechas de prueba codificadas .

Jonathan Allan
fuente
¿Supongo que no e%10*(e/9!=1)funciona?
Neil
No, entonces se imprimiría 11st, 12sty 13st(cuando e/9es 1 se multiplicaría por cero y minelegiría ese cero)
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 un parámetro de fecha opcional. Sin golf:

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

Versión completa / formateada:

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

Pyth , 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: contiene binario, puede que no sea seguro copiar y pegar desde aquí. Copiar y pegar desde TIO debería funcionar.

Pruébalo en línea!

Puede probar fechas arbitrarias reemplazando .d2al principio con 3 tuplas de (año, mes, día) así:(2020 2 29) .

Este fue un poco molesto ya que Pyth no tiene forma de obtener el "día del año", así que tuve que calcularlo yo mismo.

randomdude999
fuente