Github Messenger

13

Objetivo: esse objetivo de obter uma sequência e gerar quantas contribuições devem ser feitas em quais dias para exibir uma mensagem.

insira a descrição da imagem aqui

Especificação

  • Entrada
    • Cartas de suporte mais espaço (por exemplo [A-Za-z ])
    • O espaço está em branco 3X7
    • As letras são definidas nesta fonte 5x7 DOT Matrix fornecida abaixo
    • O tamanho de cada letra é o retângulo delimitador mínimo (por exemplo l = 3x7, e = 5x5)
  • Coloração
    • Existem 5 cores C0, C1, C2, C3, C4
    • CXrequer Ycontribuições com3X <= y < 3(X+1)
    • As letras devem alternar entre C1eC2
    • Os espaços não têm cor
    • Cada tamanho de letra deve se sobrepor exatamente a 1 coluna com letras adjacentes
    • Se uma célula tiver mais de uma cor, use C3
  • Matriz de pontos
    • A matriz de pontos é o gráfico do histórico de contribuições do Github
    • Se hoje é segunda-feira, 1 de maio 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    
  • Resultado
    • Flexível sobre como isso é dado
    • (x, y) pares
    • x é uma data maior ou igual à data atual
    • y é o número de contribuições a serem feitas na data, x
    • Deve estar em ordem cronológica (para que eu possa preencher meu calendário)
    • Se, para cada data, forem feitas as contribuições xfornecidas y, a mensagem de entrada deverá aparecer no gráfico do Github (com a cor correta)
    • A primeira data deve ser o mais cedo possível
  • Pontuação
    • Menor programa / função em bytes ganha

Alfabeto

Criado por sylvan.black sob CC

insira a descrição da imagem aqui insira a descrição da imagem aqui


Casos de teste

Para esses casos de teste, suponha que a data atual seja 25 de maio 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
NonlinearFruit
fonte
O C4 é usado?
FryAmTheEggman
@FryAmTheEggman Não é, mas eu o incluí para evitar confusão, porque o Github exibe 5 cores na legenda.
NonlinearFruit
Quão rígido / flexível você está no formato de saída de data?
Stephen
1
@StephenS É flexível, como desde que seja legível por humanos (por exemplo May 20th, 2017: 3, (3,"20/5/17"))
NonlinearFruit
Onde você encontrou essa tabela de contribuições?
Erik the Outgolfer

Respostas:

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

Saída é uma matriz de matrizes de 2 itens no formulário [dateString, contribs]. O snippet abaixo mostra como isso pode ser formatado para ser mais legível.

Un-Golfed

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

Onde <...> representa a sequência de caracteres de 364 bytes que eu criei para codificar o formulário da matriz de pontos de cada letra.

Explicação

A cadeia codificada:

jn4x733nx8gjw6nhricv6nx8dpz2vilui81vikl7b4nhridnzvgc1svznx8dji8g16fkg0vgc6341vg38oe9vh669ofvgm1dvjnhricvyvikl7aonhrjrjxvikmm29m0rqqp2nqmi6o0vbnf6dav2t14e4vbnjqpqs0g34o3tlqqwdso43oixtg1uyt8vvgddxn2hizrn2ahizrmdbhj4suq4gtytq8wgshvtzyvgc4mq7gzhwhz4g15ymf4vg72q9snx7r2f4jmffjm7jm5gavjhizrn2mjmkh3wogsgmianjm5gavcgwxpc3mhvni2kijhgqujjj8mcsgsjhgslnihw2cx75iqyv1cuhwdrh5d

Cada 7 caracteres é um número binário codificado em base 36 que contém o mapeamento para o caractere nesse índice. A forma binária sempre tem uma liderança 1, a fim de preservar a liderança 0s. Por exemplo, uma maiúscula Tmapeia para nqmi6o0, que é convertida em 1100 00001000 00011111 11100000 01000000. Ignorando o 1 principal, cada bit é de um dia. A maioria dos números tem 5 colunas / semanas; portanto, os números com menos de 5 colunas têm um ou dois conjuntos de 7 zeros à direita que são removidos posteriormente antes da análise (.replace(/(0{7})+$/,"") ). Isso mantém todas as seqüências codificadas do mesmo comprimento, eliminando a necessidade de delimitadores.

Provavelmente ainda há mais maneiras de melhorar isso, especialmente com a compressão adicional dos mapeamentos de letras, portanto, sinta-se à vontade para compartilhar idéias.

O formato binário dos mapeamentos de letras (sintaxe JS, prefixada com 0b), pode ser encontrado aqui .

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

Exemplo interativo

Usando a biblioteca cal-heatmap , criei um mapa de calor interativo das datas que são produzidas. Isso foi usado para testar tudo enquanto trabalhava, e parece puro.

Justin Mariner
fonte
1
O exemplo interativo é realmente incrível. Bom trabalho!
NonlinearFruit
1
Oh Deus, alguém realmente fez isso! Agradável!
Magic Octopus Urn
Obrigado rapazes! Este foi um desafio muito legal, eu gostaria que mais pessoas viessem tentar. Editei minha resposta para incluir as letras da matriz de pontos no binário, para que outras pessoas possam usar a mesma idéia.
Justin Mariner
1
@JustinMariner Coloquei isso no meu perfil, espero que você não se importe. Resposta agradável, feliz que alguém concluída este desafio :)
Stephen
@StephenS Nice, feliz que você gostou!
Justin Mariner