Github Messenger


13

Мета: Ця мета - взяти рядок і вивести, скільки внесків слід внести за які дні, щоб відобразити повідомлення.

введіть тут опис зображення

Специфікація

  • Вхідні дані
    • Літери підтримки плюс пробіл (тобто [A-Za-z ])
    • Простір - це порожнє місце 3X7
    • Букви визначені в цьому шрифті матриці 5x7 DOT, представленому нижче
    • Розмір кожної літери - мінімальний обмежуючий прямокутник (наприклад l = 3x7, e = 5x5)
  • Забарвлення
    • Є 5 кольорів C0, C1, C2, C3, C4
    • CXвимагає Yвнесків с3X <= y < 3(X+1)
    • Букви повинні чергуватися між C1таC2
    • Проміжки не мають кольору
    • Кожен розмір літери повинен перекривати рівно 1 стовпчик із суміжними літерами
    • Якщо клітинка має більше одного кольору, тоді використовуйте C3
  • Матрична точка
    • Матриця точок - це графік історії внеску Гітбуба
    • Якщо сьогодні понеділок, 1 травня 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    
  • Вихідні дані
    • Гнучкість того, як це робиться
    • (x, y) пари
    • x - дата, більша або рівна поточній даті
    • y - кількість внесків, які потрібно внести на дату, x
    • Має бути в хронологічному порядку (щоб я міг заповнити свій календар)
    • Якщо для кожної дати зроблено xвказані yвнески, вхідне повідомлення повинно з’являтися на графіку Github (з правильним забарвленням)
    • Перше побачення має бути якомога раніше
  • Оцінка балів
    • Найкоротша програма / функція в байтах виграє

Алфавіт

Створено sylvan.black під CC

введіть тут опис зображення введіть тут опис зображення


Випробування

Припустимо, що для цих тестових випадків поточна дата - 25 травня 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

Чи використовується С4 коли-небудь?
FryAmTheEggman

@FryAmTheEggman Це не так, але я включив це, щоб уникнути плутанини, оскільки Github відображає 5 кольорів в легенді.
нелінійний

Наскільки суворі / вільні ви у форматі виведення дати?
Стівен

1
@StephenS Це гнучко, якщо воно читається людиною (наприклад May 20th, 2017: 3, (3,"20/5/17"))
нелінійний

Де ви знайшли цю таблицю внесків?
Ерік Аутгольфер

Відповіді:


11

JavaScript (ES6), 743 байт

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

Вихід - це масив 2-елементних масивів у формі [dateString, contribs]. У наведеному нижче фрагменті показано, як це можна відформатувати, щоб його можна було прочитати більше.

Без гольфу

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

Де <...>представляє 364-байтовий рядок символів, який я створив для кодування матричної форми кожної літери.

Пояснення

Кодована рядок:

jn4x733nx8gjw6nhricv6nx8dpz2vilui81vikl7b4nhridnzvgc1svznx8dji8g16fkg0vgc6341vg38oe9vh669ofvgm1dvjnhricvyvikl7aonhrjrjxvikmm29m0rqqp2nqmi6o0vbnf6dav2t14e4vbnjqpqs0g34o3tlqqwdso43oixtg1uyt8vvgddxn2hizrn2ahizrmdbhj4suq4gtytq8wgshvtzyvgc4mq7gzhwhz4g15ymf4vg72q9snx7r2f4jmffjm7jm5gavjhizrn2mjmkh3wogsgmianjm5gavcgwxpc3mhvni2kijhgqujjj8mcsgsjhgslnihw2cx75iqyv1cuhwdrh5d

Кожні 7 символів є кодованим бінарним двійковим номером 36, яке містить відображення символу в цьому індексі. Бінарна форма завжди має провідне 1для збереження провідних 0s. Наприклад, великі регістри Tвідображаються у великі регістри nqmi6o0, в які перетворюються 1100 00001000 00011111 11100000 01000000. Пропускаючи ведучу 1, кожен біт - це один день. Більшість чисел мають 5 стовпців / тижнів, тому числа з менш ніж 5 стовпцями мають один або два набори з 7 кінцевих нулів, які пізніше видаляються перед розбором ( .replace(/(0{7})+$/,"")). Це зберігає всі кодовані рядки однакової довжини, усуваючи потребу в роздільниках.

Напевно, існує ще більше способів покращити це, особливо з подальшим стисканням відображень листів, тому не соромтеся поділитися будь-якими ідеями.

Бінарний формат відображення букв (синтаксис JS з префіксом 0b) можна знайти тут .

Основний знімок

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

Інтерактивний приклад

Використовуючи бібліотеку cal-heatmap , я створив інтерактивну теплову карту вихідних дат. Це було використано для тестування всього під час роботи, і це виглядає просто акуратно.


1
Інтерактивний приклад справді приголомшливий. Хороша робота!
нелінійний

1
О боже, хтось насправді це зробив! Приємно!
Чарівний восьминога Урна

Дякую, хлопці! Це було дійсно крутим викликом, я б хотів, щоб більше людей прийшло спробувати. Я відредагував свою відповідь, щоб включити матричні букви у двійковій формі, щоб інші могли використовувати ту саму ідею.
Джастін Марінер

1
@JustinMariner Я вискачив це на свій профіль, сподіваюся, ви не заперечуєте. Приємна відповідь, радий, що хтось виконав цей виклик :)
Стівен

@StephenS Приємно, радий, що тобі сподобалось!
Джастін Марінер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.