Github Messenger

13

Objectif: cet objectif consiste à prendre une chaîne et à afficher le nombre de contributions à effectuer les jours afin d'afficher un message.

entrez la description de l'image ici

spécification

  • Contribution
    • Lettres d'appui plus espace (c.-à-d. [A-Za-z ] )
    • L'espace est un blanc 3X7
    • Les lettres sont définies dans cette matrice DOT 5x7 police de fournie ci-dessous
    • La taille de chaque lettre est le rectangle de délimitation minimal (par exemple l = 3x7,e = 5x5 )
  • Coloration
    • Il y a 5 couleurs C0, C1, C2, C3, C4
    • CX a besoin Y contributions avec3X <= y < 3(X+1)
    • Les lettres doivent alterner entre C1 etC2
    • Les espaces n'ont pas de couleur
    • Chaque taille de lettre doit chevaucher exactement 1 colonne avec des lettres adjacentes
    • Si une cellule a plus d'une couleur, utilisez C3
  • Matrice de points
    • La matrice de points est le graphique de l'historique des contributions de Github
    • Si aujourd'hui est le lundi 1er mai 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    
  • Production
    • Flexible sur la façon dont cela est donné
    • (x, y) paires
    • x est une date supérieure ou égale à la date actuelle
    • y est le nombre de contributions à effectuer à la date, x
    • Doit être dans l'ordre chronologique (afin que je puisse remplir mon calendrier)
    • Si pour chaque date, xles ycontributions données sont faites, le message d'entrée doit apparaître sur le graphique Github (avec une coloration correcte)
    • La première date doit être la plus proche possible
  • Notation
    • Le programme / fonction le plus court en octets gagne

Alphabet

Créé par sylvan.black sous CC

entrez la description de l'image ici entrez la description de l'image ici


Cas de test

Pour ces cas de test, supposons que la date actuelle est le 25 mai 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
Non linéaire
la source
Le C4 est-il déjà utilisé?
FryAmTheEggman
@FryAmTheEggman Ce n'est pas le cas, mais je l'ai inclus pour éviter toute confusion car Github affiche 5 couleurs dans la légende.
NonlinearFruit
Dans quelle mesure êtes-vous strict / lâche sur le format de sortie de date?
Stephen
1
@StephenS Il est flexible, tant qu'il est lisible par l'homme (par exemple May 20th, 2017: 3, (3,"20/5/17"))
NonlinearFruit
Où avez-vous trouvé ce tableau des contributions?
Erik the Outgolfer

Réponses:

11

JavaScript (ES6), 743 octets

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

La sortie est un tableau de tableaux à 2 éléments dans le formulaire [dateString, contribs]. L'extrait ci-dessous montre comment cela peut être formaté pour être plus lisible.

Non-golfé

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

<...> représente la chaîne de caractères de 364 octets que j'ai créée pour coder la forme matricielle de chaque lettre.

Explication

La chaîne encodée:

jn4x733nx8gjw6nhricv6nx8dpz2vilui81vikl7b4nhridnzvgc1svznx8dji8g16fkg0vgc6341vg38oe9vh669ofvgm1dvjnhricvyvikl7aonhrjrjxvikmm29m0rqqp2nqmi6o0vbnf6dav2t14e4vbnjqpqs0g34o3tlqqwdso43oixtg1uyt8vvgddxn2hizrn2ahizrmdbhj4suq4gtytq8wgshvtzyvgc4mq7gzhwhz4g15ymf4vg72q9snx7r2f4jmffjm7jm5gavjhizrn2mjmkh3wogsgmianjm5gavcgwxpc3mhvni2kijhgqujjj8mcsgsjhgslnihw2cx75iqyv1cuhwdrh5d

Chaque 7 caractères est un nombre binaire codé en base 36 qui contient le mappage du caractère à cet index. La forme binaire a toujours un début 1afin de conserver le premier 0. Par exemple, une majuscule est Tmappée vers nqmi6o0, qui est convertie en 1100 00001000 00011111 11100000 01000000. En sautant le premier 1, chaque bit est un jour. La plupart des nombres ont 5 colonnes / semaines, donc les nombres avec moins de 5 colonnes ont un ou deux ensembles de 7 zéros de fin qui sont ensuite supprimés avant l'analyse ( .replace(/(0{7})+$/,"")). Cela conserve toutes les chaînes codées à la même longueur, supprimant le besoin de délimiteurs.

Il y a probablement encore plus de façons d'améliorer cela, en particulier en compressant davantage les mappages de lettres, alors n'hésitez pas à partager vos idées.

Le format binaire des mappages de lettres (syntaxe JS, précédé de 0b), peut être trouvé ici .

Extrait de base

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

Exemple interactif

En utilisant la bibliothèque cal-heatmap , j'ai créé une heatmap interactive des dates qui sont sorties. Cela a été utilisé pour tout tester pendant le travail, et il semble tout simplement net.

Justin Mariner
la source
1
L'exemple interactif est vraiment génial. Bon travail!
NonlinearFruit
1
Oh mon dieu, quelqu'un a fait ça! Agréable!
Magic Octopus Urn
Merci les gars! C'était un défi vraiment cool, j'aurais aimé que plus de gens viennent le tenter. J'ai modifié ma réponse pour inclure les lettres matricielles en binaire afin que d'autres puissent utiliser la même idée.
Justin Mariner
1
@JustinMariner J'ai ajouté ceci sur mon profil, j'espère que cela ne vous dérange pas. Belle réponse, content que quelqu'un ait relevé ce défi :)
Stephen
@StephenS Nice, content que vous ayez aimé!
Justin Mariner