神奇的日子和三胞胎
#python #perl #theweeklychallenge

每周挑战187

abaoqian1,My solution

经历了几次州际旅行和Covid-19的回合,现在已经开始到年底。 ICC男子Twenty20世界杯也已经开始在这里,所以现在该改变channel并扔掉下个月的遥控器了。穿黑色帽子!

任务1:在一起

任务

两个朋友,Foo和Bar分别在同一城市度过了假期。您获得了他们的时间表,即开始日期和结束日期。

为了使任务简单,日期为dd-mm的表格,所有日期都属于同一日历年,即01-01和31-12之间。这一年也是非统一的一年,两个日期都包含在内。

写一个脚本以查找给定时间表,他们在城市中度过了多少天,如果有的话。

我的解决方案

我真的很喜欢这个挑战,因为它让您考虑如何解决它们。日期数学从来都不容易。对于此任务,我将四个输入日期转换为一年中的一天(1 = 1月1日 st ,365 = 12月31日 st )。在Python中,我使用date模块,而我将Date::Calc用于Perl解决方案。这使得其余的解决方案相对容易。

我检查Foo和Bar到达之前是否都不会离开。我们可以通过计算最后一个人何时到达以及第一人称离开的时间来计算天数。如果这是一个负数,他们不会彼此见面。其他我们采用该值并添加1以打印解决方案。

例子

$ ./ch-1.py 12-01 20-01 15-01 18-01
4 days

$ ./ch-1.py 02-03 12-03 13-03 14-03
0 days

$ ./ch-1.py 02-03 12-03 11-03 14-03
2 days

$ ./ch-1.py 30-03 05-04 28-03 02-04
4 days

任务2:神奇的三胞胎

任务

您有一个正数列表,@n,至少有3个数字。

写一个脚本以从给定列表中找到满足以下规则的列表中的三重态(abc)。

  1. a + b> c
  2. b + c> a
  3. a + c> b
  4. A + B + C是最大的。

以防万一,您最终会有一个以上的三胞胎,然后选择三胞胎,其中a> = b> = c。

我的解决方案

我敢肯定,有一些更聪明的人在做这项挑战,这将提出一些公式来弄清楚解决此问题的最快方法,但是有时候,蛮力的方法足够好。特别是在处理少量事情时。

为了解决这一挑战,我使用python和perl中Algorithm::Combinatoricsitertools的组合函数来计算三位数的所有可能组合。

我迄今已将“最佳”解决方案存储在solutions列表中(最初在Python中设置为NONE,而Perl中的一个空arrayref)。

然后,

i然后循环整个组合,并确定是否满足前三个标准。如果它们和解决方案值是空的,或者总和大于当前的solution,则将solution设置为新列表。

我最终以指定格式打印结果。

例子

$ ./ch-2.py 1 2 3 2
(3, 2, 2)

$ ./ch-2.py 1 3 2
()

$ ./ch-2.py 1 1 2 3
()

$ ./ch-2.py 2 4 3
(4, 3, 2)