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.