Por um determinado período, obtendo a menor lista de datas, usando curingas

13

Considere uma data formatada em YYYY-MM-DD. Você pode usar o curinga *no final da sequência de datas. Por exemplo, 2016-07-2*descreve todas as datas de 2016-07-20até 2016-07-29.

Agora, considere um período representado por uma data de início e uma data de término.

O algoritmo deve encontrar a menor lista possível de datas que representam o período.

Vamos usar um exemplo. Pelo período seguinte:

  • data de início: 2014-11-29
  • data final: 2016-10-13

O algoritmo deve retornar uma matriz contendo a seguinte lista de datas:

  • 2014-11-29
  • 2014-11-30
  • 2014-12-*
  • 2015-*
  • 2016-0*
  • 2016-10-0*
  • 2016-10-10
  • 2016-10-11
  • 2016-10-12
  • 2016-10-13
Rafael
fonte
1
O (s) objetivo (s) vencedor (es) é ambíguo. Sugiro alterá-lo para codegolf (ou seja, resolver a tarefa no menor número de bytes possível) e sempre exigir respostas para gerar a menor lista de datas.
Billywob
Talvez simplesmente não seja o melhor site para isso, é mais uma pergunta (ou seja, "Não consigo encontrar esse algoritmo no Ruby on Rails") do que um desafio "por diversão". Eu sou bastante novo aqui ...
Raphael
Sugiro que você tente o stackoverflow e faça-o como uma pergunta, e não como um desafio. Se reformulado, o desafio ainda é interessante na minha opinião e merece uma chance (como código de golfe).
Billywob
6
Sim, acho que encontrar o algoritmo ainda é divertido e desafiador, mas não estava interessado no lado do código-golfe ... Bem, reformulei-o, mudei as tags e agora vou pedir o stackoverflow enquanto ainda segue este post. Obrigado!
Raphael
1
Acompanhamento: eu postei ontem no Stackoverflow, mas hoje eu tinha um código de trabalho em Ruby (ele não "coringa" meses, mas está quase lá): stackoverflow.com/questions/40506639/…
Raphael

Respostas:

1

PHP, 541 343 bytes

Eu queria que o algoritmo funcionasse em primeiro lugar; mas jogar golfe foi realmente muito mais divertido do que eu esperava (principalmente navegando nos formatos de data e hora compatíveis ).

Três ações principais salvaram cerca de 130 bytes; mas os 70 bytes de golfe menor
(que também tornavam obsoletos um dos grandes degraus) eram muito divertidos.

for($a=($f=strtotime)($argv[1]);!$p=$a>$z=$f($argv[2]);$a+=86400){$x=$z<$e=$f(Dec31,$a);(101<$q=date(md,$a))?$q-1001|$x?:$a=$e+$p="1*":($x?($t=$f(IX30,$a))>$z?:$a=$t+$p="0*":$a=$e+$p="*");$p?:($q%100>1|$z<($t=$f(date(Ymt,$a)))?$q%10>0&$q%100>1|$z<($t=min($t,$a+777600))?:$a=$t+$p="m-$q[2]*":$a=$t+$p="m-*");echo date("Y-".($p?:"m-d"),$a),"
";}

recebe entrada dos argumentos da linha de comando. Execute -nrou teste on-line .

notas

  • imprime Y-m-3*para Y-m-30; adicione 7 bytes para corrigir: Insira |$a==$tdepois 777600)).
  • lança avisos no PHP 7.1; adicione 5 bytes para corrigir: Substitua +$ppor +!$p.
  • Um colapso e alguns golfe explicados estão prontos para serem publicados;
    mas vou esperar um pouco para ver se alguém mais envia antes que eu estrague.
Titus
fonte