Salida de la fecha en el calendario Mel

8

El calendario Mel se usa en el mundo ficticio de Kaldia. Su objetivo es convertir las fechas en el calendario Mel.

Este calendario tiene 13 meses de 28 días cada uno, más 1 o 2 días adicionales después del último mes. Un año que es divisible por 4 pero no por 100, o divisible por 400 tiene 366 días, y otros años tienen 365 (es decir, nuestras reglas de año bisiesto, pero con años en el calendario Mel).

Debe usar las abreviaturas de los nombres de mes y día :

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

días: 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

Los días adicionales fuera de cualquier mes tienen el nombre del mes myuxet(sin abreviatura aquí), y los nombres de los días son axety teems, respectivamente.

0 dia dia es 1988/11/30.

Puede tomar la fecha de entrada como una cadena o una tupla (año, mes, día); alternativamente, para funciones, el parámetro puede estar en el tipo de fecha de su biblioteca estándar. La salida debe ser una cadena separada por espacios.

Casos de prueba

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

Debería poder manejar las fechas desde 1 AD hasta 9999 AD por lo menos.

Implementación de referencia en Perl 6

Las lagunas estándar están prohibidas.

bb94
fuente
3
Probablemente deberías incluir en tu publicación que, axety teemsal final del año, estaba confundido hasta que miré el enlace
Encarnación de la ignorancia
Tiene que ser una cadena separada por espacios.
bb94
¿Podemos tomar la entrada como un valor de tres llamado tupla o una lista de tres valores cada año, mes y día?
Encarnación de la ignorancia
1
Si está bien.
bb94
¿Podemos mostrar mes y día en el caso del título? -213 Ral Ket?
Adám

Respuestas:

4

Perl 6 , 174 bytes

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

Pruébalo en línea!

Genere una lista de todas las fechas válidas y luego indexe el día del año en esa lista.

Explicación

{                                                   }  # 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
Jo King
fuente
3

Rubí , 199 195 193 bytes

Oof, solo 23 27 29 bytes guardados sobre el código Perl de muestra ...

-4 bytes de @NickKennedy.

-2 bytes de @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]]*' '}

Pruébalo en línea!

Tinta de valor
fuente
1
195 bytes (usando un número menos exacto para la resta) tio.run/##PY3bjoIwFEXf/QqCGi@xSKtykUF/…
Nick Kennedy
1
193 bytes utilizando y<364en lugar de m<13y luego inlining el último uso de m. Pruébalo en línea!
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`]

Guardado 4 bytes gracias a @Shaggy. + Mucho más bytes debido a correcciones de errores. Toma meses como números indexados a 0.

Japt tiene manejo de fecha incorporado, pero no es muy bueno. En serio, ¿34 bytes para inicializar una fecha, luego restar días de ella y luego calcular qué día del año es?

Intentalo

Ð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
Encarnación de la ignorancia
fuente
1
Debido al formato de salida estricto (innecesariamente), este debería ser "Japt -S". Puede guardar 2 bytes reemplazando ambas ocurrencias de 13con D. Echaré otro vistazo por la mañana (cuando no esté en el pub, en mi teléfono) para ver si puedo ver algún otro ahorro, pero +1mientras tanto puedo vencer a Jelly por un margen significativo.
Shaggy
Acabo de ver el sT; hay un atajo para eso;)
Shaggy
Lamentablemente, parece que su número de bytes está apagado; TIO cuenta en SBCS en lugar de UTF-8.
Shaggy
2

Jalea , 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

Pruébalo en línea!

Jelly no tiene un manejo de fecha incorporado, por lo que esto recurre a la funcionalidad dentro del módulo de tiempo de Python.

Explicación

“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
Nick Kennedy
fuente
1
" Esto recae en la funcionalidad dentro del módulo de tiempo de Python " . ¡Ah, inteligente! Estaba tratando de responder en 05AB1E (también faltaba fecha incorporada), y aunque pude obtener la cantidad de días entre 1988-11-30 y la fecha de entrada, no fue realmente útil ya que necesito la fecha -diferencia (años, meses y días) en lugar de diferencia de días. He hecho algunos otros desafíos relacionados con la fecha en 05AB1E en el pasado (es decir, este y algunos derivados). Podría intentarlo nuevamente con parte del código como Python comprimido, inspirándome en usted. :)
Kevin Cruijssen
Déjame adivinar: ¿la primera cadena ( diact viol lisk...) está escrita extrañamente para comprimir mejor?
bb94
@ bb94 sí, utiliza la palabra de diccionario más corta para cada uno donde esté disponible.
Nick Kennedy
Eso es realmente muy inteligente.
bb94
1

C # (compilador interactivo de Visual C #) , 247 bytes

n=>$"{(n=n.AddDays(4049)).Year-2e3} {((k=n.DayOfYear-1)<365?s.Substring(k/28*3,3):"myuxet")} {(k<365?s.Substring(k%28*3,3):k<366?"axets":"teems")}";var s="diaviolisgilfuldyumelralzanpalmikfavrujserravtanlinrezjildinketlenlaxnenpinmatkunmir";int k;

Pruébalo en línea!

Encarnación de la ignorancia
fuente
1

JavaScript (ES6), 297 269 252 249 245 bytes

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>

Toma la entrada como un objeto de fecha de JavaScript en UTC (sería 1 byte menos como un número de marca de tiempo de JavaScript). Editar: Guardado 3 7 bytes gracias a @Arnauld.

Pruébalo en línea! si el fragmento aún no funciona para usted por alguna razón.

Neil
fuente
Desafortunadamente, obtengo algo como 30 dyu undefinedesto en Firefox.
bb94
Lo mismo aquí en Chrome
Encarnación de la ignorancia
@ bb94 Extraño, uso Firefox ...
Neil
@EmbodimentofIgnorance He modificado ligeramente el fragmento, ¿eso ayuda?
Neil
1
@Arnauld Sí, acababa de llegar a la misma conclusión. Afortunadamente Date.UTCtiene la misma longitud que 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]

Pruébalo en línea!

Toma la entrada como un Dayobjeto.

¡Fue muy divertido escribirlo! La idea básica es construir una lista de fechas e indexarla para obtener el resultado. La función alleva un año y genera todas las fechas de ese año en orden cronológico. La función se fexpande al aconcatenarlos juntos durante años sucesivos a partir de 0. El truco es que para las fechas anteriores a la época tenemos que recorrer hacia atrás a partir del año -1, por lo que pasamos los valores -1, -2 ... y revertimos cada lista individualmente antes de concatenarlos juntos. Finalmente, en función fcalculamos el número de días entre la época y nuestra fecha (convirtiéndola de Integera Int) e indexamos en nuestra lista, teniendo cuidado de arreglar nuestro índice si es negativo.

EDITAR: golfed hacia abajo (-14)

EDIT 2: golfed la lista de nombres de día / mes (-1)

usuario1472751
fuente