Xuất ngày trong lịch Mel


8

Lịch Mel được sử dụng trong thế giới hư cấu của Kaldia. Mục tiêu của bạn là chuyển đổi ngày thành lịch Mel.

Lịch này có 13 tháng mỗi 28 ngày, cộng thêm 1 hoặc 2 ngày sau tháng cuối cùng. Một năm chia hết cho 4 nhưng không chia hết cho 100 hoặc chia hết cho 400 có 365 ngày và các năm khác có 365 (tức là quy tắc năm nhuận của chúng tôi, nhưng có năm trong lịch Mel).

Bạn nên sử dụng tên viết tắt tháng và ngày :

tháng: dia vio lis gil Ful dyu mel ral zan pal mik fav ruj

ngày: 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

Các ngày thêm bên ngoài của bất kỳ tháng nào có tên tháng myuxet(không viết tắt ở đây) và tên ngày tương ứng là axetteems.

0 dia dia là 1988/11/30.

Bạn có thể lấy ngày đầu vào dưới dạng một chuỗi hoặc một tuple (năm, tháng, ngày); cách khác, đối với các hàm, tham số có thể nằm trong loại ngày của thư viện chuẩn của bạn. Đầu ra phải là một chuỗi phân tách không gian.

Các trường hợp thử nghiệm

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

Bạn sẽ có thể xử lý ít nhất là từ 1 AD đến 9999 AD.

Tham chiếu thực hiện trong Perl 6

Sơ hở tiêu chuẩn bị cấm.


3
Có lẽ bạn nên đưa vào bài đăng của mình axetteemsvào cuối năm, tôi đã bối rối cho đến khi tôi nhìn vào liên kết
Hiện thân của sự thiếu hiểu biết

Nó phải là một chuỗi phân tách không gian.
bb94

Chúng ta có thể lấy đầu vào dưới dạng ba giá trị có tên là tuple hoặc danh sách ba giá trị mỗi năm, tháng và ngày không?
Hiện thân của sự thiếu hiểu biết

1
Vâng, điều đó tốt.
bb94

Chúng tôi có thể đầu ra tháng và ngày trong trường hợp tiêu đề? -213 Ral Ket?
Adám

Câu trả lời:


4

Perl 6 , 174 byte

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

Hãy thử trực tuyến!

Tạo một danh sách tất cả các ngày hợp lệ và sau đó lập chỉ mục ngày trong năm vào danh sách đó.

Giải trình

{                                                   }  # 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, chỉ có 23 27 29 byte được lưu trên mã Perl mẫu ...

-4 byte từ @NickKennedy.

-2 byte từ @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]]*' '}

Hãy thử trực tuyến!


1
195 byte (bằng cách sử dụng một số ít chính xác hơn cho phép trừ) tio.run/##PY3bjoIwFEXf/QqCGi@xSKtykUF/ Lỗi
Nick Kennedy

1
193 byte bằng cách sử dụng y<364thay vì m<13và sau đó nội tuyến sử dụng cuối cùng m. Hãy thử trực tuyến!
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`]

Đã lưu 4 byte nhờ @Shaggy. + Nhiều byte hơn do sửa lỗi. Mất vài tháng là số 0 được lập chỉ mục.

Japt có xử lý ngày tháng tích hợp, nhưng nó không tốt lắm. Nghiêm túc, 34 byte để khởi tạo một ngày, sau đó trừ ngày từ nó, và sau đó tính ngày nào trong năm?

Thử nó

Ð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
Do định dạng đầu ra nghiêm ngặt (không cần thiết), đây phải là "Japt -S". Bạn có thể lưu 2 byte bằng cách thay thế cả hai lần xuất hiện 13bằng D. Tôi sẽ có một cái nhìn khác vào buổi sáng (khi tôi không xuống quán rượu, trên điện thoại của mình) để xem liệu tôi có thể thấy bất kỳ khoản tiết kiệm nào khác không nhưng +1trong lúc đó tôi sẽ đánh bại Jelly bằng một mức đáng kể.
Xù xì

Chỉ cần phát hiện ra sT; có một lối tắt cho điều đó;)
Shaggy

Đáng buồn thay, có vẻ như số byte của bạn bị tắt; TIO đang tính bằng SBCS thay vì UTF-8.
Xù xì

2

Thạch , 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

Hãy thử trực tuyến!

Jelly không có xử lý ngày tích hợp, do đó, điều này rơi vào chức năng trong mô-đun thời gian của Python.

Giải trình

“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
" Điều này rơi trở lại vào chức năng trong mô-đun thời gian của Python. " Ah, thông minh! Tôi đã cố gắng đưa ra câu trả lời trong 05AB1E (cũng thiếu nội dung ngày tháng) và mặc dù tôi có thể nhận được số ngày trong khoảng thời gian từ 1988-11-30 và ngày đầu vào, nhưng nó thực sự hữu ích vì tôi cần ngày -difference (năm, tháng và ngày) thay vì ngày khác biệt. Tôi đã thực hiện một vài thử thách liên quan đến ngày khác trong 05AB1E trong quá khứ (tức là cái này và một số dẫn xuất). Tôi có thể thử lại với một phần mã dưới dạng Python nén, được truyền cảm hứng từ bạn. :)
Kevin Cruijssen

Hãy để tôi đoán: chuỗi đầu tiên ( diact viol lisk...) được viết kỳ lạ để nén tốt hơn?
bb94

@ bb94 có, nó sử dụng từ điển ngắn nhất cho mỗi nơi có sẵn.
Nick Kennedy

Điều đó thực sự rất thông minh.
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>

Lấy đầu vào dưới dạng đối tượng ngày JavaScript trong UTC (sẽ ít hơn 1 byte dưới dạng số dấu thời gian JavaScript). Chỉnh sửa: Đã lưu 3 7 byte nhờ @Arnauld.

Hãy thử trực tuyến! nếu đoạn mã vẫn không hoạt động cho bạn vì một số lý do.


Thật không may, tôi nhận được một cái gì đó như thế 30 dyu undefinednày trên Firefox.
bb94

Tương tự ở đây trên chrome
Hiện thân của sự thiếu hiểu biết

@ bb94 Odd, tôi sử dụng Firefox ...
Neil

@EmbodimentofIgnorance Tôi đã điều chỉnh đoạn trích một chút, điều đó có giúp ích gì không?
Neil

1
@Arnauld Vâng, tôi vừa đi đến kết luận tương tự. May mắn Date.UTClà chiều dài tương tự như 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]

Hãy thử trực tuyến!

Đưa đầu vào như một Dayđối tượng.

Điều này khá thú vị để viết! Ý tưởng cơ bản là xây dựng một danh sách các ngày và chỉ mục vào đó cho kết quả. Hàm amất một năm và xuất ra mỗi ngày trong năm đó theo thứ tự thời gian. Chức năng fmở rộng trêna kết hợp chúng lại với nhau trong nhiều năm liên tiếp bắt đầu từ 0. Bí quyết là đối với các ngày trước kỷ nguyên chúng ta cần di chuyển ngược bắt đầu từ năm -1 để chúng ta chuyển các giá trị -1, -2 ... và đảo ngược từng danh sách cá nhân trước khi nối chúng lại với nhau. Cuối cùng, trong chức năng, fchúng tôi tính toán số ngày giữa kỷ nguyên và ngày của chúng tôi (chuyển đổi từ Integerthành Int) và lập chỉ mục vào danh sách của chúng tôi, chú ý sửa chỉ mục của chúng tôi nếu nó âm.

EDIT: đánh gôn xuống (-14)

EDIT 2: đánh xuống danh sách tên ngày / tháng (-1)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.