Hari ini di YOLD

15

The kalender Discordian adalah kalender alternatif yang digunakan oleh Discordians.

  1. Tahun perselisihan memiliki 5 musim, masing-masing berlangsung selama 73 hari: Kekacauan, Perselisihan, Kebingungan, Birokrasi, dan Buntutnya.
  2. Minggu yang tidak sesuai memiliki 5 hari: Sweetmorn, Boomtime, Pungenday, Prickle-Prickle, dan Setting Orange. Setiap tahun dimulai dengan Sweetmorn (dan dalam Kekacauan).
  3. Setiap f tahun ourth (yang Happe n s untuk menyelaraskan dengan Greg o rian lompatan ya r s), tambahan d ay dimasukkan antara Chaos 59 dan Chaos 60 disebut Hari St. Tib . Itu di luar minggu Discordian, yang berarti sehari setelah Hari St. Tib akan Setting Orange, sehari sebelum Prickle-Prickle.
  4. Kalender Gregorian dan Discordian berbaris; keduanya dimulai pada hari yang sama, yang disebut 1 Januari di kalender Gregorian, dan Chaos 1 dalam satu Discordian.
  5. Tahun pertama Our Lady of Discord (YOLD 1) adalah 1166 SM dalam kalender Gregorian, artinya tahun ini (2017 M) adalah YOLD 3183.
  6. Kalender Discordian juga memiliki hari libur, tetapi mereka tidak penting untuk tantangan ini dan Anda tidak boleh menampilkannya atau apa pun tentang mereka.

Tulis program atau fungsi yang menampilkan atau mengembalikan tanggal hari ini (pada saat eksekusi):

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

Formatnya adalah "Today is $day_of_the_week, the $ordinal day of $season in the YOLD $year", di mana $ day_of_the_week adalah hari kapitalisasi (judul-kasus) dalam seminggu, $ ordinal adalah hari musim sebagai ordinal (1, 2, 3, 4, ...), $ musim adalah huruf kapital musim (judul-kasus), dan $ tahun adalah tahun.

Jika program atau fungsi Anda dieksekusi pada Hari St. Tib, itu seharusnya menghasilkan atau mengembalikan "Today is St. Tib's Day in the YOLD $year".

Aturan:

  • Celah standar berlaku.
  • Jika bahasa pilihan Anda tidak memiliki cara untuk mendapatkan tanggal saat ini, itu juga dapat mengambil tanggal Gregorian saat ini dalam format yang masuk akal sebagai masukan.
  • Ini adalah , kode terpendek (per bahasa) menang.
  • Trailing whitespace tidak apa-apa.
  • Huruf besar penting.
  • Panggilan ddatedengan cara apa pun dilarang
  • Program Anda harus dijamin bekerja dari 3067 hingga 3265 YOLD (1901 hingga 2099 M), di luar rentang itu dapat memberikan nilai yang salah

Lihat juga:

L3viathan
sumber
4
perselisihan adalah klien perpesanan instan yang keren
Okx
1
Saya pikir hari ini adalah hari ke 16 Kebingungan? Tanggal berapa yang dicontohkan oleh contoh?
user202729
2
tidak terkait
Jonathan Allan
1
@ user202729 Ya, tanggal dalam contoh ini adalah dari saat saya awalnya menulis tantangan, saya akan memperbaruinya untuk menampilkan tanggal hari ini, yang memang merupakan hari ke 16 Kebingungan.
L3viathan
1
@ L3viathan dalam kasus itu (bagi mereka yang menggunakan bahasa dengan tipe asli besar) dapatkah Anda mengklarifikasi a) bagaimana menangani pergantian tahun abad yang bukan tahun kabisat dalam kal gregorian sebagai "setiap tahun ke-4" dari kal yang bertentangan bertentangan dengan "sejajar dengan gregorian" b) bagaimana menangani tahun sebelum pengenalan cal gregorian. Saya menyarankan kisaran maks yang ditentukan dengan benar oleh spesifikasi Anda saat ini. Jika Anda menolak ini, Anda harus menentukan apa yang harus dilakukan program di luar rentang itu. Anda juga harus menghindari membatalkan jawaban yang ada. en.wikipedia.org/wiki/Gregorian_calendar
Level River St

Jawaban:

5

Mathematica, 403 401 byte

Versi untuk menghitung jumlah byte: (menghapus spasi dan baris baru - sayangnya bagian ini cukup sulit)

"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 untuk dibaca:

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

Jawabannya dapat diuji dengan tanggal sewenang-wenang dengan mengganti DateString@"ISOOrdinalDate"dengan DateString[{year,month,day},"ISOOrdinalDate"]untuk year, monthdan daydiganti dengan angka.

pengguna202729
sumber
Bagaimana saya bisa menguji kode Mathematica?
L3viathan
6
"Tidak ada barang bawaan?"
Jonathan Allan
4

Python 2, 423 Bytes

Versi pendek:

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)

Bentuk yang lebih panjang dan lebih mudah dibaca:

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
    )

Pembaruan: Diperbaiki dengan bantuan @Neil dan @EriktheOutgolfer yang hebat. Tapi jawaban Jonathans jauh lebih pendek.

jammon
sumber
2
Selamat datang di Programming Puzzles & Code Golf!
Dada
3
Apakah ini menghasilkan akhiran yang tepat untuk 21, 22, 23 ... 73? @ L3viathan y%4<1akan bekerja, tapi saya pikir tidak 1-y%4akan berhasil.
Neil
1
Golf sepele 44 byte.
Erik the Outgolfer
@EriktheOutgolfer Tidak bisakah Anda menyimpan 4 byte lagi dengan menghilangkan evariabel?
Neil
Selamat datang di PPCG! Posting pertama yang bagus. Saya sedang berencana untuk memberikan sedikit off di sana-sini, tapi melihat dan tetap masalah akhiran dan golfed kode lebih daripada yang saya pikir saya akan jadi aku akhirnya mengirimkan versi saya sendiri.
Jonathan Allan
2

Python 2 , 346 byte

Catatan: Ini adalah golf (dan perbaikan) dari jawaban jammon - Awalnya saya pikir saya akan mengirim komentar, tapi saya sedikit berubah pada akhirnya (ditambah akhiran hari telah diperbaiki).

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]

Cobalah online! atau lihat tanggal tes yang dikodekan dengan keras .

Jonathan Allan
sumber
Saya kira tidak e%10*(e/9!=1)berhasil?
Neil
Tidak, maka ia akan mencetak 11st, 12stdan 13st(kapan e/91 akan dikalikan dengan nol dan minakan memilih nol)
Jonathan Allan
2

JavaScript (ES6), 387 380 byte

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

Mengambil parameter tanggal opsional. Tidak Disatukan:

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

C #, 392 byte

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 Lengkap / Terformat:

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

Pyth , 295 byte

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

Catatan: mengandung biner, mungkin tidak aman untuk disalin-tempel dari sini. Copy-paste dari TIO harus berfungsi.

Cobalah online!

Anda dapat menguji tanggal sewenang-wenang dengan mengganti .d2di awal dengan 3-tupel (tahun, bulan, hari) seperti ini: (2020 2 29).

Yang ini agak menjengkelkan karena Pyth tidak punya cara untuk mendapatkan "hari tahun" jadi saya harus menghitungnya sendiri.

randomdude999
sumber