排列算法
我想我已经确定了谷歌日历用来在“周”视图顶部直观地安排一天或更长时间事件的算法(你可以举个例子在这里尤其是如果你有一个共享的工作日历),它似乎是:
- 按开始日期(以较早者为准)对所有事件进行排序;如果开始日期相同,则按长度排序(先长一点);如果开始日期和长度相同,则按插入时间排序(以较早者为准)
- 对于这个排序列表中的每个元素,将其添加到第一个具有空间的现有水平泳道中,或者,如果没有合适的泳道,则在底部创建一个新泳道并将其放置在那里
请注意,结果不是递增的。也就是说,添加新事件可能会重新安排现有事件。
下图是一个示例结果,其中按字母顺序插入了事件。
成绩单:
第一行:周一至周五(含)活动“a”,周六活动“k”
第二行:事件“j”周一至周三,事件“c”周四至周日
第三行:事件“i”周一至周二,事件“b”周三至周四,事件“f”周五至周日
第四排:活动“l”周二至周三,活动“d”周四至周五
第五行:事件“e”周三至周四,事件“g”周五至周日
第六排:活动“h”周五至周日
(作为一个欧洲人,我使用一周从星期一开始的惯例。你可以自由阅读我的示例,将其视为从星期日开始:一旦你选择了编码,这就无关紧要了。)
挑战
编写生成和显示器事件列表的谷歌式排列。
所描述的算法可能具有等效的公式,也可能具有更简单的公式。只需确保您的算法将产生与参考算法相同的排列。
您的代码收到
以您选择的方便、合理的形式列出事件(例如,成对列表(一,b条)其中一∈{0…6}是一周的开始日期,b条∈{0…6}是事件的结束日期或长度)。
- 事件在输入中没有名称。
- 秩序很重要。
- 最多有26场比赛。他们在一周内全部被控制住了。
- 假设输入有效,即如果您选择(开始日期,结束日期)格式,您将知道结束≥开始。所有事件持续整数天,即不为零。
- 使用任何有效的输入(stdin、函数参数、读取文件、Google Sheets单元格…)。
您的代码生成
安排的事件的ascii艺术或图形输出。
- 事件必须用独特的名称(例如“a”到“z”)或独特的颜色(例如彩条)。如果您的语言是为16色显示器设计的,则可以进行包装(即第一次和第十七次事件共享相同的颜色)。即使代码支持颜色,也可以使用文本标签代替颜色标签。
- 独特的名称/颜色必须具有隐式顺序,并且顺序必须与输入中事件的顺序匹配。
- 输出可以如上所述(即,一周从左到右,泳道从上到下排列)或换位(一周从上到底,泳道由左到右排列)。
- 输出必须明确,即打印到控制台或在屏幕上显示。返回2D字符矩阵不符合此挑战的精神。返回一个完整的可打印字符串,包括它自己的换行符是可以的。
ascii-arts示例:
AAAAA K|[=====A===]。K] ……|A___K'JJJCCC |[==J==]。[==C==]…|J__C_'IIBBFFF或[=I=]。[=B=]。[==F==]或I_B_F__LLDD|。。。[=L=]。[=D=]……|'L_D_“”EEGGG|。。。。。。[=E=]。[==G==]|''E_G__HHH|。。。。。。。。。。。。[==H==]|''高__(mm tt ww tt ff ss)
示例
在这里是带有一些示例的参考实现。
❕ 请务必尝试其中一些示例,因为我上面的插图并没有涵盖所有的拐角情况(例如,当周一没有活动时,或者当泳道内部有一些间隙时)。
评分
这是代码嗅觉,但我想鼓励图形输出单色(包括彩色文本输出)ASCII艺术,所以图形输出(包括彩色文本)响应得到2/3乘数。