Code Golf - Вывести Дату В Календаре Мела

  • Автор темы Anrbek
  • Обновлено
  • 19, Oct 2024
  • #1

Календарь Мела используется в вымышленном мире Калдия. Ваша цель — преобразовать даты в календарь Мела.

В этом календаре 13 месяцев по 28 дней в каждом, плюс 1 или 2 дополнительных дня после последнего месяца. Год, который делится на 4, но не на 100, или делится на 400, имеет 366 дней, а другие годы - 365 (т. е. наши правила високосного года, но с годами по календарю Мэла).

Вам следует использовать сокращения названий месяца и дня:

месяцы: Диа Вио Лис Гил Фул Дью Мел Рал Зан Пал Мик Фав Руж

дни: диа вио лис гиль фул дю мел рал зан пал мик фав рудж сер рав тан лин рез джил дин кет лен лакс нен пин мат кун мир

Дополнительные дни вне любого месяца имеют название месяца

 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
 
(no abbreviation here), and the day names are 0 dia dia и teems , respectively.

axet is 1988/11/30.

Вы можете принять входную дату в виде строки или кортежа (год, месяц, день); альтернативно, для функций параметр может иметь тип даты вашей стандартной библиотеки. Вывод должен представлять собой строку, разделенную пробелами.

Тестовые случаи

myuxet

Вы должны уметь обрабатывать даты как минимум с 1 по 9999 год нашей эры.

Эталонная реализация в Perl 6

Стандартные лазейки запрещены.

#код-гольф #свидание

Anrbek


Рег
15 Apr, 2014

Тем
75

Постов
193

Баллов
588
  • 26, Oct 2024
  • #2

Перл 6, 174 байта

 
 
 
 
 
 
 
 
 
 
 Int 

Попробуйте онлайн!

Создайте список всех допустимых дат, а затем индексируйте день года в этом списке.

Объяснение

Integer ||answer||

Руби, 199 195 193 байт

Ох, по сравнению с примером кода Perl сохранено всего 23 27 29 байт...

-4 байта от @NickKennedy.

-2 байта от @Neil.

f

Попробуйте онлайн!

 

Intochka


Рег
08 Apr, 2011

Тем
61

Постов
206

Баллов
531
  • 26, Oct 2024
  • #3

Япт a , 148 байт

f

Сэкономлено 4 байта благодаря @Shaggy. + Намного больше байтов из-за исправлений ошибок. Принимает месяцы как числа с нулевым индексом.

В Japt есть встроенная обработка дат, но она не очень хороша. Серьезно, 34 байта, чтобы инициализировать дату, затем вычесть из нее дни и затем вычислить, какой это день года?

Попробуйте это

a ||answer||

Желе, 181 164 байт

Day

Попробуйте онлайн!

В Jelly нет встроенной обработки дат, поэтому здесь используется функциональность модуля времени Python.

Объяснение

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||y0>0] f d|n<-read.show$diffDays d$fromGregorian 1988 11 30=last$(a=<<[0..])!!n:[(reverse.a=<<[-1,-2..])!!(-n-1)|n<0] ||answer||

C# (интерактивный компилятор Visual C#), 247 байт

<input type=date oninput=o.textContent=f(this.valueAsDate)><pre id=o>

Попробуйте онлайн!

 

Zeuxx


Рег
07 Nov, 2006

Тем
63

Постов
180

Баллов
515
  • 26, Oct 2024
  • #4

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`}`}`) 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;

Принимает входные данные как объект даты JavaScript в формате UTC (это будет на 1 байт меньше, чем номер метки времени JavaScript). Изменить: сохранено 3 7 байт благодаря @Arnauld.

Попробуйте онлайн! если фрагмент по какой-то причине у вас все еще не работает.

 

Bren


Рег
08 Mar, 2009

Тем
76

Постов
190

Баллов
580
  • 26, Oct 2024
  • #5

Хаскелл, 387 373 372 байт

“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

Попробуйте онлайн!

Принимает входные данные как “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 object.

Было очень весело писать! Основная идея состоит в том, чтобы построить список дат и индексировать его для получения результата. Функция Ð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 takes a year and outputs every date in that year in chronological order. Function Ð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`] расширяется -S concatenating them together for successive years starting at 0. The trick is that for dates before the epoch we need to traverse backwards starting from the year -1 so we pass a values -1,-2... and reverse each list individually before concatenating them together. Finally, in function ->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]]*' '} мы вычисляем количество дней между эпохой и нашей датой (преобразовывая ее из { } # 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 to {~(.year,(|[X]("diaviolisgilfuldyumelralzanpalmikfavrujserravtanlinrezjildinketlenlaxnenpinmatkunmir".comb(3)xx 2)[^364],|("myuxet"X <axet teems>))[.day-of-year-1])}o*-726436 ) и вносим индекс в наш список, стараясь зафиксировать наш индекс, если он отрицательный.

РЕДАКТИРОВАТЬ: проиграл (-14)

РЕДАКТИРОВАТЬ 2: пролистать список названий дней/месяцев (-1)

 

Norbeteodyvet1


Рег
25 Oct, 2024

Тем
91

Постов
202

Баллов
677
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно