Dada uma lista de atividades e sua hora / data de início, produza um calendário de arte ASCII mostrando as atividades nos dias apropriados. Todas as atividades são garantidas no mesmo mês, não há duas atividades no mesmo dia e todas as atividades cabem na caixa do calendário.
O calendário tem a data no canto superior esquerdo de cada caixa, as caixas têm 9 espaços de largura por 5 espaços de altura, cercados por -
e |
. A abreviação de duas letras para o dia da semana está centralizada acima da primeira linha e as semanas começam no domingo.
Por exemplo, dadas as seguintes atividades:
10/5/2018 - 9:00am - Sandbox calendar challenge
10/9/2018 - 9:00am - Post challenge to main
10/10/2018 - 10:00am - Profit
10/31/2018 - 7:30pm - Halloween party
Saída este calendário correspondente:
Su Mo Tu We Th Fr Sa
-----------------------------------------------------------------------
| |1 |2 |3 |4 |5 |6 |
| | | | | |9:00am | |
| | | | | |Sandbox | |
| | | | | |calendar | |
| | | | | |challenge| |
-----------------------------------------------------------------------
|7 |8 |9 |10 |11 |12 |13 |
| | |9:00am |10:00am | | | |
| | |Post |Profit | | | |
| | |challenge| | | | |
| | |to main | | | | |
-----------------------------------------------------------------------
|14 |15 |16 |17 |18 |19 |20 |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
-----------------------------------------------------------------------
|21 |22 |23 |24 |25 |26 |27 |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
-----------------------------------------------------------------------
|28 |29 |30 |31 | | | |
| | | |7:30pm | | | |
| | | |Halloween| | | |
| | | |party | | | |
| | | | | | | |
-----------------------------------------------------------------------
Esclarecimentos
- As palavras da programação (combinando [A-Za-z] +) serão delimitadas por um único espaço entre elas (como no exemplo).
- Dividir o texto nos limites das palavras é suficiente. Não há necessidade de hifenizar palavras.
- Se fevereiro começar em um domingo em um ano que não seja bissexto, você terá apenas quatro linhas do calendário.
- Se um mês de 31 dias (por exemplo, agosto) começar no final da semana, talvez você precise gerar seis linhas do calendário.
E / S e regras
- Seu código deve lidar com datas pelo menos entre
0001-01-01
e9999-12-31
no calendário gregoriano, incluindo anos bissextos, conforme apropriado. Por exemplo, se uma entrada é fornecida2016-02-13 9:00am Test
, o calendário de saída deve ter 29 de fevereiro. - O formato da data de entrada pode estar em qualquer formato desejado. ISO 8601, um
datetime
objeto, uma sequência particularmente formatada, etc. A análise de entrada não é a parte interessante desse desafio. - A entrada e a saída podem ser feitas por qualquer método conveniente .
- Novas linhas à esquerda / à direita ou outro espaço em branco são opcionais, desde que os caracteres sejam alinhados adequadamente.
- Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
- A saída pode ser no console, retornada como uma lista de cadeias, retornada como uma única cadeia, etc.
- As brechas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
1752-09-02 - 09:00am - Wife's Birthday Tomorrow (14th!)
Respostas:
JavaScript (ES8),
380…321320 bytesToma entrada como
(y,m,e)
onde:y
é o anom
é o mês, indexado a 0e
é um objeto cujas chaves são os dias e cujos valores são os eventos no[hour, task]
formatoExperimente online!
Quão?
Abaixo estão algumas partes importantes no código.
Cabeçalho
A linha do cabeçalho é gerada com:
Quando
split()
é usado com uma expressão regular que contém um grupo de captura, esse grupo é incluído na matriz de saída. Nesse caso, fornece:Juntamos essa matriz com 4 espaços, levando a:
que é exatamente o que queremos.
Estrutura do mês
Formatação de evento
O código a seguir é usado para formatar um evento.
fonte
Python 2 ,
326324315312307 bytesExperimente online!
Mesma entrada que a resposta JS de Arnauld :
Toma entrada como
(y,m,e)
onde:y
é o anom
é o mês, indexado em 1e
é um objeto cujas chaves são os dias e cujos valores são os eventos no(hour, task)
formatofonte
Carvão ,
215206 bytesExperimente online! Link é a versão detalhada do código. Tira datas no formato d / m / aaaa. Explicação:
Insira o primeiro evento.
Extraia a data e divida em
/
s.Converta em meses desde 1 de março de BC. Quero calcular o dia da semana do primeiro mês do próximo mês e do mês atual, e trabalhar em meses é mais fácil do que manter os meses e os anos separados e continuar no final do ano, além de permitir que eu comece a contar meses a partir de março, em vez de janeiro, o que é exigido pela congruência de Zeller.
Use a congruência de um Zeller modificado para extrair o dia da semana do primeiro dia do próximo mês e deste mês. A parte básica baseia-se no fato de que o número de dias de 30 de outubro do ano anterior ao 1º de um determinado mês em que
m = 4
para março em = 14
janeiro do ano seguinte é dado pela fórmulam * 153 / 5
, no entanto, podemos subtrair 140 porque apenas se preocupam com o dia da semana. Resta então fazer os ajustes devidos ao ano; cada ano adiciona um dia, cada quarto ano adiciona um dia extra, cada centésimo ano subtrai um dia e cada 400º ano adiciona um dia novamente. (Como trabalho em meses, todos esses valores são multiplicados por 12.) De maneira conveniente, isso me dá a resposta diretamente em termos de uma semana indexada no domingo (normalmente você adiciona o dia do mês e começa a contar no sábado).Negue o dia da semana e salve-o como o dia atual do mês.
Calcule o número de dias no mês a partir do dia da semana dos dois meses.
Saída dos cabeçalhos do dia.
Imprima a linha superior de
-
s.Loop até o último dia do mês ter sido produzido.
Mova o cursor para o início da próxima linha.
Processo 7 dias de cada vez.
Imprima a coluna de
|
s à esquerda.Incremente o dia atual do mês.
Se o dia atual do mês for o dia do evento atual, ...
... extrair as outras partes do evento, ...
... coloque o tempo em 9 espaços e salve-o e uma string vazia como uma lista, ...
... divida a descrição em espaços e faça um loop sobre eles, ...
... adicionando cada palavra à palavra anterior, se for adequada; ...
... imprimir a hora e a descrição (
Pδ
não funciona, pode ser um bug do carvão vegetal?), ...... e insira o próximo evento.
Se o dia atual do mês estiver entre 1 e o último dia do mês, produza-o, caso contrário, apenas produza espaços suficientes para passar para o dia seguinte.
No final da semana, imprima a coluna da direita de se
|
a linha inferior de-
s.fonte
year-1
deve ser usado em vez deyear
emonth+12
deve ser usado em vez demonth
. Ou você de alguma forma simplificou o algoritmo que mencionei nesta minha resposta 05AB1E, que é igual à da Wikipedia ?Java (JDK) ,
538439428425 bytesPossivelmente, a solução mais longa do Code Golf que eu já publiquei. Ainda estou tentando jogar golfe daqui, mas é uma luta.
Conseguiu eliminar 99 bytes alterando o formato de entrada e usando algumas análises de expressões regulares e outras 11 de bits diversos.
3 bytes extras de desconto graças a Kevin!
Inspirando-se em outras respostas, ele leva informações como ano, mês e um Mapa de dias para uma String que representa a hora e o evento no formato
<time>-<event>
.Experimente online!
Ungolfed
fonte
&&(i=1)<2?7:0
pode ser?7*(i=1):0
para salvar 3 bytes.b>x|i++<6?0:7*(i=1)
vez deb<=x&++i>6?7*(i=1):0
e emc*i>1|b<1|b>x?c<2&e!=null?e.split("-")[i-2]:" ":b+""
vez dec*i<2&b>0&b<=x?b+"":c<2&e!=null?e.split("-")[i-2]:" "
Vermelho ,
674651 bytesExperimente online!
Mais legível:
fonte
if e = 0[e: 7]
pode ser removido, certo? Você usae: 1 + c/weekday % 7
, entãoe
sempre estará no intervalo[1, 7]
.1 +
acontece primeiro .. Ok, eu vejo o meu erro. Estou acostumado%
e/
com precedência de operador+
.