Keluarkan tanggal dalam kalender Mel


8

Kalender Mel digunakan dalam dunia fiksi Kaldia. Tujuan Anda adalah untuk mengubah tanggal menjadi kalender Mel.

Kalender ini masing-masing memiliki 13 bulan 28 hari, ditambah 1 atau 2 hari ekstra setelah bulan lalu. Satu tahun yang dapat dibagi oleh 4 tetapi tidak oleh 100, atau dibagi oleh 400 memiliki 366 hari, dan tahun-tahun lainnya memiliki 365 (yaitu aturan tahun kabisat kami, tetapi dengan tahun dalam kalender Mel).

Anda harus menggunakan singkatan nama bulan dan hari :

bulan: dia vio lis gil ful dyu mel ral zan sobat mik fav ruj

hari: dia vio lis gil ful dyu mel ral zan pal mik fav ruj ser rav tan lin rez jil din ket len ​​lax nen pin mat kun mir

Hari tambahan di luar bulan apa pun memiliki nama bulan myuxet(tidak ada singkatan di sini), dan nama hari masing-masing adalah axetdan teems.

0 dia dia adalah 1988/11/30.

Anda dapat mengambil tanggal input sebagai string atau tupel (tahun, bulan, hari); sebagai alternatif, untuk fungsi, parameter bisa dalam tipe tanggal perpustakaan standar Anda. Outputnya harus berupa string yang dipisahkan spasi.

Uji kasus

1776-07-04 => -213 ral ket
1859-12-15 => -129 dia rav
1917-04-14 => -72 ful nen
1981-02-04 => -8 lis mik
1988-11-30 => 0 dia dia
1988-12-01 => 0 dia vio
1988-12-28 => 0 vio dia
2017-01-01 => 28 vio ful
2019-04-22 => 30 dyu lis
2019-11-30 => 30 myuxet axet
2019-12-01 => 31 dia dia
2021-11-29 => 32 myuxet axet
2021-11-30 => 32 myuxet teems
2089-11-30 => 101 dia dia
2389-11-30 => 400 myuxet teems

Anda harus dapat menangani tanggal dari setidaknya 1 AD hingga 9999 AD.

Implementasi referensi dalam Perl 6

Celah standar dilarang.


3
Anda mungkin harus memasukkan dalam posting Anda itu axetdan teemspada akhir tahun, saya bingung sampai saya melihat tautan
Perwujudan Ketidaktahuan

Itu harus berupa string yang dipisahkan ruang.
bb94

Bisakah kita mengambil input sebagai tiga nilai bernama tuple atau daftar tiga nilai setiap tahun, bulan, dan hari yang menandakan?
Perwujudan Ketidaktahuan

1
Ya itu baik baik saja.
bb94

Bisakah kita menampilkan bulan dan hari dalam Judul Kasus? -213 Ral Ket?
Adám

Jawaban:


4

Perl 6 , 174 byte

{~(.year,(|[X]("diaviolisgilfuldyumelralzanpalmikfavrujserravtanlinrezjildinketlenlaxnenpinmatkunmir".comb(3)xx 2)[^364],|("myuxet"X <axet teems>))[.day-of-year-1])}o*-726436

Cobalah online!

Buat daftar semua tanggal yang valid dan kemudian indeks hari dalam setahun ke dalam daftar itu.

Penjelasan

{                                                   }  # Anonymous code block
                                                     o*-726436  # Subtract some days from the input
  (.year,                               # Output the year
           [X]("...".comb(3))[^365]     # Then produce a list of all months/days
         (|                        ,
          |("myuxet"X <axet teems>))    # And the extra days
                                    [.day-of-year-1]   # And get the current date
 ~   # Stringify the list

3

Ruby , 199 195 193 byte

Oof, hanya 23 27 29 byte yang disimpan di atas kode Perl sampel ...

-4 byte dari @NickKennedy.

-2 byte dari @Neil.

->d{d-=62764e6;y=d.yday;s="diaviolisgilfuldyumelralzanpalmikfavrujserravtanlinrezjildinketlenlaxnenpinmatkunmir".scan /.../;[d.year,y<364?s[y/28]:"myuxet",(y<364?s:%w[axet teems])[y%28-1]]*' '}

Cobalah online!


1
195 byte (dengan menggunakan angka yang kurang tepat untuk pengurangan) tio.run/##PY3bjoIwFEXf/QqCGi@xSKtykUF/…
Nick Kennedy

1
193 byte dengan menggunakan y<364alih-alih m<13dan kemudian menggarisbawahi penggunaan terakhir m. Cobalah online!
Neil

3

Japt -S , 148 byte

ÐUVW;f1Uf -726436
-ÐTT i1Ui¹z864e5
`¹avio¦sgÅ~ldyu´llzpal·kfavruj rvt¦nzjÅanket¤nlaxnpµtkun·r`pD ò3
[Ui Vz28 gW¯D p"myuxet")VgWp"axet"`ems`]

Disimpan 4 byte berkat @Shaggy. + Lebih banyak byte karena perbaikan bug. Membutuhkan bulan sebagai angka yang diindeks 0.

Japt memang memiliki penanganan tanggal bawaan, tapi itu tidak terlalu baik. Serius, 34 byte untuk menginisialisasi tanggal, lalu kurangi hari darinya, dan kemudian hitung hari apa dalam setahun?

Cobalah

ÐUVW;                Initialize date object with given inputs
f1Uf -726436         Subtract 726436 days; Store in variable 'U'
-ÐTT i1Ui¹z864e5     Store the day of year in variable 'V'
`...`                Compressed string of all the days
  pD                 Repeated 13 times
    ò3               Split into chunks, where each chunks is 3 chars long, store in variable 'W'
[Ui                  Year
Vz28 gW¯D p"myuxet") Month
VgWp"axet"`ems`]    Day

1
Karena format output ketat (tidak perlu), ini harus "Japt -S". Anda dapat menyimpan 2 byte dengan mengganti kedua kejadian 13dengan D. Saya akan melihat lagi di pagi hari (ketika saya tidak turun pub, di ponsel saya) untuk melihat apakah saya dapat melihat penghematan lain tetapi memiliki +1sementara untuk mengalahkan Jelly dengan selisih yang signifikan.
Shaggy

Baru saja melihat sT; ada jalan pintas untuk itu;)
Shaggy

Sayangnya, sepertinya jumlah byte Anda tidak aktif; TIO menghitung dalam SBCS bukannya UTF-8.
Shaggy

2

Jelly , 181 164 byte

“BƥṠĿZȧ{ḷċ'#1ƇIræżzḤ$ḅ3ṃefɲ⁴S⁵ẊKḲ&8ɲz⁸Ẋ⁼ṣẸÇɼ:İ~¢ȥ³QⱮ:Ṗỵrɼ¬ṂĿZ⁵ṣ»Ḳḣ€3ḣ13pƊ;“¬ỵƇnḄẋFƬ@§Żị»ḲḢWpƊ¤
“ÇġƁʠÇỤḷṁÑWðṫ⁷m¥ṛʂɲðḊk¶`Ḣ»ḲjḢ$;;“","%Y%m%d"))+3499e5)”ŒVm7_2ȷ;ị¢$}ʋ/K

Cobalah online!

Jelly tidak memiliki penanganan tanggal bawaan, jadi ini kembali pada fungsi dalam modul waktu Python.

Penjelasan

“Bƥ...⁵ṣ»                      | Compressed string "diact viol lisk gild full dyu mela rale zanja palay miked fava ruj ser rave tanas linac rez jilt dinar ket lend lax nene pinas mat kune mire"
         Ḳ                     | split at spaces
          ḣ€3                  | first 3 characters of each
                 Ɗ             | following links as a monad
             ḣ13               |    first 13
                p              |    Cartesian product (with all 28)
                 ;           ¤ | concatenate to:
                  “¬...ị»      |   compressed string "myuxet axet teems"
                         Ḳ     |   split at spaces
                            Ɗ  |   following two links as a monad
                          Ḣ    |     head
                           p   |     Cartesian product (with last two)

“Ç...Ḣ»                             | Compressed string 'time  .local ( .mk ( .strp ("'
       Ḳ                            | split at spaces
        jḢ$                         | join using first item (i.e. time)
           ;                        | concatenate to input
            ;“"...)”                | concatenate this to '","%Y%m%d"))+3499e5)'
                    ŒV              | eval as Python
                      m7            | take every 7th item (year and day in year)
                                ʋ/  | reduce using following links as a dyad
                        _2ȷ         |   subtract 2000 (from first value, the year)
                           ;ị¢$}    |   concatenate with right argument (day in year) indexed into above link
                                  K | join with spaces

1
" Ini jatuh pada fungsi dalam modul waktu Python. " Ah, pintar! Saya mencoba membuat jawaban di 05AB1E (juga tidak memiliki tanggal bawaan), dan meskipun saya bisa mendapatkan jumlah hari antara 1988-11-30 dan tanggal input, itu tidak terlalu berguna karena saya memerlukan tanggal -perbedaan (tahun, bulan, dan hari) alih-alih perbedaan hari. Saya telah melakukan beberapa tantangan terkait tanggal lainnya di 05AB1E di masa lalu (yaitu yang ini dan beberapa turunannya). Saya mungkin mencoba lagi dengan bagian kode sebagai Python terkompresi, terinspirasi oleh Anda. :)
Kevin Cruijssen

Biarkan saya menebak: string pertama ( diact viol lisk...) ditulis aneh untuk mengompres lebih baik?
bb94

@ bb94 ya itu menggunakan kata kamus terpendek untuk masing-masing di mana ada tersedia.
Nick Kennedy

Itu sebenarnya sangat pintar.
bb94


1

JavaScript (ES6), 297 269 252 249 245 byte

f=
d=>(d=new Date(+d+3498336e5),d=(d-Date.UTC(y=d.getUTCFullYear(a=`diaviolisgilfuldyumelralzanpalmikfavrujserravtanlinrezjildinketlenlaxnenpinmatkunmir`.match(/.../g))))/864e5,y-2e3+` ${d<364?a[d/28|0]+` `+a[d%28]:`myuxet ${d&1?`teems`:`axet`}`}`)
<input type=date oninput=o.textContent=f(this.valueAsDate)><pre id=o>

Mengambil input sebagai objek tanggal JavaScript dalam UTC (akan 1 byte lebih sedikit sebagai nomor cap waktu JavaScript). Sunting: Disimpan 3 7 byte berkat @Arnauld.

Cobalah online! jika cuplikan masih tidak berfungsi untuk Anda karena alasan tertentu.


Sayangnya, saya mendapatkan sesuatu seperti 30 dyu undefinedini di Firefox.
bb94

Sama di sini di chrome
Perwujudan Ketidaktahuan

@ bb94 Aneh, saya menggunakan Firefox ...
Neil

@EmbodimentofIgnorance Saya telah mengubah sedikit cuplikan, apakah itu membantu?
Neil

1
@Arnauld Ya, saya baru saja sampai pada kesimpulan yang sama. Untungnya Date.UTCpanjangnya sama dengan new Date!
Neil

1

Haskell , 387 373 372 byte

import Data.Time.Calendar
t(a:b:c:r)=[a,b,c]:t r
t _=[]
w=t"diaviolisgilfuldyumelralzanpalmikfavrujserravtanlinrezjildinketlenlaxnenpinmatkunmir"
(%)=mod
a y=map(show y++)$[' ':m++' ':d|m<-take 13 w,d<-w]++" myuxet axet":[" myuxet teems"|y%4<1,y%400<1||y%100>0]
f d|n<-read.show$diffDays d$fromGregorian 1988 11 30=last$(a=<<[0..])!!n:[(reverse.a=<<[-1,-2..])!!(-n-1)|n<0]

Cobalah online!

Mengambil input sebagai Dayobjek.

Ini cukup menyenangkan untuk ditulis! Ide dasarnya adalah membuat daftar tanggal dan mengindeksnya untuk hasilnya. Fungsi amembutuhkan waktu satu tahun dan menghasilkan setiap tanggal pada tahun itu dalam urutan kronologis. Fungsi fmeluas untuk amenyatukan mereka bersama-sama selama bertahun-tahun berturut-turut mulai dari 0. Kuncinya adalah bahwa untuk tanggal sebelum zaman kita perlu melintasi mundur mulai dari tahun -1 sehingga kita melewati nilai -1, -2 ... dan membalikkan setiap daftar secara individu sebelum menyatukan mereka. Akhirnya, dalam fungsi fkami menghitung jumlah hari antara zaman dan tanggal kami (mengubahnya dari Integermenjadi Int) dan indeks ke dalam daftar kami, berhati-hati untuk memperbaiki indeks kami jika itu negatif.

SUNTING: memutarnya (-14)

EDIT 2: bermain golf pada daftar nama hari / bulan (-1)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.