Github Messenger


13

Ziel: Dieses Ziel ist es, einen String zu nehmen und auszugeben, wie viele Beiträge an welchen Tagen gemacht werden sollen, um eine Nachricht anzuzeigen.

Bildbeschreibung hier eingeben

Spezifikation

  • Eingang
    • Unterstützung Buchstaben plus Speicherplatz (dh [A-Za-z ])
    • Der Raum ist ein Leerzeichen 3X7
    • Die Buchstaben sind in der unten angegebenen 5x7 DOT Matrix- Schriftart definiert
    • Die Größe der einzelnen Buchstaben ist das minimale Begrenzungsrechteck (z l = 3x7, e = 5x5)
  • Färbung
    • Es gibt 5 Farben C0, C1, C2, C3, C4
    • CXerfordert YBeiträge mit3X <= y < 3(X+1)
    • Buchstaben sollten zwischen C1und wechselnC2
    • Leerzeichen haben keine Farbe
    • Jede Buchstabengröße sollte genau 1 Spalte mit benachbarten Buchstaben überlappen
    • Wenn eine Zelle mehr als eine Farbe hat, verwenden Sie C3
  • Punktmatrix
    • Die Punktmatrix ist Githubs Beitragshistoriendiagramm
    • Wenn heute Montag, der 1. Mai 2017 ist:
 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    
  • Ausgabe
    • Flexibel, wie dies gegeben ist
    • (x, y) Paare
    • x ist ein Datum, das größer oder gleich dem aktuellen Datum ist
    • y ist die Anzahl der am Tag zu leistenden Beiträge, x
    • Sollte in chronologischer Reihenfolge sein (damit ich meinen Kalender ausfüllen kann)
    • Wenn für jedes Datum xdie angegebenen yBeiträge geleistet werden, sollte die Eingabemeldung im Github-Diagramm angezeigt werden (mit der richtigen Färbung).
    • Der erste Termin sollte so früh wie möglich sein
  • Wertung
    • Kürzeste Programm / Funktion in Bytes gewinnt

Alphabet

Erstellt von sylvan.black unter CC

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben


Testfälle

Nehmen Sie für diese Testfälle an, dass das aktuelle Datum der 25. Mai 2017 ist.

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

Wird C4 jemals benutzt?
FryAmTheEggman

@FryAmTheEggman Ist es nicht, aber ich habe es eingefügt, um Verwirrung zu vermeiden, da Github in der Legende 5 Farben anzeigt.
NonlinearFruit

Wie streng / locker sind Sie bei der Datumsausgabe?
Stephen

1
@StephenS Es ist flexibel, solange es Menschen lesbaren (zB ist May 20th, 2017: 3, (3,"20/5/17"))
NonlinearFruit

Wo haben Sie diese Beitragstabelle gefunden?
Erik der Outgolfer

Antworten:


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

Die Ausgabe ist ein Array von 2-Element-Arrays im Formular [dateString, contribs]. Das folgende Snippet zeigt, wie dies so formatiert werden kann, dass es besser lesbar ist.

Ungolfen

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

Wobei <...>die 364-Byte-Zeichenfolge darstellt, die ich erstellt habe, um die Punktmatrixform jedes Buchstabens zu codieren.

Erläuterung

Die codierte Zeichenfolge:

jn4x733nx8gjw6nhricv6nx8dpz2vilui81vikl7b4nhridnzvgc1svznx8dji8g16fkg0vgc6341vg38oe9vh669ofvgm1dvjnhricvyvikl7aonhrjrjxvikmm29m0rqqp2nqmi6o0vbnf6dav2t14e4vbnjqpqs0g34o3tlqqwdso43oixtg1uyt8vvgddxn2hizrn2ahizrmdbhj4suq4gtytq8wgshvtzyvgc4mq7gzhwhz4g15ymf4vg72q9snx7r2f4jmffjm7jm5gavjhizrn2mjmkh3wogsgmianjm5gavcgwxpc3mhvni2kijhgqujjj8mcsgsjhgslnihw2cx75iqyv1cuhwdrh5d

Alle 7 Zeichen sind eine Base-36-codierte Binärzahl, die die Zuordnung für das Zeichen an diesem Index enthält. Die binäre Form hat immer eine führende 1, um die führende zu erhalten0 s . Zum Beispiel kann ein Groß Tabbildet nqmi6o0, die Konvertiten 1100 00001000 00011111 11100000 01000000. Überspringen der führenden 1, jedes Bit ist ein Tag. Die meisten Zahlen haben 5 Spalten / Woche, also haben die Zahlen mit weniger als 5 Spalten ein oder zwei Sätze mit 7 nachgestellten Nullen, die später vor dem Parsen entfernt werden ( .replace(/(0{7})+$/,"")). Dadurch bleiben alle codierten Zeichenfolgen gleich lang, sodass keine Begrenzer erforderlich sind.

Es gibt wahrscheinlich noch weitere Möglichkeiten, dies zu verbessern, insbesondere wenn die Buchstabenzuordnungen weiter komprimiert werden. Teilen Sie Ihre Ideen mit.

Binäres Format der Buchstabenzuordnungen (JS-Syntax, vorangestellt mit 0b ) finden Sie hier .

Grundlegendes Snippet

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

Interaktives Beispiel

Mit der Bibliothek cal-heatmap habe ich eine interaktive Heatmap der ausgegebenen Daten erstellt. Dies wurde verwendet, um alles während der Arbeit zu testen, und es sieht einfach ordentlich aus.


1
Das interaktive Beispiel ist wirklich fantastisch. Gut gemacht!
NonlinearFruit

1
Oh Gott, jemand hat das tatsächlich getan! Nett!
Magic Octopus Urn

Danke Leute! Das war eine wirklich coole Herausforderung, ich wünschte, mehr Leute würden kommen und es versuchen. Ich habe meine Antwort so bearbeitet, dass sie die Punktmatrix-Buchstaben in Binärform enthält, damit andere dieselbe Idee verwenden können.
Justin Mariner

1
@JustinMariner Ich habe dies auf mein Profil geklickt, hoffe es macht dir nichts aus. Nette Antwort, froh, dass jemand diese Herausforderung abgeschlossen hat :)
Stephen

@StephenS Schön, dass es dir gefallen hat!
Justin Mariner
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.