Os australianos adoram feriados e bebem. Ontem, 26 de janeiro, foi o dia da Austrália, que é feriado. Fiquei feliz por não estar trabalhando ontem e ansioso para saber da próxima vez que eu tiver um feriado! Infelizmente, bebi um pouco demais e não sou capaz de resolver isso sozinho.
Escreva um programa que tenha uma data na notação de data / hora australiana (dd / mm) como entrada e produza a quantidade de dias até o próximo feriado. Como sou residente em Queensland (QLD), só estou interessado em feriados que afetam Queenslanders :
25/03 Sexta-feira Santa
26/03 | Sábado de Páscoa
28/03 | Segunda-feira de Páscoa
25/04 | Dia Anzac
02/05 | Dia do Trabalho
03/10 | Aniversário da rainha
25/12 | Dia de natal
26/12 | Boxing Day
27/12 | Feriado do dia de Natal
Observe o seguinte no site:
Feriado do dia de Natal
Um feriado público adicional a ser adicionado quando o dia de ano novo, o dia de Natal ou o dia de boxe caem em um fim de semana.
Como o dia de Natal é no domingo, há um feriado público extra . O dia de Natal ainda é feriado.
Por ser uma pessoa matutina, você deve incluir a data atual como um dia (já que é a hora mais provável de verificar seu programa para o próximo feriado). Ou seja, se a data de um feriado público for inserida, sua saída deverá ser 0
; se um dia antes da entrada de um feriado, sua saída será 1
.
Só estou interessado em datas entre agora (27/01) até o final do ano. A data final que você precisará contabilizar é 31/12, onde estará sua produção 1
(no dia de Ano Novo).
As brechas padrão são proibidas.
Entrada
- A entrada sempre terá 5 caracteres: 4 letras, separadas por hífen
-
ou barra/
- A entrada será apenas uma data entre 27/01 e 31/12
Resultado
- O número de dias até o próximo feriado em Queensland na Austrália, incluindo a data de entrada: deve ser um número entre
0
e153
(o intervalo mais longo) - Sem novas linhas ou erros
Exemplos
01-05 = 1
02-05 = 0
03-05 = 153
25/12 = 0
26-12 = 0
27/12 = 0
30/12 = 2
31-12 = 1
Espero que isso esteja claro e que nada se perca; no entanto, esta é a minha segunda pergunta, por isso aprecio qualquer feedback e faço o possível para corrigir problemas o mais rápido possível.
Respostas:
Pyth ,
98846267 BytesAtualização: salvou 14 bytes reduzindo a lista da contagem de dias para todos os 12 meses para o cálculo do número do dia. Ainda não encontrei uma boa maneira de comprimir a outra lista, ainda tentando!
Atualização2: salvou outros 22 bytes codificando a lista dos números do dia como uma string base256.
Experimente online!
O mesmo algoritmo da minha resposta em Python. E não havia como criar o dia do ano, então tive que fazer isso sozinho. Criar essas 2 listas para o cálculo do dia do ano e para os dias de feriados é bastante caro ... vamos dar uma olhada novamente e tentar gerá-las em menos bytes.
fonte
Visual Basic for Applications, 155 ou 118 bytes
Versão 1 - independente da localidade, 155 bytes
Versão 2 - dependente da localidade, 118 bytes
A contagem de bytes é para o arquivo .BAS final, incluindo caracteres de avanço de linha. Editado fora do editor VBA padrão (pois impõe espaços adicionais e formas detalhadas de algumas palavras-chave) - mas importa e executa sem problemas em qualquer Aplicativo do Office (para testar o tipo, por exemplo,
? h("10/08")
em janela imediata ou no Excel, usar diretamente em uma fórmula de célula).(EDITADO) Inicialmente, optei por usar
DateSerial
para tornar a função segura de localidade (versão 1). Como eu moro no Brasil e, portanto, meu sistema está configurado para usar o formato "dd / mm / aa" para datas (assim como a Austrália), eu poderia escrever uma versão ainda menor usando em seuCDate
lugar (versão 2).CDate
usa informações de localidade do sistema para converter texto em data. Também assumi nesta versão que o código seria executado apenas em 2016 (se o ano for omitido (-6 bytes)CDate
assume o ano atual conforme o relógio do sistema).O número 42454 na terceira linha é a soma de 42450, que é a representação numérica de 01/01/2016 no VBA e 84, que é o dia do ano para o primeiro feriado. A matriz contém o dia do ano para cada feriado (incluindo 01/01/2017) compensado por -84, pois isso leva alguns dígitos. Usar 16 em vez de 2016 em
DateSerial
leva mais dois bytes.Criar uma matriz idêntica nove vezes dentro da iteração é um código "ruim", mas funciona e salva mais 3 bytes (um para o nome da matriz e outro para o sinal de igual fora do loop e mais um para fazer referência à matriz dentro do loop).
Os espaços "ausentes" entre 0 e a palavra-chave a seguir na segunda e quarta linhas não são necessários, pois são reintroduzidos automaticamente pelo VBE quando o módulo é importado. Usado desatualizado, mas com byte-barato
If <...> Goto <linenumber>
para interromper o loop (ambosIf <...> Then Exit For
eIf <...> Then Exit Function
usar mais caracteres).Também aproveitou o fato de que o nome da função no VBA se comporta como uma variável local e seu valor é retornado automaticamente pela função no final da execução.
fonte
JavaScript (ES6),
131128 bytesExplicação
Usa o
Date
construtor interno JavaScript para converter a sequência de entrada em um número de milissegundos desde a época e depois compara isso com o número de milissegundos para cada feriado.Isso é feito armazenando os feriados em uma matriz como o número de dias desde a data de referência. Eu escolhi
2016-01-29
a data de referência porque o número de milissegundos desde a época pode ser condensado o mais curto nessa data. Qualquer número de milissegundos entre este dia e o próximo funciona porque o resultado é arredondado para baixo e manter o número no meio evita os efeitos do horário de verão (embora o fuso horário do OP não tenha horário de verão). O número deste dia é1453986000000
e arredondá-lo para1454000000000
(adicionando algumas horas) significa que ele pode ser escrito como1454e9
.Teste
Esta solução depende do fuso horário do usuário. Isso funciona no fuso horário do OP (e meu) (GMT +1000). Se você quiser testá-lo em um fuso horário diferente, a adição
numberOfHoursDifferentFromGMT1000 * 60 * 60 * 1000
ao número da data de referência deve funcionar. (por exemplo, GMT +0430 seria-5.5 * 60 * 60 * 1000 + 1454e9+n*864e5
)Mostrar snippet de código
fonte
separated with a hyphen - or slash /
é um pouco ambígua. Para mim, isso significa que temos que lidar com ambos, mas posso ver claramente o seu lado. Acho que o OP deve esclarecer isso.T-SQL,
210,206, 194 bytes(Primeiro post aqui, espero que esteja tudo bem, mas por favor seja gentil :)
A entrada entra
@i
, serve para ambos/
e-
como separador. Estou na Austrália, então meu formato de data é o mesmo que @TasAtualizar
varchar
parachar
salvar 3 bytes, além de remover um espaço :)A atualização 2 declara
@c
e atribui sem uma seleçãofonte
T-SQL, 296 bytes
Criado como uma função com valor de tabela
Utilizado da seguinte maneira
Uma breve explicação
fonte
JavaScript (ES6), 134 bytes
O user81655 ainda me excedeu em 3 bytes, mas não consigo encontrar outro lugar para extrair nada daqui. Funciona calculando o número de dias passados em vez de usar Data e comparando-o a uma matriz de compensações de feriados.
fonte
Python 2,
204185165 165166 bytesAtualização: reduziu em ~ 20 bytes calculando o dia do ano sozinho. Não há mais necessidade de longas importações :)
Atualização 2: Outros 20 bytes abaixo, percebendo que posso tratar o ano novo como no dia 367 e fazendo outros pequenos ajustes.
Experimente online!
Ungolfed:
Funciona armazenando o número do dia do ano dos feriados em uma lista, filtrando os que estão antes da data especificada, pegando o primeiro elemento nessa lista filtrada e subtraindo o dia do ano, que foi calculado a partir da entrada.
fonte
PHP, 116 bytes
Abordagem bastante direta. Ele armazena os dias do ano para os feriados e os exibe desde que estejam no passado. Finalmente, o dia do ano solicitado é subtraído.
Após todos os casos de teste. Executa na linha de comando e aceita a entrada usando um hífen, como:
fonte
ruby 1.9.3,
155153 bytesApós o feriado do dia de Natal, precisamos do nosso dia super especial 366! Caso semelhante ao @DenkerAffe.
Uso:
fonte
05AB1E , 45 bytes
Pode não ser mais 2016, mas seja o que for ..;) Ainda assume que o ano é 2016 por ser um ano bissexto com
29
fevereiro.Experimente online ou verifique todos os casos de teste .
Explicação:
Consulte esta dica 05AB1E (seções Como compactar números inteiros grandes? E Como compactar listas de números inteiros? ) Para entender por que
•9JRt€ª´Q®Ië•
é10549819042671399072072399
;•9JRt€ª´Q®Ië•368в
é[85,86,88,116,123,277,360,361,362,367]
; e•Σ₁t•
é5354545
.fonte