Recentemente, acrescentei as idades de mim e de minha esposa e filhos e percebi que, em algum momento de um futuro não muito distante, nossas idades somariam exatamente 100 anos.
Desafio
Para uma entrada que consiste em uma idade combinada (total) e uma lista de datas de nascimento, imprima a data na qual todas as idades combinadas somam o total determinado.
- A idade combinada de entrada (em anos) será um número inteiro positivo
- A lista de entrada de datas de nascimento será uma lista (qualquer formato conveniente para o seu idioma) de datas que devem conter representação numérica de dia, mês e ano. Número de dias desde que uma época específica não é aceitável. Você pode assumir que a lista de datas de entrada está classificada em ordem cronológica.
- A saída será uma única data no mesmo formato das datas de entrada
- Para os fins da idade combinada, considera-se 1 ano exatamente 365,25 dias
- Para algumas entradas, será impossível encontrar uma data após todas as datas de nascimento, quando todas elas somam a idade combinada. Por exemplo, considere duas datas de nascimento com 20 anos de diferença, mas queremos um total de 10 anos. Nesse caso, a saída seria o 10º aniversário da data de nascimento mais antiga. Em outras palavras, as idades individuais são consideradas 0 para todas as datas anteriores à data de nascimento dessa pessoa
- A saída será a primeira data em que as idades combinadas somam pelo menos a idade de entrada
- Você pode usar funções internas de data e hora
- Você deve oferecer suporte a datas desde 1970/01/01.
Exemplos
Aqui estou fornecendo todas as datas no formato AAAA / MM / DD, mas você pode usar o formato que desejar.
Input Output
10 2000/01/01 2010/01/01
100 1975/03/05,1978/07/23,2008/11/12,2012/12/20 2018/11/22
100 1975/03/06,1978/07/23,2008/11/12,2012/12/20 2018/11/23
100 1975/03/09,1978/07/23,2008/11/12,2012/12/20 2018/11/23
100 1975/03/10,1978/07/23,2008/11/12,2012/12/20 2018/11/24
3 1990/08/01,1995/07/02 1993/08/01
50 1975/03/05,1978/07/23,2008/11/12,2012/12/20 2001/11/13
Observe que nos dois últimos exemplos, a data de saída está dentro do intervalo de datas de entrada, conforme a regra 5.
Respostas:
Mathematica
138 107237 bytesMinhas primeiras tentativas foram desleixadas e indignas. Isso deve funcionar geralmente, desde que as datas de nascimento sejam especificadas da ordem mais recente à mais recente, como nos casos de teste.
Os casos de teste foram bem escolhidos e difíceis de implementar corretamente. O código ficou muito mais longo do que eu esperava.
A lógica geral é
Casos de teste
fonte
PowerShell,
145125 bytesDesafio bastante complicado, mas relativamente simples uma vez entendido.
Expandido e Comentado:
Exemplo:
A entrada precisa conter uma matriz explicitamente formatada de representações de data e sequência. A saída está no
MM/DD/YYYY
formato (padrão para localização en-us no PowerShell).Editar - Golpeou 20 bytes, alterando a forma como iteramos nos aniversários e usando while em vez de fazer / até
fonte
PHP, 220 bytes
Eu adicionei algumas novas linhas para facilitar a leitura.
Ideone
Aqui está a versão não destruída:
fonte