Github Messenger


13

Amaç: Bu hedef bir dize almak ve bir mesajı görüntülemek için hangi günlerde kaç katkı yapılması gerektiğini ortaya koymak.

resim açıklamasını buraya girin

Şartname

  • Giriş
    • Destek mektupları artı boşluk (yani [A-Za-z ])
    • Uzay boş 3X7
    • Harfler aşağıda verilen bu 5x7 DOT Matrix yazı tipinde tanımlanmıştır
    • Her harfin boyutu minimum sınırlayıcı dikdörtgendir (ör l = 3x7. e = 5x5)
  • Boyama
    • 5 renk var C0, C1, C2, C3, C4
    • CXYile katkı gerektirir3X <= y < 3(X+1)
    • Harfler C1ve arasında değişmeliC2
    • Alanların rengi yok
    • Her harf boyutu bitişik harflerle tam olarak 1 sütunun üzerine gelmelidir
    • Bir hücrenin 1'den fazla rengi varsa C3
  • Nokta Vuruşlu
    • Dot matrix Github'un katkı geçmişi grafiği
    • Bugün 1 Mayıs 2017 Pazartesi ise:
 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    
  • Çıktı
    • Bunun nasıl verildiğine dair esnek
    • (x, y) çiftleri
    • x geçerli tarihten büyük veya ona eşit bir tarih
    • y o tarihte yapılacak katkıların sayısı, x
    • Kronolojik sırada olmalıdır (böylece takvimimi doldurabilirim)
    • Her tarih için, xverilen ykatkılar yapılırsa, giriş mesajı Github grafiğinde görünmelidir (doğru renklendirme ile)
    • Mümkün olan en erken ilk tarih
  • puanlama
    • Bayt cinsinden en kısa program / fonksiyon kazanır

Alfabe

Sylvan.black under CC tarafından oluşturulmuş

resim açıklamasını buraya girin resim açıklamasını buraya girin


Test Durumları

Bu test senaryoları için, geçerli tarihin 25 Mayıs 2017 olduğunu varsayalım.

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

C4 hiç kullanılmış mı?
FryAmTheEggman

@FryAmTheEggman Değil, ama karışıklığı önlemek için dahil ettim çünkü Github efsanede 5 renk gösteriyor.
Doğrusal Olmayan

Tarih çıktısı biçiminde ne kadar katı / gevşeksiniz?
Stephen

1
@StephenS İnsan tarafından okunabilir olduğu sürece esnektir (örn May 20th, 2017: 3. (3,"20/5/17"))
NonlinearFruit

Bu katkı tablosunu nerede buldunuz?
Outgolfer Erik

Yanıtlar:


11

JavaScript (ES6), 743 bayt

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

Çıktı, formdaki 2 öğeli dizilerden oluşan bir dizidir [dateString, contribs]. Aşağıdaki snippet, bunun nasıl daha okunabilir olacak şekilde biçimlendirilebileceğini gösterir.

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

Burada <...>, her harfin nokta vuruşlu formunu kodlamak için oluşturduğum 364 baytlık karakter dizisini temsil eder.

açıklama

Kodlanmış dize:

jn4x733nx8gjw6nhricv6nx8dpz2vilui81vikl7b4nhridnzvgc1svznx8dji8g16fkg0vgc6341vg38oe9vh669ofvgm1dvjnhricvyvikl7aonhrjrjxvikmm29m0rqqp2nqmi6o0vbnf6dav2t14e4vbnjqpqs0g34o3tlqqwdso43oixtg1uyt8vvgddxn2hizrn2ahizrmdbhj4suq4gtytq8wgshvtzyvgc4mq7gzhwhz4g15ymf4vg72q9snx7r2f4jmffjm7jm5gavjhizrn2mjmkh3wogsgmianjm5gavcgwxpc3mhvni2kijhgqujjj8mcsgsjhgslnihw2cx75iqyv1cuhwdrh5d

Her 7 karakter, o dizindeki karakterin eşlemesini içeren, temel 36 kodlu bir ikili sayıdır. İkili form 1, öncüleri korumak için her zaman bir öncüye sahiptir 0. Örneğin, büyük harfle Teşleşir ve nqmi6o0bu da şuna dönüşür 1100 00001000 00011111 11100000 01000000. Baştaki 1'i atlamak, her bit bir gündür. Çoğu sayının haftada 5 sütunu vardır, bu nedenle 5 sütundan daha az olan sayılar, ayrıştırmadan önce ( .replace(/(0{7})+$/,"")) ayrılmadan önce kaldırılan bir veya iki 7 takip eden sıfır kümesine sahiptir . Bu, tüm kodlanmış dizeleri aynı uzunlukta tutar ve sınırlayıcı ihtiyacını ortadan kaldırır.

Muhtemelen bunu geliştirmenin daha fazla yolu var, özellikle de harf eşlemelerini daha da sıkıştırmak, bu yüzden herhangi bir fikri paylaşmaktan çekinmeyin.

Harf eşlemelerinin ikili biçimi (ön ekli JS sözdizimi 0b) burada bulunabilir .

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

Etkileşimli örnek

Cal-heatmap kütüphanesini kullanarak çıktı tarihlerinin etkileşimli bir ısı haritası oluşturdum. Bu, çalışırken her şeyi test etmek için kullanıldı ve sadece düzgün görünüyor.


1
Etkileşimli örnek gerçekten harika. İyi iş!
NonlinearFruit

1
Tanrım, birisi bunu yaptı! Güzel!
Sihirli Ahtapot Urn

Teşekkürler beyler! Bu gerçekten harika bir meydan okumaydı, keşke daha fazla insanın bunu denemesini isterdim. Cevabımı, nokta matris harflerini ikili dosyaya dahil edecek şekilde düzenledim, böylece diğerleri aynı fikri kullanabilir.
Justin Mariner

1
@JustinMariner Bunu profilime attım, umursamıyorsun. Güzel cevap, birisi bu zorluğu tamamladı sevindim :)
Stephen

@StephenS Güzel, beğendiğine sevindim!
Justin Mariner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.