Github Messenger


13

目标:该目标采用字符串并输出在哪一天应该显示多少信息才能显示消息。

在此处输入图片说明

规格

  • 输入值
    • 支持字母加空格(即[A-Za-z ]
    • 空格是空白 3X7
    • 字母在下面提供的5x7 DOT矩阵字体中定义
    • 每个字母的大小是最小外接矩形(例如l = 3x7e = 5x5
  • 染色
    • 有5种颜色 C0, C1, C2, C3, C4
    • CX需要Y3X <= y < 3(X+1)
    • 字母应在C1和之间交替C2
    • 空间没有颜色
    • 每个字母的大小应与相邻字母精确重叠一列
    • 如果单元格的颜色超过一种,则使用 C3
  • 点矩阵
    • 点矩阵是Github的贡献历史记录图
    • 如果今天是2017年5月1日,星期一:
 4-30    5-07    5-15
[5-01]   5-08    5-16
 5-02    5-09     .
 5-03    5-10     .
 5-04    5-12     .
 5-05    5-13    
 5-06    5-14    
  • 输出量
    • 灵活地给出
    • (x, y)
    • x 是大于或等于当前日期的日期
    • y 是当日的缴款数量, x
    • 应该按时间顺序排列(以便我可以填写日历)
    • 如果对于每个日期都做出x了给定的y贡献,则输入消息应显示在Github图上(带有正确的颜色)
    • 第一次约会应该尽早
  • 计分
    • 以字节为单位的最短程序/功能获胜

字母

由sylvan.black在CC下创建

在此处输入图片说明 在此处输入图片说明


测试用例

对于这些测试用例,假定当前日期为2017年5月25日。

Input -> Output
-----    ------
l        5-28-17, 3
         6-3-17, 3
         6-4-17, 3
         6-5-17, 3
         6-6-17, 3
         6-7-17, 3
         6-8-17, 3
         6-9-17, 3
         6-10-17, 3
         6-17-17, 3

He       5-28-17, 3
         5-29-17, 3
         5-30-17, 3
         5-31-17, 3
         6-1-17, 3
         6-2-17, 3
         6-3-17, 3
         6-7-17, 3
         6-14-17, 3
         6-21-17, 3
         6-25-17, 3
         6-26-17, 3
         6-27-17, 3
         6-28-17, 9
         6-29-17, 9
         6-30-17, 9
         7-1-17, 3
         7-4-17, 6
         7-6-17, 6
         7-8-17, 6
         7-11-17, 6
         7-13-17, 6
         7-15-17, 6
         7-18-17, 6
         7-20-17, 6
         7-22-17, 6
         7-26-17, 6
         7-27-17, 6

o W      5-31-17, 3
         6-1-17, 3
         6-2-17, 3
         6-6-17, 3
         6-10-17, 3
         6-13-17, 3
         6-17-17, 3
         6-20-17, 3
         6-24-17, 3
         6-28-17, 3
         6-29-17, 3
         6-30-17, 3
         7-9-17, 6
         7-10-17, 6
         7-11-17, 6
         7-12-17, 6
         7-13-17, 6
         7-14-17, 6
         7-22-17, 6
         7-26-17, 6
         7-27-17, 6
         7-28-17, 6
         8-5-17, 6
         8-6-17, 6
         8-7-17, 6
         8-8-17, 6
         8-9-17, 6
         8-10-17, 6
         8-11-17, 6

使用过C4吗?
FryAmTheEggman's

@FryAmTheEggman不是,但是为了避免混淆,我将其包括在内,因为Github在图例中显示5种颜色。
NonlinearFruit

您对日期输出格式的严格/宽松程度是多少?
斯蒂芬

1
@StephenS它是灵活的,只要它是人类可读的(例如May 20th, 2017: 3(3,"20/5/17")
NonlinearFruit

您在哪里找到该供款表?
暴民埃里克'17

Answers:


11

JavaScript(ES6),743字节

s=>(n=y=>d.setDate(d.getDate()+y),d=new Date,(h=d.getDay())&&n(7-h),r={},i=0,[...s].map(c=>{c<"!"?n(14):([...parseInt("jn4x733nx8gjw6nhricv6nx8dpz2vilui81vikl7b4nhridnzvgc1svznx8dji8g16fkg0vgc6341vg38oe9vh669ofvgm1dvjnhricvyvikl7aonhrjrjxvikmm29m0rqqp2nqmi6o0vbnf6dav2t14e4vbnjqpqs0g34o3tlqqwdso43oixtg1uyt8vvgddxn2hizrn2ahizrmdbhj4suq4gtytq8wgshvtzyvgc4mq7gzhwhz4g15ymf4vg72q9snx7r2f4jmffjm7jm5gavjhizrn2mjmkh3wogsgmianjm5gavcgwxpc3mhvni2kijhgqujjj8mcsgsjhgslnihw2cx75iqyv1cuhwdrh5d".substr((c.charCodeAt()-(c>"`"?71:65))*7,7),36).toString(2).slice(1).replace(/(0{7})+$/,"")].map(b=>(+b&&(r[+d]=r[+d]?9:i%2?6:3),n(1))),i++,n(-7))}),Object.keys(r).map(k=>[k,r[k]]).sort((i,j)=>i[0]-j[0]>0?1:-1).map(i=>[(new Date(+i[0])+"").slice(4,15),i[1]]))

输出是形式为2项的数组[dateString, contribs]。下面的代码段显示了如何将其格式化为更具可读性的格式。

未打高尔夫球

s=>(
    n=y=>d.setDate(d.getDate()+y),
    d=new Date,
    (h=d.getDay()) && n(7-h),
    r={},
    i=0,
    [...s].map(c=>{
        c<"!" ? n(14) : (
            [...parseInt("<...>".substr((c.charCodeAt()-(c>"`"?71:65))*7,7),36).toString(2).slice(1).replace(/(0{7})+$/,"")].map(b=>(
                +b && (r[+d] = r[+d] ? 9 : i%2?6:3),
                n(1)
            )),
            i++,
            n(-7)
        )
    }),
    Object.keys(r)
        .map(k=>[k,r[k]])
        .sort((i,j)=>i[0]-j[0] > 0 ? 1 : -1)
        .map(i => [ (new Date(+i[0])+"").slice(4,15), i[1] ])
)

其中,<...>代表我为编码每个字母的点阵形式而创建的364字节的字符串。

说明

编码的字符串:

jn4x733nx8gjw6nhricv6nx8dpz2vilui81vikl7b4nhridnzvgc1svznx8dji8g16fkg0vgc6341vg38oe9vh669ofvgm1dvjnhricvyvikl7aonhrjrjxvikmm29m0rqqp2nqmi6o0vbnf6dav2t14e4vbnjqpqs0g34o3tlqqwdso43oixtg1uyt8vvgddxn2hizrn2ahizrmdbhj4suq4gtytq8wgshvtzyvgc4mq7gzhwhz4g15ymf4vg72q9snx7r2f4jmffjm7jm5gavjhizrn2mjmkh3wogsgmianjm5gavcgwxpc3mhvni2kijhgqujjj8mcsgsjhgslnihw2cx75iqyv1cuhwdrh5d

每7个字符是一个以36为基数编码的二进制数字,其中包含该索引处该字符的映射。二进制形式始终具有前导1,以保留前导0s。例如,大写字母T映射到nqmi6o0,将转换为1100 00001000 00011111 11100000 01000000。跳过前导1,每一位都是一天。大多数数字每星期有5列,因此少于5列的数字有1组或2组7个尾随零,之后在解析(.replace(/(0{7})+$/,""))之前将其删除。这样可以使所有编码的字符串保持相同的长度,从而无需使用分隔符。

可能还有更多方法可以对此进行改进,尤其是进一步压缩字母映射时,请随时分享任何想法。

0b可以在此处找到字母映射的二进制格式(JS语法,以开头)。

基本摘要

f=
s=>(n=y=>d.setDate(d.getDate()+y),d=new Date,(h=d.getDay())&&n(7-h),r={},i=0,[...s].map(c=>{c<"!"?n(14):([...parseInt("jn4x733nx8gjw6nhricv6nx8dpz2vilui81vikl7b4nhridnzvgc1svznx8dji8g16fkg0vgc6341vg38oe9vh669ofvgm1dvjnhricvyvikl7aonhrjrjxvikmm29m0rqqp2nqmi6o0vbnf6dav2t14e4vbnjqpqs0g34o3tlqqwdso43oixtg1uyt8vvgddxn2hizrn2ahizrmdbhj4suq4gtytq8wgshvtzyvgc4mq7gzhwhz4g15ymf4vg72q9snx7r2f4jmffjm7jm5gavjhizrn2mjmkh3wogsgmianjm5gavcgwxpc3mhvni2kijhgqujjj8mcsgsjhgslnihw2cx75iqyv1cuhwdrh5d".substr((c.charCodeAt()-(c>"`"?71:65))*7,7),36).toString(2).slice(1).replace(/(0{7})+$/,"")].map(b=>(+b&&(r[+d]=r[+d]?9:i%2?6:3),n(1))),i++,n(-7))}),Object.keys(r).map(k=>[k,r[k]]).sort((i,j)=>i[0]-j[0]>0?1:-1).map(i=>[(new Date(+i[0])+"").slice(4,15),i[1]]))

I.value="Hello World";
(I.oninput=_=>O.innerHTML = f(I.value).map(e=>e.join(": ")).join("\n"))();
<input id="I">
<pre id="O">

互动范例

使用库cal-heatmap,我创建了输出日期的交互式热图。它用于在工作时测试所有内容,看起来很简洁。


1
交互式示例确实很棒。不错的工作!
NonlinearFruit

1
哦,天哪,实际上是有人这样做的!真好!
Magic Octopus Urn

谢谢你们!这是一个非常酷的挑战,希望更多的人来尝试一下。我已经编辑了答案,将点阵字母包含在二进制中,以便其他人可以使用相同的想法。
贾斯汀·马里纳

1
@JustinMariner我将此添加到我的个人资料,希望您不要介意。好的答案,很高兴有人完成了这个挑战:)
Stephen

@StephenS很好,很高兴您喜欢它!
贾斯汀·马里纳
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.