Tin nhắn của Github


13

Mục tiêu: Mục tiêu này để lấy một chuỗi và xuất ra bao nhiêu đóng góp nên được thực hiện vào những ngày nào để hiển thị một thông báo.

nhập mô tả hình ảnh ở đây

Sự chỉ rõ

  • Đầu vào
    • Thư hỗ trợ cộng với không gian (tức là [A-Za-z ])
    • Không gian trống 3X7
    • Các chữ cái được xác định trong phông chữ Ma trận DOT 5x7 được cung cấp bên dưới
    • Kích thước của mỗi chữ cái là hình chữ nhật bounding tối thiểu (ví dụ l = 3x7, e = 5x5)
  • Tô màu
    • Có 5 màu C0, C1, C2, C3, C4
    • CXyêu cầu Yđóng góp với3X <= y < 3(X+1)
    • Chữ cái nên xen kẽ giữa C1C2
    • Không gian không có màu
    • Mỗi kích thước chữ nên chồng chính xác 1 cột với các chữ cái liền kề
    • Nếu một ô có nhiều hơn 1 màu thì sử dụng C3
  • Ma trận điểm
    • Ma trận điểm là biểu đồ lịch sử đóng góp của Github
    • Nếu hôm nay là thứ Hai, ngày 1 tháng 5 năm 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    
  • Đầu ra
    • Linh hoạt về cách thức này được đưa ra
    • (x, y) cặp
    • x là một ngày lớn hơn hoặc bằng ngày hiện tại
    • y là số lượng đóng góp được thực hiện vào ngày, x
    • Nên theo thứ tự thời gian (để tôi có thể điền vào lịch của mình)
    • Nếu cho mỗi ngày, xcác yđóng góp đã cho được thực hiện, thông báo đầu vào sẽ hiển thị trên biểu đồ Github (với màu chính xác)
    • Ngày đầu tiên nên sớm nhất có thể
  • Chấm điểm
    • Chương trình / hàm ngắn nhất tính theo byte

Bảng chữ cái

Được tạo bởi sylvan.black theo CC

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


Các trường hợp thử nghiệm

Đối với các trường hợp thử nghiệm này, giả sử ngày hiện tại là ngày 25 tháng 5 năm 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

Có bao giờ C4 được sử dụng?
FryAmTheEggman

@FryAmTheEggman Không phải vậy, nhưng tôi đã đưa nó vào để tránh nhầm lẫn vì Github hiển thị 5 màu trong truyền thuyết.
Phi tuyến

Làm thế nào nghiêm ngặt / lỏng lẻo bạn về định dạng đầu ra ngày?
Stephen

1
@StephenS Đó là linh hoạt, miễn là nó có thể đọc được con người (ví dụ May 20th, 2017: 3, (3,"20/5/17"))
NonlinearFruit

Bạn đã tìm thấy bảng đóng góp đó ở đâu?
Erik the Outgolfer

Câu trả lời:


11

JavaScript (ES6), 743 byte

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]]))

Đầu ra là một mảng các mảng 2 mục trong biểu mẫu [dateString, contribs]. Đoạn mã dưới đây cho thấy làm thế nào có thể được định dạng để dễ đọc hơn.

Không chơi gôn

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] ])
)

Trong đó <...>biểu thị chuỗi ký tự 364 byte mà tôi đã tạo để mã hóa dạng ma trận điểm của mỗi chữ cái.

Giải trình

Chuỗi được mã hóa:

jn4x733nx8gjw6nhricv6nx8dpz2vilui81vikl7b4nhridnzvgc1svznx8dji8g16fkg0vgc6341vg38oe9vh669ofvgm1dvjnhricvyvikl7aonhrjrjxvikmm29m0rqqp2nqmi6o0vbnf6dav2t14e4vbnjqpqs0g34o3tlqqwdso43oixtg1uyt8vvgddxn2hizrn2ahizrmdbhj4suq4gtytq8wgshvtzyvgc4mq7gzhwhz4g15ymf4vg72q9snx7r2f4jmffjm7jm5gavjhizrn2mjmkh3wogsgmianjm5gavcgwxpc3mhvni2kijhgqujjj8mcsgsjhgslnihw2cx75iqyv1cuhwdrh5d

Mỗi 7 ký tự là một số nhị phân được mã hóa cơ sở 36 có chứa ánh xạ cho ký tự ở chỉ mục đó. Các hình thức nhị phân luôn luôn có một hàng đầu 1để bảo vệ các 0s hàng đầu . Ví dụ, một Tbản đồ chữ hoa thành nqmi6o0, chuyển đổi thành 1100 00001000 00011111 11100000 01000000. Bỏ qua 1 hàng đầu, mỗi bit là một ngày. Hầu hết các số có 5 cột / tuần, do đó, các số có ít hơn 5 cột có một hoặc hai bộ 7 số 0 sau đó được xóa sau khi phân tích cú pháp ( .replace(/(0{7})+$/,"")). Điều này giữ cho tất cả các chuỗi được mã hóa có cùng độ dài, loại bỏ sự cần thiết của các dấu phân cách.

Có lẽ vẫn còn nhiều cách để cải thiện điều này, đặc biệt là với việc nén các ánh xạ chữ cái hơn nữa, vì vậy hãy thoải mái chia sẻ bất kỳ ý tưởng nào.

Định dạng nhị phân của ánh xạ chữ cái (cú pháp JS, có tiền tố 0b), có thể được tìm thấy ở đây .

Đoạn trích cơ bản

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">

Ví dụ tương tác

Sử dụng thư viện cal-Heatmap , tôi đã tạo ra một bản đồ nhiệt tương tác của các ngày đó là đầu ra. Điều này đã được sử dụng để kiểm tra tất cả mọi thứ trong khi làm việc, và nó trông có vẻ gọn gàng.


1
Ví dụ tương tác thực sự tuyệt vời. Công việc tốt!
Phi tuyến

1
Trời ơi, có người thực sự đã làm điều này! Đẹp!
Bạch tuộc ma thuật Urn

Cảm ơn các bạn! Đây là một thử thách thực sự tuyệt vời, tôi ước nhiều người sẽ đến thử nó. Tôi đã chỉnh sửa câu trả lời của mình để bao gồm các chữ cái ma trận điểm trong nhị phân để những người khác có thể sử dụng cùng một ý tưởng.
Justin Mariner

1
@JustinMariner Tôi đã đưa nó vào hồ sơ của tôi, hy vọng bạn không phiền. Câu trả lời hay, rất vui vì ai đó đã hoàn thành thử thách này :)
Stephen

@StephenS Rất vui, rất vui vì bạn thích nó!
Justin Mariner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.