在给定期间内,使用笑话获得最小的日期列表


13

考虑日期格式为的日期YYYY-MM-DD。您可以*在日期字符串的末尾使用小丑。例如,2016-07-2*描述从2016-07-20到的所有日期2016-07-29

现在,考虑由开始日期和结束日期表示的期间。

该算法必须找到代表该期间的最小日期列表。

让我们举一个例子。在以下期间:

  • 开始日期: 2014-11-29
  • 结束日期: 2016-10-13

该算法必须返回一个包含以下日期列表的数组:

  • 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
获胜目标是模棱两可的。我建议将其更改为codegolf(即以尽可能少的字节数来解决任务),并且始终需要答案才能输出最小的日期列表。
Billywob '16

也许这根本不是最好的网站,它比“挑战”挑战更多的问题(即“我在Ruby on Rails中找不到此算法”)。我在这里很新...
Raphael

我建议您尝试使用stackoverflow,然后将其作为问题而不是挑战来提出。如果改写,挑战在我看来仍然很有趣,并且值得一试(就像打高尔夫一样)。
Billywob '16

6
是的,我认为找到算法仍然很有趣且具有挑战性,但是我对代码高尔夫方面不感兴趣...好吧,我改写了它,更改了标签,现在我要问stackoverflow,同时仍然关注这篇文章。谢谢!
拉斐尔

1
后续:我昨天在Stackoverflow上发布了,但是今天我在Ruby中有一个有效的代码(它没有“开玩笑”的几个月,但是几乎在那里):stackoverflow.com/questions/40506639/…–
Raphael

Answers:


1

PHP,541343字节

我想首先让算法开始工作;但是打高尔夫球实际上比我预期的要有趣得多(尤其是浏览受支持的日期和时间格式)。

三个主要动作节省了约130个字节;但是小型高尔夫比赛中的70个字节
(这也使一大步过时了)带来了很多乐趣。

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),"
";}

从命令行参数获取输入。在线运行-nr或对其进行测试

笔记

  • 打印Y-m-3*Y-m-30; 添加7个字节来修复:在|$a==$t后面插入777600))
  • 在PHP 7.1中引发警告;添加5个字节来修复:替换+$p+!$p
  • 故障和解释的一些高尔夫球准备发布。
    但我会稍等一下,看看是否有人屈服。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.