メルカレンダーに日付を出力する


8

メルカレンダーはカルディアの架空の世界で使用されています。あなたの目標は、日付をメルカレンダーに変換することです。

このカレンダーには、それぞれ28日間の13か月と、前月のあと1日または2日の余分な日があります。4で割り切れても100では割り切れない年、または400で割り切れる年には366日があり、その他の年には365日があります(つまり、うるう年の規則ですが、メルカレンダーには年があります)。

月と日の名前の省略形を使用する必要があります。

月: dia vio lis gil fulフルメルラルザンパルmik fav ruj

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

各月の外の追加日には、月名myuxet(ここでは省略形なし)があり、曜日名はそれぞれaxetおよびteemsです。

0 dia dia 1988/11/30です。

入力日付を文字列または(年、月、日)タプルとして取得できます。または、関数の場合、パラメーターを標準ライブラリの日付タイプにすることができます。出力はスペースで区切られた文字列でなければなりません。

テストケース

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

少なくとも1 ADから9999 ADまでの日付を処理できるはずです。

Perl 6のリファレンス実装

標準の抜け穴は禁止されています。


3
あなたはおそらくあなたの投稿にその年の終わりにそれaxetを含めるべきですteems、私がリンクを見るまで私は混乱しました
無知の具現化

スペースで区切られた文字列でなければなりません。
bb94

タプルという名前の3つの値、または年、月、日をそれぞれ表す3つの値のリストとして入力を取得できますか?
無知の

1
はい、大丈夫です。
bb94

タイトルケースに月日を出力できますか?-213 Ral Ket
アダム

回答:


4

Perl 6、174バイト

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

オンラインでお試しください!

すべての有効な日付のリストを生成し、そのリストに年間の日付を索引付けします。

説明

{                                                   }  # 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

Ruby199 195 193バイト

Oof、サンプルのPerlコードで保存されたのはわずか23 27 29バイト...

@NickKennedyから-4バイト。

@Neilから-2バイト。

->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]]*' '}

オンラインでお試しください!


1
195バイト(より正確でない数値を減算に使用)tio.run/##PY3bjoIwFEXf/QqCGi@xSKtykUF/…
Nick Kennedy

1
y<364代わりにm<13を使用して193バイト、次にの最後の使用をインライン化しますmオンラインでお試しください!
Neil

3

Japt -S、148バイト

Ð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`]

@Shaggyのおかげで4バイトが節約されました。+バグ修正により、さらに多くのバイト。インデックス付きの数値として月をとります。

Japtには日付処理が組み込まれていますが、あまり良くありません。真剣に、日付を初期化し、それから日数を減算し、それからその年の何日目かを計算するための34バイト?

それを試してみてください

Ð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
(不必要に)厳密な出力形式のため、これは「Japt -S」である必要があります。あなたは両方の発生を置き換えることにより、2つのバイトを保存することができます13D。私は午前中にもう一度(パブに行っていないときは、電話で)他の節約が見られるかどうかを確認しますが+1、その間、ゼリーをかなりの差で倒すことができます。
シャギー

ちょうど見つけたsT; そのためのショートカットがあります;)
Shaggy

残念ながら、バイトカウントがオフになっているようです。TIOはUTF-8ではなくSBCSでカウントしています。
シャギー

2

ゼリー181164バイト

“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

オンラインでお試しください!

Jellyには日付処理が組み込まれていないため、これはPythonのtimeモジュール内の機能にフォールバックします。

説明

“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
これはPythonの時間モジュール内の機能に依存します。」ああ、スマートです!私は05AB1E(日付の組み込みも欠けている)で答えを出そうとしていましたが、1988-11-30と入力日付の間の日数を取得することはできましたが、日付が必要なため、あまり役に立ちませんでした-differencesではなく、difference(年、月、日)。私は過去に05AB1Eで日付に関連する他のいくつかのチャレンジを実行しました(つまり、これといくつかの派生物)。コードの一部を圧縮されたPythonとして、あなたに触発されて、もう一度試すかもしれません。:)
Kevin Cruijssen

推測させてください:最初の文字列(diact viol lisk...)は、より良く圧縮するために奇妙に書かれていますか?
bb94

@ bb94はい、可能な場合はそれぞれに最も短い辞書の単語を使用します。
ニックケネディ

それは実際には本当に賢いです。
bb94


1

JavaScript(ES6)、297 269 252 249 245バイト

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>

入力をUTCのJavaScript日付オブジェクトとして受け取ります(JavaScriptタイムスタンプ番号として1バイト少なくなります)。編集:@Arnauldのおかげで3 7バイト節約されました。

オンラインでお試しください!何らかの理由でスニペットがまだ機能しない場合。


残念ながら、私30 dyu undefinedはFirefoxでこのようなものを取得します。
bb94

クロームについても同じ
無知の実施形態

@ bb94奇数、私はFirefoxを使用しています...
Neil

@EmbodimentofIgnoranceスニペットを少し調整しましたが、役に立ちますか?
Neil

1
@Arnauldええ、私はちょうど同じ結論に達していた。幸いにもDate.UTCと同じ長さnew Dateです!
Neil

1

Haskell387 373 372バイト

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]

オンラインでお試しください!

入力をDayオブジェクトとして受け取ります。

これは書くのがとても楽しかったです!基本的な考え方は、日付のリストを作成し、結果のインデックスを作成することです。関数aは1年を取り、その年のすべての日付を時系列で出力します。関数fは、aそれらを0から始まる連続した年に連結することで拡張します。トリックは、エポックの前の日付については、年-1から逆方向にトラバースして値-1、-2 ...を渡し、各リストを逆にする必要があるということです。それらを一緒に連結する前に個別に。最後に、関数fで、エポックと日付の間の日数を計算し(からIntegerに変換Int)、リストにインデックスを付けます。負の場合は、インデックスを修正するように注意してください。

編集:ゴルフで下がった(-14)

編集2:日/月の名前のリスト(-1)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.