05AB1E , 175 174 172 171 160 bytes
¦WΘ1š-1šVтFY`2ô0Kθ4ÖUD2Qi\28X+ë<7%É31α}‹iY¬>0ëY1¾ǝDÅsD12‹i>1ë\1Dǝ¤>2}}ǝVY})DJIJk18+£35.£¬.•4ιõ÷‡o‹ƶ¸•2ôs`UÐ3‹12*+>13*5÷s3‹Xα©т%D4÷®т÷©4÷®·()DćsćsO7%._s€нT‰J«7ô»
Entrada no formato [day, month, year]
. Saída com 0
s iniciais para dias de um dígito e minúsculasmo
por meio de su
(1 byte pode ser adicionado, se titlecase é obrigatório).
Experimente online ou verifique todos os casos de teste .
Puta merda .. Esse pode ser o meu novo recorde de resposta mais longa do 05AB1E, e então incluo alguns desafios muito complexos de ascii-art que fiz ...>.> EDIT: Hmm ok, quase ..; p
Nota importante: 05AB1E não possui componentes internos para objetos ou cálculos de data. O único construído em relação às datas que possui é o ano / mês / dia / hora / minutos / segundos / microssegundos de hoje.
Portanto, quase todo o código que você vê são cálculos manuais para calcular os dias anteriores e seguintes (incluindo transição ao longo dos anos e tendo em mente os anos bissextos) e calculando o dia da semana usando a congruência de Zeller .
Grandes partes do código são copiadas de desta minha resposta 05AB1E anterior , que também será relevante para a explicação abaixo.
Explicação:
Começamos indo para o primeiro dia do mês anterior:
¦ # Remove the first item (the days) from the (implicit) input
W # Get the minimum (without popping the list itself)
# (since the year is guaranteed to be above 1599, this is the month)
Θ # Check if its exactly 1 (1 if 1, 0 if in the range [2,31])
1š # Prepend a 1 as list (so we now have either [1,1] or [1,0]
- # Subtract this from the month and year
1š # And prepend a 1 for the day
V # Pop and store this first day of the previous month in variable `Y`
Então eu uso essa data como data de início e calculo os próximos 100 dias:
тF # Loop 100 times:
Y`2ô0Kθ4ÖUD2Qi\28X+ë<7%É31α}‹iY¬>0ëY1¾ǝDÅsD12‹i>1ë\1Dǝ¤>2}}ǝV
# Calculate the next day in line
# (see the linked challenge above for a detailed explanation of this)
Y # And leave it on the stack
}) # After the loop: wrap the entire stack into a list, which contains our 100 days
Então, com a data de entrada no meio, deixo apenas os 17 anteriores e 17 após essa data da lista:
DJ # Duplicate the 100 dates, and join the day/month/year together to strings
IJ # Push the input, also joined together
k # Get the 0-based index of the input in this list
# (the joins are necessary, because indexing doesn't work for 2D lists)
18+ # Add 18 to this index (18 instead of 17, because the index is 0-based)
£ # Only leave the first index+18 items from the 100 dates
35.£ # Then only leave the last 35 items
Agora temos nossos 35 dias. O próximo passo é calcular o dia da semana e criar o cabeçalho da tabela de saída:
¬ # Get the first date of the list (without popping the list itself)
.•4ιõ÷‡o‹ƶ¸• # Push compressed string "sasumotuwethfr"
2ô # Split it into chunks of size 2
s # Swap to get the first date again
`UÐ3‹12*+>13*5÷s3‹Xα©т%D4÷®т÷©4÷®·()DćsćsO7%
# Calculate the day of the week (sa=0; su=1; ...; fr=6)
# (see the linked challenge above for a detailed explanation of this)
._ # Rotate the list of strings that many times
Veja este 05AB1E ponta do meu (seção Como cordas compressa não fazem parte do dicionário? ) Para entender por que .•4ιõ÷‡o‹ƶ¸•
é"sasumotuwethfr"
.
Em seguida, criamos os dias para preencher a própria tabela com base em nossa lista de datas criada anteriormente. Que vamos mesclar junto com o cabeçalho. Após o qual podemos imprimir o resultado final:
s # Swap to get the list of dates again
€н # Only leave the first item of each date (the days)
T‰ # Take the divmod 10 of each
J # Join those divmod results together
# (we now have leading 0s for single-digit days)
« # Merge this list together with the header list
7ô # Split it into chunks of size 7
» # Join each inner list by spaces, and then each string by newlines
# (and output the result implicitly)
JavaScript (ES6),
141126 bytesEconomizou 15 bytes emprestando da resposta
.toUTCString().slice(0,2)
de NeilRecebe a entrada como um objeto Data.
Experimente online!
fonte
JavaScript (Node.js) ,
205152145 bytesExperimente online! Recebe entrada como objeto Data JavaScript ou carimbo de data e hora. Edit: Salvo 1 byte graças a @EmbodimentofIgnorance, que me permitiu salvar mais 7 bytes adicionando uma nova linha à direita na saída. Salvei 52 bytes quando descobri que estava trabalhando com um comportamento que na verdade não era de buggy ...
fonte
padStart(2)
->padStart(3)
, remova o espaço na cadeia de junção de -1 bytePerl 6 , 87 bytes
Experimente online!
Pega um
Date
objeto, retorna uma lista de linhas.fonte
C # (compilador interativo do Visual C #) ,
124120 bytesExperimente online!
fonte
Wolfram Language (Mathematica) , 123 bytes
Experimente online!
Não sei por
Grid
que não funciona no TIO, mas esse código gera esse@DavidC salvou 1 byte
fonte
Grid
não funcione porque o TIO não pode centralizar os itens como na sua foto?MATL ,
343331 bytesExperimente online!
Explicação
fonte
Java (JDK) , 149 bytes
Experimente online!
Créditos
fonte
i
e dej
alguma forma? Ou algo mais curtoj++%7<1?10:32
com alguma mágica bit a bit? Mas vou deixar isso para você. Estou voltando ao trabalho, lol. ;)w
representa? Por que nãoh
para cabeçalho?w
para "dia de w eek". Além disso, o ajuste de bits apenas pode levar a(i%7+6)/7*22+10
que é muito mais longo.PHP ,
197189187 bytesExperimente online!
A entrada é
STDIN
como uma sequência de datas. Corra comphp -nF
.Verifique todos os casos de teste
Ou 174 bytes com dígitos únicos preenchidos com zero.
fonte
Excel VBA,
190159 bytesObrigado @TaylorScott
Recebe entrada na forma de uma sequência de datas válida para o Excel VBA (por exemplo, 19 de fevereiro de 2020; 19/2/2020; 19 de fevereiro de 2019) e retorna uma matriz com o calendário especificado centralizado nela.
fonte
Function z(i)
Dim d(5,6)
v=DateValue(i)-17
For x=1To 5
For y=0To 6
d(0,y)=Left(WeekdayName(Weekday(v+y)),2)
d(x,y)=Day(v+y+(x-1)*7)
Next y,x
z=d()
End Function
Vermelho ,
153131 bytesExperimente online!
fonte
T-SQL, 203 bytes
A versão online é um pouco diferente, esta versão postada funciona no MS-SQL Studio Management. Ele salva 1 bytes em comparação com a versão online, mas não fornece o resultado correto online
Experimente online
fonte
Python 2 , 115 bytes
Experimente online!
Não tenho certeza se isso é permitido ... recebe a entrada de STDIN no formulário
date(year, month, day)
. Isso também pode ser representado como__import__('datetime').date(year, month, day)
. Estes são realmente__import__('datetime').date
objetos.fonte