Saída da data no calendário Mel

8

O calendário Mel é usado no mundo fictício de Kaldia. Seu objetivo é converter datas no calendário Mel.

Este calendário tem 13 meses de 28 dias cada, mais 1 ou 2 dias extras após o último mês. Um ano que é divisível por 4, mas não por 100, ou divisível por 400 tem 366 dias, e outros anos têm 365 (ou seja, o ano bissexto rege, mas com anos no calendário Mel).

Você deve usar as abreviações do nome do mês e do dia :

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

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

Os dias extras fora de qualquer mês têm o nome do mês de myuxet(sem abreviação aqui) e os nomes dos dias são axete teems, respectivamente.

0 dia dia é 30/11/1988.

Você pode considerar a data de entrada como uma string ou uma tupla (ano, mês, dia); Como alternativa, para funções, o parâmetro pode estar no tipo de data da sua biblioteca padrão. A saída deve ser uma cadeia de caracteres separada por espaço.

Casos de teste

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

Você deve poder lidar com datas de 1 a 9999 dC, pelo menos.

Implementação de referência no Perl 6

As brechas padrão são proibidas.

bb94
fonte
3
Você provavelmente deve incluir em seu post que axete teemsestão no final do ano, eu estava confuso até que eu olhei para o link
Personificação da Ignorância
Tem que ser uma cadeia de caracteres separada por espaço.
bb94 9/05/19
Podemos considerar a entrada como um valor de três nomeado tupla ou como uma lista de três valores a cada ano, mês e dia?
Modalidade de ignorância
1
Sim está bem.
bb94 9/05/19
Podemos produzir mês e dia no caso do título? -213 Ral Ket?
Adám

Respostas:

4

Perl 6 , 174 bytes

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

Experimente online!

Gere uma lista de todas as datas válidas e indexe o dia do ano nessa lista.

Explicação

{                                                   }  # 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
Brincadeira
fonte
3

Rubi , 199 195 193 bytes

Oof, apenas 23 27 29 bytes salvos no código Perl de amostra ...

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

Experimente online!

Value Ink
fonte
1
195 bytes (usando um número menos exato para subtração) tio.run/##PY3bjoIwFEXf/QqCGi@xSKtykUF/…
Nick Kennedy
1
193 bytes usando em y<364vez de m<13e, em seguida, inline o último uso de m. Experimente online!
919 Neil
3

Japonês -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 graças a @Shaggy. + Muito mais bytes devido a correções de bugs. Leva meses como números indexados em 0.

Japt possui manipulação de datas embutida, mas não é muito boa. Sério, 34 bytes para inicializar uma data, depois subtrair dias dela e calcular qual dia do ano é?

Tente

Ð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
Modalidade de ignorância
fonte
1
Devido ao formato de saída estrito (desnecessariamente), este deve ser "Japt -S". Você pode salvar 2 bytes substituindo as duas ocorrências de 13por D. Vou dar uma outra olhada de manhã (quando não estou no pub, no meu telefone) para ver se consigo ver outras economias, mas, +1enquanto isso, ganho Jelly por uma margem significativa.
Shaggy
Acabei de ver o sT; existe um atalho para isso;)
Shaggy
Infelizmente, parece que sua contagem de bytes está desativada; O TIO está contando no SBCS em vez de UTF-8.
Shaggy
2

Geléia , 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

Experimente online!

O Jelly não possui manipulação de data integrada, portanto, isso recai na funcionalidade do módulo de tempo do Python.

Explicação

“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
fonte
1
" isso recai na funcionalidade do módulo de tempo do Python. " Ah, esperto! Eu estava tentando responder em 05AB1E (também sem data incorporada) e, apesar de ter conseguido a quantidade de dias entre 30/11/1988 e a data de entrada, ela não foi muito útil, pois eu precisava da data -diferença (anos, meses e dias) em vez de dias-diferença. Eu fiz alguns outros desafios relacionados à data no 05AB1E no passado (isto é, este e alguns derivados). Eu poderia tentar novamente com parte do código como Python compactado, sendo inspirado por você. :)
Kevin Cruijssen
Deixe-me adivinhar: a primeira string ( diact viol lisk...) é escrita estranhamente para comprimir melhor?
bb94 11/05/19
@ bb94 sim, utiliza a palavra mais curta do dicionário para cada um onde estiver disponível.
Nick Kennedy
Isso é realmente muito inteligente.
bb94 11/11/19
1

C # (compilador interativo do 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;

Experimente online!

Modalidade de ignorância
fonte
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>

Recebe a entrada como um objeto de data JavaScript no UTC (seria 1 byte a menos como um número de carimbo de data / hora do JavaScript). Edit: Salvo 3 7 bytes graças a @Arnauld.

Experimente online! se o snippet ainda não estiver funcionando para você por algum motivo.

Neil
fonte
Infelizmente, recebo algo parecido 30 dyu undefinedcom isso no Firefox.
bb94 10/10/19
O mesmo aqui no chrome
Modalidade de ignorância
@ BB94 Odd, eu uso o Firefox ...
Neil
@EmbodimentofIgnorance Alterei um pouco o snippet, isso ajuda?
Neil
1
@ Arnauld Sim, eu tinha acabado de chegar à mesma conclusão. Felizmente, Date.UTCtem o mesmo comprimento 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]

Experimente online!

Recebe entrada como um Dayobjeto.

Foi muito divertido escrever! A idéia básica é criar uma lista de datas e indexá-la para o resultado. A função aleva um ano e gera todas as datas naquele ano em ordem cronológica. A função se fexpande ao aconcatená-los juntos por anos sucessivos a partir de 0. O truque é que, para datas anteriores à época, precisamos retroceder a partir do ano -1, para passarmos os valores -1, -2 ... e reverter cada lista individualmente antes de concatená-los juntos. Finalmente, em função f, calculamos o número de dias entre a época e nossa data (convertendo-a de Integerpara Int) e indexamos em nossa lista, tomando o cuidado de corrigir nosso índice, se for negativo.

EDIT: reduziu (-14)

EDIT 2: jogou golfe na lista de nomes de dia / mês (-1)

user1472751
fonte