Github Messenger

13

Objetivo: este objetivo es tomar una cadena y generar cuántas contribuciones se deben hacer en qué días para mostrar un mensaje.

ingrese la descripción de la imagen aquí

Especificación

  • Entrada
    • Letras de apoyo más espacio (es decir [A-Za-z ])
    • El espacio es un espacio en blanco 3X7
    • Las letras se definen en esta fuente DOT Matrix 5x7 que se proporciona a continuación
    • El tamaño de cada letra es el rectángulo límite mínimo (por ejemplo l = 3x7, e = 5x5)
  • Colorante
    • Hay 5 colores C0, C1, C2, C3, C4
    • CXrequiere Ycontribuciones con3X <= y < 3(X+1)
    • Las letras deben alternar entre C1yC2
    • Los espacios no tienen color
    • Cada tamaño de letra debe superponerse exactamente 1 columna con letras adyacentes
    • Si una celda tiene más de 1 color, use C3
  • Matriz de puntos
    • La matriz de puntos es el gráfico del historial de contribuciones de Github
    • Si hoy es lunes 1 de mayo de 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    
  • Salida
    • Flexible sobre cómo se da esto
    • (x, y) pares
    • x es una fecha mayor o igual a la fecha actual
    • y es el número de contribuciones que se realizarán en la fecha, x
    • Debe estar en orden cronológico (para que pueda completar mi calendario)
    • Si para cada fecha, se realizan las contribuciones xdadas y, el mensaje de entrada debe aparecer en el gráfico de Github (con el color correcto)
    • La primera fecha debe ser lo antes posible
  • Puntuación
    • El programa / función más corto en bytes gana

Alfabeto

Creado por sylvan.black bajo CC

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí


Casos de prueba

Para estos casos de prueba, suponga que la fecha actual es el 25 de mayo de 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
Fruta no lineal
fuente
¿Se usa alguna vez C4?
FryAmTheEggman
@FryAmTheEggman No lo es, pero lo incluí para evitar confusiones porque Github muestra 5 colores en la leyenda.
NonlinearFruit
¿Cuán estricto / suelto es el formato de salida de fecha?
Stephen
1
@StephenS Es flexible, siempre y cuando sea legible por humanos (por ejemplo May 20th, 2017: 3, (3,"20/5/17"))
NonlinearFruit
¿Dónde encontraste esa tabla de contribuciones?
Erik the Outgolfer

Respuestas:

11

JavaScript (ES6), 743 bytes

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 salida es una matriz de matrices de 2 elementos en el formulario [dateString, contribs]. El fragmento a continuación muestra cómo se puede formatear para que sea más legible.

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

Donde <...>representa la cadena de caracteres de 364 bytes que creé para codificar la forma de matriz de puntos de cada letra.

Explicación

La cadena codificada:

jn4x733nx8gjw6nhricv6nx8dpz2vilui81vikl7b4nhridnzvgc1svznx8dji8g16fkg0vgc6341vg38oe9vh669ofvgm1dvjnhricvyvikl7aonhrjrjxvikmm29m0rqqp2nqmi6o0vbnf6dav2t14e4vbnjqpqs0g34o3tlqqwdso43oixtg1uyt8vvgddxn2hizrn2ahizrmdbhj4suq4gtytq8wgshvtzyvgc4mq7gzhwhz4g15ymf4vg72q9snx7r2f4jmffjm7jm5gavjhizrn2mjmkh3wogsgmianjm5gavcgwxpc3mhvni2kijhgqujjj8mcsgsjhgslnihw2cx75iqyv1cuhwdrh5d

Cada 7 caracteres es un número binario codificado en base 36 que contiene la asignación para el carácter en ese índice. La forma binaria siempre tiene un encabezado 1para preservar el 0s principal . Por ejemplo, una mayúscula se Tasigna a nqmi6o0, que se convierte a 1100 00001000 00011111 11100000 01000000. Saltando el primer 1, cada bit es un día. La mayoría de los números tienen 5 columnas / semanas, por lo que los números con menos de 5 columnas tienen uno o dos conjuntos de 7 ceros finales que luego se eliminan antes de analizar ( .replace(/(0{7})+$/,"")). Esto mantiene todas las cadenas codificadas de la misma longitud, eliminando la necesidad de delimitadores.

Probablemente todavía haya más formas de mejorar esto, especialmente al comprimir aún más las asignaciones de letras, así que siéntase libre de compartir cualquier idea.

El formato binario de las asignaciones de letras (sintaxis JS, con el prefijo 0b), se puede encontrar aquí .

Fragmento Básico

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

Ejemplo interactivo

Usando la biblioteca cal-heatmap , creé un mapa de calor interactivo de las fechas de salida. Esto se usó para probar todo mientras trabajaba, y se ve simplemente ordenado.

Justin Mariner
fuente
1
El ejemplo interactivo es realmente asombroso. ¡Buen trabajo!
NonlinearFruit
1
¡Oh Dios, alguien realmente hizo esto! ¡Agradable!
Magic Octopus Urn
¡Gracias chicos! Este fue un desafío realmente genial, desearía que más personas vinieran a intentarlo. Edité mi respuesta para incluir las letras de matriz de puntos en binario para que otros puedan usar la misma idea.
Justin Mariner
1
@JustinMariner Puse esto en mi perfil, espero que no te importe. Buena respuesta, me alegro de que alguien haya completado este desafío :)
Stephen
@StephenS ¡Qué bueno que te haya gustado!
Justin Mariner