Geben Sie das Datum im Mel-Kalender aus


8

Der Mel-Kalender wird in der fiktiven Welt von Kaldia verwendet. Ihr Ziel ist es, Daten in den Mel-Kalender umzuwandeln.

Dieser Kalender hat 13 Monate mit jeweils 28 Tagen plus 1 oder 2 zusätzliche Tage nach dem letzten Monat. Ein Jahr, das durch 4, aber nicht durch 100 oder durch 400 teilbar ist, hat 366 Tage, und andere Jahre haben 365 (dh unsere Schaltjahrregeln, aber mit Jahren im Mel-Kalender).

Sie sollten die Abkürzungen für Monats- und Tagesnamen verwenden :

Monate: dia vio lis gil ful dyu mel ral zan pal mik fav ruj

tage: 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

Der zusätzlichen Tage außerhalb eines jeden Monats hat die Monatsnamen von myuxet(keine Abkürzung hier) und die Tag - Namen sind axetund teemsjeweils.

0 dia dia ist 1988/11/30.

Sie können das Eingabedatum als Zeichenfolge oder als Tupel (Jahr, Monat, Tag) verwenden. Alternativ kann der Parameter für Funktionen im Datumstyp Ihrer Standardbibliothek enthalten sein. Die Ausgabe sollte eine durch Leerzeichen getrennte Zeichenfolge sein.

Testfälle

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

Sie sollten in der Lage sein, Daten von mindestens 1 n. Chr. Bis 9999 n. Chr. Zu verarbeiten.

Referenzimplementierung in Perl 6

Standardlücken sind verboten.


3
Sie sollten wahrscheinlich in Ihren Beitrag aufnehmen, dass axetund teemsam Ende des Jahres war ich verwirrt, bis ich den Link
Verkörperung der Ignoranz

Es muss eine durch Leerzeichen getrennte Zeichenfolge sein.
bb94

Können wir Eingaben als Tupel mit drei Werten oder als Liste mit drei Werten für jedes Jahr, jeden Monat und jeden Tag verwenden?
Verkörperung der Unwissenheit

1
Ja das ist in Ordnung.
bb94

Dürfen wir Monat und Tag in Title Case ausgeben? -213 Ral Ket?
Adám

Antworten:


4

Perl 6 , 174 Bytes

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

Probieren Sie es online aus!

Generieren Sie eine Liste aller gültigen Daten und indizieren Sie dann den Tag des Jahres in dieser Liste.

Erläuterung

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

Oof, nur 23 27 29 Bytes über dem Beispiel-Perl-Code gespeichert ...

-4 Bytes von @NickKennedy.

-2 Bytes von @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]]*' '}

Probieren Sie es online aus!


1
195 Bytes (unter Verwendung einer weniger genauen Zahl für die Subtraktion) tio.run/##PY3bjoIwFEXf/QqCGi@xSKtykUF/…
Nick Kennedy

1
193 Bytes, indem y<364anstelle von m<13und dann die letzte Verwendung von verwendet wird m. Probieren Sie es online aus!
Neil

3

Japt -S , 148 Bytes

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

4 Bytes dank @Shaggy gespeichert. + Viel mehr Bytes aufgrund von Fehlerkorrekturen. Dauert Monate als 0-indizierte Zahlen.

Japt verfügt zwar über eine integrierte Datumsverwaltung, ist jedoch nicht sehr gut. Im Ernst, 34 Bytes, um ein Datum zu initialisieren, dann Tage davon zu subtrahieren und dann zu berechnen, welcher Tag des Jahres es ist?

Versuch es

Ð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
Aufgrund des (unnötig) strengen Ausgabeformats sollte dies "Japt -S" sein. Sie können 2 Bytes speichern , indem Sie beide Vorkommen zu ersetzen 13mit D. Ich werde am Morgen noch einmal nachsehen (wenn ich nicht in der Kneipe bin, auf meinem Handy), um zu sehen, ob ich noch andere Ersparnisse sehen kann, aber +1in der Zwischenzeit eine Chance habe, Jelly deutlich zu schlagen.
Shaggy

Habe gerade das entdeckt sT; Dafür gibt es eine Abkürzung;)
Shaggy

Leider sieht es so aus, als ob Ihre Byteanzahl nicht stimmt. TIO zählt in SBCS anstelle von UTF-8.
Shaggy

2

Gelee , 181 164 Bytes

“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

Probieren Sie es online aus!

Jelly verfügt über keine integrierte Datumsverarbeitung, daher wird auf die Funktionalität im Zeitmodul von Python zurückgegriffen.

Erläuterung

“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
" Dies greift auf die Funktionalität innerhalb des Zeitmoduls von Python zurück. " Ah, klug! Ich habe versucht, in 05AB1E eine Antwort zu geben (auch ohne Datumseinbau), und obwohl ich die Anzahl der Tage zwischen dem 30.11.1988 und dem Eingabedatum ermitteln konnte, war dies nicht wirklich nützlich, da ich das Datum benötige -Differenz (Jahre, Monate und Tage) statt Tagesdifferenz. Ich habe in der Vergangenheit in 05AB1E einige andere datumsbezogene Herausforderungen durchgeführt (dh dieses und einige Derivate). Ich könnte es noch einmal mit einem Teil des Codes als komprimiertem Python versuchen, der von Ihnen inspiriert ist. :)
Kevin Cruijssen

Lassen Sie mich raten: Der erste String ( diact viol lisk...) ist seltsam geschrieben, um besser zu komprimieren?
bb94

@ bb94 Ja, es wird das kürzeste Wörterbuchwort für jedes Wort verwendet, für das eines verfügbar ist.
Nick Kennedy

Das ist eigentlich ganz klug.
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>

Nimmt Eingaben als JavaScript-Datumsobjekt in UTC vor (wäre 1 Byte weniger als JavaScript-Zeitstempelnummer). Bearbeiten: 3 7 Bytes dank @Arnauld gespeichert.

Probieren Sie es online aus! wenn das Snippet aus irgendeinem Grund immer noch nicht für Sie funktioniert.


Leider bekomme ich so etwas 30 dyu undefinedauf Firefox.
bb94

Gleiches hier auf Chrom
Verkörperung der Unwissenheit

@ bb94 Seltsam, ich benutze Firefox ...
Neil

@EmbodimentofIgnorance Ich habe das Snippet leicht optimiert. Hilft das?
Neil

1
@Arnauld Ja, ich war gerade zu dem gleichen Schluss gekommen. Zum Glück Date.UTCist die gleiche Länge wie new Date!
Neil

1

Haskell , 387 373 372 Bytes

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]

Probieren Sie es online aus!

Nimmt die Eingabe als DayObjekt auf.

Das Schreiben hat ziemlich viel Spaß gemacht! Die Grundidee besteht darin, eine Liste mit Daten zu erstellen und diese für das Ergebnis zu indizieren. Die Funktion adauert ein Jahr und gibt jedes Datum in diesem Jahr in chronologischer Reihenfolge aus. Die Funktion ferweitert die aVerkettung für aufeinanderfolgende Jahre ab 0. Der Trick besteht darin, dass wir für Daten vor der Epoche ab dem Jahr -1 rückwärts durchlaufen müssen, damit wir die Werte -1, -2 ... übergeben und jede Liste umkehren einzeln, bevor sie zusammen verkettet werden. Schließlich fberechnen wir in Funktion die Anzahl der Tage zwischen der Epoche und unserem Datum (Konvertierung von Integerin Int) und den Index in unsere Liste, wobei wir darauf achten, unseren Index zu korrigieren, wenn er negativ ist.

EDIT: Golf es runter (-14)

BEARBEITEN 2: Golf in der Liste der Tages- / Monatsnamen (-1)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.