깃 허브 메신저


13

목표 : 이 목표는 문자열을 가져 와서 메시지를 표시하기 위해 몇 일 동안 얼마나 많은 기여를해야하는지 출력하는 것입니다.

여기에 이미지 설명을 입력하십시오

사양

  • 입력
    • 지원 문자 플러스 공간 (예 [A-Za-z ])
    • 공백은 공백입니다 3X7
    • 글자는 아래에 제공된 이 5x7 DOT 매트릭스 글꼴 로 정의 됩니다.
    • 각 글자의 크기는 최소 경계 사각형 (예 l = 3x7, e = 5x5)
  • 착색
    • 5 가지 색상이 있습니다 C0, C1, C2, C3, C4
    • CXY기여해야 함3X <= y < 3(X+1)
    • 편지가 교대로해야 C1하고C2
    • 공백이없는 공간
    • 각 글자 크기는 인접한 글자와 정확히 1 개의 열을 겹쳐 야합니다.
    • 셀의 색상이 둘 이상인 경우 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 그래프에 표시되어야합니다 (올바른 색상 표시).
    • 첫 데이트는 가능한 빨리
  • 채점
    • 바이트 단위의 가장 짧은 프로그램 / 기능

알파벳

CC에서 sylvan.black에 의해 생성

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오


테스트 사례

이 테스트 사례의 경우 현재 날짜가 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

@FryAmTheEggman Github은 범례에 5 가지 색상을 표시하기 때문에 혼란을 피하기 위해 포함시키지 않았습니다.
NonlinearFruit

날짜 출력 형식이 얼마나 엄격합니까?
Stephen

1
그것은 한 그대로, 사람이 읽을 수있는 (예를 들면 유연 @StephenS May 20th, 2017: 3, (3,"20/5/17"))
NonlinearFruit

그 기여 표를 어디서 찾았습니까?
Outgolfer Erik

답변:


11

자바 스크립트 (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을 유지하기 위해 선행 0을가집니다. 예를 들어 대문자 T는로 매핑되고 nqmi6o0로 변환됩니다 1100 00001000 00011111 11100000 01000000. 선행 1을 건너 뛰면 각 비트는 하루입니다. 대부분의 숫자는 주당 5 개의 열을 가지므로 열이 5 개 미만인 숫자는 나중에 구문 분석하기 전에 제거되는 7 개의 후행 0으로 구성된 하나 또는 두 개의 세트를 갖습니다 ( .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 라이브러리를 사용하여 출력되는 날짜의 대화 형 히트 맵을 만들었습니다. 이것은 작업하는 동안 모든 것을 테스트하는 데 사용되었으며 깔끔하게 보입니다.


1
대화식 예제는 정말 훌륭합니다. 좋은 작업!
NonlinearFruit

1
세상에, 누군가 실제로 이것을했습니다! 좋은!
매직 문어 Urn

고마워요! 이것은 정말 멋진 도전이었습니다. 더 많은 사람들이 시도해보기를 바랍니다. 다른 사람들이 같은 아이디어를 사용할 수 있도록 점 행렬 문자를 이진으로 포함하도록 내 대답을 편집했습니다.
Justin Mariner

1
@JustinMariner 나는 이것을 내 프로필에 띄웠다. 걱정하지 않기를 바란다. 좋은 답변, 누군가가이 도전을 완료하게 된 것을 기쁘게 생각합니다 :)
Stephen

@StephenS 니스, 당신이 그것을 좋아 기쁘다!
저스틴 마리너
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.