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

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.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.