Github Messenger


13

เป้าหมาย:เป้าหมายนี้เพื่อรับสตริงและแสดงจำนวนผลงานที่ควรทำในวันใดเพื่อแสดงข้อความ

ป้อนคำอธิบายรูปภาพที่นี่

สเปค

  • อินพุต
    • ตัวอักษรสนับสนุนบวกช่องว่าง (เช่น[A-Za-z ])
    • พื้นที่ว่างเปล่า 3X7
    • ตัวอักษรถูกกำหนดไว้ในฟอนต์5x7 DOT Matrix ที่จัดไว้ให้ด้านล่าง
    • ขนาดของตัวอักษรแต่ละตัวเป็นรูปสี่เหลี่ยมผืนผ้า bounding ขั้นต่ำ (เช่นl = 3x7, e = 5x5)
  • การระบายสี
    • มี 5 สี C0, C1, C2, C3, C4
    • CXต้องYมีส่วนร่วมกับ3X <= y < 3(X+1)
    • ตัวอักษรควรสลับระหว่างC1และC2
    • ช่องว่างไม่มีสี
    • ขนาดตัวอักษรแต่ละตัวควรทับซ้อนกัน 1 คอลัมน์ด้วยตัวอักษรที่อยู่ติดกัน
    • หากเซลล์มีมากกว่า 1 สีให้ใช้ C3
  • เมทริกซ์ดอท
    • ดอทเมทริกซ์เป็นกราฟประวัติผลงานของ Github
    • หากวันนี้เป็นวันจันทร์ที่ 1 พฤษภาคม 2017:
 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

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่


กรณีทดสอบ

สำหรับกรณีทดสอบเหล่านี้สมมติว่าวันที่ปัจจุบันคือ 25 พฤษภาคม 2017

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

@FryAmTheEggman มันไม่ได้ แต่ฉันรวมไว้เพื่อหลีกเลี่ยงความสับสนเพราะ Github แสดง 5 สีในตำนาน
NonlinearFruit

คุณเข้มงวดมากแค่ไหนในรูปแบบเอาต์พุตวันที่?
Stephen

1
@StephenS มันมีความยืดหยุ่นตราบใดที่มันคือการอ่านของมนุษย์ (เช่นMay 20th, 2017: 3, (3,"20/5/17"))
NonlinearFruit

คุณพบตารางการบริจาคนั้นอยู่ที่ไหน
Erik the Outgolfer

คำตอบ:


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 คอลัมน์จะมีเลขศูนย์ต่อท้าย 7 ชุดหนึ่งหรือสองชุดซึ่งถูกลบภายหลังก่อนการแยกวิเคราะห์ ( .replace(/(0{7})+$/,"")) สิ่งนี้ทำให้สตริงที่เข้ารหัสทั้งหมดมีความยาวเท่ากันทำให้ไม่จำเป็นต้องใช้ตัวคั่น

อาจยังมีวิธีอื่นอีกมากที่จะปรับปรุงให้ดีขึ้นโดยเฉพาะอย่างยิ่งเมื่อบีบอัดการแมปตัวอักษรเพิ่มเติมดังนั้นอย่าลังเลที่จะแบ่งปันแนวคิดใด ๆ

รูปแบบไบนารีของแมปตัวอักษร (JS ไวยากรณ์นำหน้าด้วย0b) สามารถพบได้ที่นี่

ตัวอย่างพื้นฐาน

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ฉันสร้าง heatmap แบบโต้ตอบของวันที่ที่ส่งออก มันถูกใช้เพื่อทดสอบทุกอย่างในขณะที่ทำงานและมันก็ดูเรียบร้อยดี


1
ตัวอย่างเชิงโต้ตอบนั้นยอดเยี่ยมมาก งานที่ดี!
NonlinearFruit

1
โอ้พระเจ้าจริง ๆ แล้วมีคนทำเช่นนี้! ดี!
Magic Octopus Urn

ขอบคุณเพื่อน! นี่เป็นความท้าทายที่เจ๋งจริง ๆ ฉันหวังว่าจะมีคนอีกมากที่จะลอง ฉันได้แก้ไขคำตอบเพื่อรวมตัวอักษรดอทเมทริกซ์เป็นเลขฐานสองเพื่อให้ผู้อื่นสามารถใช้แนวคิดเดียวกันได้
Justin Mariner

1
@JustinMariner ฉันดึงสิ่งนี้ลงในโปรไฟล์ของฉันหวังว่าคุณจะไม่เป็นไร คำตอบที่ดีดีใจที่มีคนทำเรื่องนี้ให้สำเร็จ :)
สตีเฟ่น

@StephenS ดีดีใจที่คุณชอบมัน!
Justin Mariner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.