12
\$\开始组\$

排列算法

我想我已经确定了谷歌日历用来在“周”视图顶部直观地安排一天或更长时间事件的算法(你可以举个例子在这里尤其是如果你有一个共享的工作日历),它似乎是:

  • 按开始日期(以较早者为准)对所有事件进行排序;如果开始日期相同,则按长度排序(先长一点);如果开始日期和长度相同,则按插入时间排序(以较早者为准)
  • 对于这个排序列表中的每个元素,将其添加到第一个具有空间的现有水平泳道中,或者,如果没有合适的泳道,则在底部创建一个新泳道并将其放置在那里

请注意,结果不是递增的。也就是说,添加新事件可能会重新安排现有事件。

下图是一个示例结果,其中按字母顺序插入了事件。示例排列

成绩单:

第一行:周一至周五(含)活动“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)

示例

在这里是带有一些示例的参考实现。

请务必尝试其中一些示例,因为我上面的插图并没有涵盖所有的拐角情况(例如,当周一没有活动时,或者当泳道内部有一些间隙时)。

评分

这是,但我想鼓励单色(包括彩色文本输出),所以(包括彩色文本)响应得到2/3乘数。

\$\端组\$
14
  • 4
    \$\开始组\$ 我不建议在同一个挑战中同时尝试图形输出和ascii艺术,因为它们是完全独立的问题无论如何,奖金通常是不受鼓励的因为要求回答者编写一段代码的多个版本,以确定最短的代码。特别是对于这个挑战,挑战的核心是在网格中布局事件,而要求模糊指定的图形输出只是增加了另一个复杂性。 \$\端组\$ 5月1日9:45
  • 2
    \$\开始组\$ @我明白你的意思,在发帖之前我已经考虑过了。我决定以这种形式发布它,因为我愿意看看“请求指定不正确的图形输出”可能会鼓励创造性,而不是增加复杂性(因为这是一种消除限制而不是增加限制)。我承认我可能被证明是错的。 \$\端组\$ 5月1日9:48
  • 1
    \$\开始组\$ "你会知道结局≥开始。所有事件持续整数天,即不为零。“这两句话有点自相矛盾。不是吗结束>开始而不是结束开始如果事件不能持续零天? \$\端组\$ 5月1日9:53
  • 1
    \$\开始组\$ @KevinCruijssen在我的例子中使用的特定编码中,回答者不必遵循,start==end意味着事件持续一整天(开始日=周一,结束日=周一-->事件贯穿整个周一)。事实上,我添加了“整体,即非零”明确表示end==start并不意味着长度=0。 \$\端组\$ 5月1日9:57
  • 1
    \$\开始组\$ (我明白了,如果这只意味着更多的样板文件,为什么这会让人恼火,以及为什么会有反对此类规则的元帖子。这是针对下一个挑战的提示!但我现在不想改变它,因为这个问题已经存在了几个小时。谢谢您的反馈。) \$\端组\$ 5月1日14:24

4个答案4

重置为默认值
6
\$\开始组\$

Python语言,166字节×2/3=110.666

定义f(s,l,c=范围(1,99)):g=0;打印();f(*zip(*[(i,-j,k)for i,j,k in sorted(zip(s,map(int.__neg_,l),c)),如果g>i或[print(end=''*(i-g)+f'[38;5;{k*5}m#'*-j),g:=i-j]*0]))

在线尝试!(不是最好的体验,因为ATO不能显示颜色)

一个递归函数,接受两个列表作为参数,其中第一个列表中的每个元素表示事件的开始日期,第二个列表中相应的元素指定该事件的持续时间。

输出:
输出

Python语言,156字节

定义f(s,l,c=范围(65,91)):g=0;打印();f(*zip(*[(i,-j,k)for i,j,k in sorted(zip(s,map(int.__neg_,l),c)),如果g>i或[print(end=''*(i-g)+chr(k)*-j),g:=i-j]*0]))

在线尝试!

与上面的基本相同,但显示为单色ascii-art.,事件标记为大写字母。

\$\端组\$
0
6
\$\开始组\$

JavaScript(ES6),235×2/3=156.67字节

-5感谢@木坤丹314

应为列表[开始,结束]使用ANSI颜色配对和打印。

a=>a.map((a,i)=>[…a,`[38;5;${i*5+3}m@`]).sort(([s,e],[s,e])=>-(s<s|s==s&e>e)).map(([s,e,c])=>(g=(c,x=e)=>x<s|c(x)*g(c,x-1),o.some(r=>g(x=>!(r=r)[x])))|o.push(r=[]),g(x=>r[x]=c)),o=[])&&o.map(r=>[…r].map(c=>c||“”).join``).join``

在线试用!(无彩色渲染的ASCII乱码)

或者尝试单色版本使用A.Z.

输出

输出

\$\端组\$
2
  • \$\开始组\$ @尼古拉·萨普我再也不敢说现在没事了。。。但也许是这样。 \$\端组\$
    – 阿尔诺
    5月1日20:01
  • \$\开始组\$ :):)我还没有深入检查过,但从屏幕截图中看不出任何错误 \$\端组\$ 5月1日20:19
4
\$\开始组\$

木炭,41字节

W⁻Eθ⟦§κ摄氏度±§κ¹§αλ⟧υ⊞υ⌊ι如果υ«§ι摄氏度¦Β⁰WKKM↓×⊟ι±⊟ι

在线试用!链接指向详细版本的代码。将输入作为列表[开始,长度]对。说明:

W⁻Eθ⟦§κ摄氏度±§κ¹§αλ⟧υ⊞υ⌊ι

创建一个包含开始、否定长度和字母的修改事件列表,并对该列表进行排序。

如果υ«

循环排序的事件。

§ι摄氏度ζ

尝试将活动安排在第一条泳道上。

WKKM↓

向下移动,直到找到一条自由泳道。

×⊟ι±⊟ι

输出事件。

38字节,使用ATO上更新版本的木炭和@JonathanAllen的输入格式:

w(e)θ±⟦κλ⟧υ⊞υ⌈ι如果±υ«J⌊§ι摄氏度¦Β⁰WKKM↓קα⊟ιL⊟ι

在线尝试!链接指向详细版本的代码。

\$\端组\$
2
\$\开始组\$

果冻, 32字节

o个⁼+ɗ€TżJNÞṚṬa¥/€oç¦ṭ@ç?ƒ-ḊịØ为什么

接受列表的一元链接事件,每个都是正整数的有序列表(例如Mon-Sun=[1,2,3,4,5,6,7])并生成一个字符列表_泳道左侧的任何未填充空间A-Z(A-Z)用于活动日(尾部未填充空格被忽略)和泳道之间的换行。

在线试用!或者查看测试套件(根据参考实现输入翻译)。

注:
使用ANSI转义码的彩色版本有53个字节,超过\$\frac{3}{2}\$尺寸,TIO公司.

怎么用?

o个⁼+ɗ€TḢ - 链接1,查找可用索引:SwimlanesSoFar;事件掩码ɗ€-最后三个链接作为每个链接的二元链接:o-{Swimlane}逻辑OR{EventMask}(向量)+-{Swimlane}添加{EventMask}(矢量)⁼      -   {OR'd}等于(加上)?T-真实指数(1-指数)Ḣ - 头部->第一条可用车道的索引或0(如果未找到)żJNÞṚṬa¥/€oç¦ṭ@ç?ƒ-ḊịÖWY-链接:事件列表(日期列表)żJ-拉链[1..长度(事件)]->[[事件,ID],…]NÞ-按负值排序Ṛ                    - 颠倒¥/€-每笔减少:Ṭ                   -   谎言{天}a-逻辑AND{ID}->EventMask例如ID 9,Thu-Fri=[0,0,0,9,9]ƒ--从-1开始减少:?        -   如果。。。ç         -   ...条件:调用链接1oçé-。。。那么:链接1给出的索引处的逻辑ORṭ@          -   ...else:附加Ḋ     - 出列(删除-1)ØW-索引为“ABC…Zabc…x012..9_”Y-用换行符连接
\$\端组\$

你的答案

点击“发布您的答案”,即表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.