Github Messenger

13

Cel: ten cel polega na pobraniu ciągu znaków i wyświetleniu, ile wkładów należy przekazać w które dni, aby wyświetlić komunikat.

wprowadź opis zdjęcia tutaj

Specyfikacja

  • Wejście
    • Litery pomocnicze plus spacja (tj. [A-Za-z ])
    • Przestrzeń jest pusta 3X7
    • Litery są zdefiniowane w poniższej czcionce DOT Matrix 5x7
    • Wielkość każdej z liter jest prostokąt minimalna ograniczający (na przykład l = 3x7, e = 5x5)
  • Kolorowanie
    • Jest 5 kolorów C0, C1, C2, C3, C4
    • CXwymaga Ywkładów z3X <= y < 3(X+1)
    • Litery powinny występować na przemian między C1iC2
    • Przestrzenie nie mają koloru
    • Każdy rozmiar litery powinien pokrywać się dokładnie z 1 kolumną z sąsiadującymi literami
    • Jeśli komórka ma więcej niż 1 kolor, użyj C3
  • Matryca punktowa
    • Macierz kropkowa to wykres historii wkładu Githuba
    • Jeśli dzisiaj jest poniedziałek, 1 maja 2017 r .:
 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    
  • Wynik
    • Elastyczny sposób, w jaki jest to podane
    • (x, y) pary
    • x jest datą większą lub równą bieżącej dacie
    • y oznacza liczbę składek do wniesienia w dniu, x
    • Powinien być w porządku chronologicznym (aby wypełnić kalendarz)
    • Jeśli dla każdej daty xzostaną podane ydane, komunikat wejściowy powinien pojawić się na wykresie Github (z prawidłowym kolorowaniem)
    • Pierwsza data powinna być najwcześniej możliwa
  • Punktacja
    • Najkrótszy program / funkcja w bajtach wygrywa

Alfabet

Utworzony przez sylvan.black w ramach CC

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj


Przypadki testowe

Dla tych przypadków testowych załóż, że bieżącą datą jest 25 maja 2017 r.

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
Nieliniowe Owoce
źródło
Czy C4 był kiedykolwiek używany?
FryAmTheEggman
@FryAmTheEggman Nie jest, ale załączyłem go, aby uniknąć zamieszania, ponieważ Github wyświetla 5 kolorów w legendzie.
NielinioweOwoc
Jak ścisły / luźny jest format wyjściowy daty?
Stephen
1
@StephenS jest elastyczny, tak długo, jak to jest do odczytu przez człowieka (np May 20th, 2017: 3, (3,"20/5/17"))
NonlinearFruit
Gdzie znalazłeś tę tabelę składek?
Erik the Outgolfer

Odpowiedzi:

11

JavaScript (ES6), 743 bajty

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

Dane wyjściowe to tablica 2-elementowych tablic w formularzu [dateString, contribs]. Poniższy fragment kodu pokazuje, jak można go sformatować, aby był bardziej czytelny.

Bez golfa

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

Gdzie <...>reprezentuje 364-bajtowy ciąg znaków, który utworzyłem w celu zakodowania matrycy kropkowej każdej litery.

Wyjaśnienie

Zakodowany ciąg:

jn4x733nx8gjw6nhricv6nx8dpz2vilui81vikl7b4nhridnzvgc1svznx8dji8g16fkg0vgc6341vg38oe9vh669ofvgm1dvjnhricvyvikl7aonhrjrjxvikmm29m0rqqp2nqmi6o0vbnf6dav2t14e4vbnjqpqs0g34o3tlqqwdso43oixtg1uyt8vvgddxn2hizrn2ahizrmdbhj4suq4gtytq8wgshvtzyvgc4mq7gzhwhz4g15ymf4vg72q9snx7r2f4jmffjm7jm5gavjhizrn2mjmkh3wogsgmianjm5gavcgwxpc3mhvni2kijhgqujjj8mcsgsjhgslnihw2cx75iqyv1cuhwdrh5d

Każde 7 znaków to liczba binarna zakodowana w podstawie 36, która zawiera odwzorowanie znaku pod tym indeksem. Forma binarna zawsze ma wiodące 1, aby zachować wiodące 0. Na przykład wielka litera Todwzorowuje na nqmi6o0, co konwertuje na 1100 00001000 00011111 11100000 01000000. Pomijając wiodącą 1, każdy bit to jeden dzień. Większość liczb ma 5 kolumn / tygodni, więc liczby z mniej niż 5 kolumnami mają jeden lub dwa zestawy 7 zer końcowych, które są później usuwane przed analizą ( .replace(/(0{7})+$/,"")). Dzięki temu wszystkie zakodowane ciągi mają tę samą długość, co eliminuje potrzebę stosowania ograniczników.

Prawdopodobnie jest jeszcze więcej sposobów, aby to poprawić, szczególnie poprzez dalsze kompresowanie mapowań liter, więc dziel się dowolnymi pomysłami.

Format binarny odwzorowań liter (składnia JS, z prefiksem 0b) można znaleźć tutaj .

Podstawowy fragment kodu

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

Interaktywny przykład

Korzystając z biblioteki cal-heatmap , stworzyłem interaktywną mapę cieplną dat, które są generowane. Służyło to do testowania wszystkiego podczas pracy i po prostu wygląda schludnie.

Justin Mariner
źródło
1
Interaktywny przykład jest naprawdę niesamowity. Dobra robota!
NielinioweOwoc
1
O Boże, ktoś to zrobił! Ładny!
Magic Octopus Urn
Dzięki chłopaki! To było naprawdę fajne wyzwanie, chciałbym, żeby więcej osób przyszło spróbować. Zredagowałem swoją odpowiedź, aby dołączyć binarne litery macierzy kropkowej, aby inni mogli skorzystać z tego samego pomysłu.
Justin Mariner,
1
@JustinMariner Wrzuciłem to do mojego profilu, mam nadzieję, że nie masz nic przeciwko. Dobra odpowiedź, cieszę się, że ktoś ukończył to wyzwanie :)
Stephen
@StephenS Nice, cieszę się, że ci się podobało!
Justin Mariner,