Github Messenger

13

Sasaran: Sasaran ini untuk mengambil string dan menampilkan berapa banyak kontribusi yang harus dilakukan pada hari mana untuk menampilkan pesan.

masukkan deskripsi gambar di sini

Spesifikasi

  • Memasukkan
    • Surat dukungan plus spasi (yaitu [A-Za-z ])
    • Ruang kosong 3X7
    • Huruf-huruf didefinisikan dalam font DOT Matriks 5x7 yang disediakan di bawah ini
    • Ukuran setiap huruf adalah persegi panjang pembatas minimum (misalnya l = 3x7, e = 5x5)
  • Warna
    • Ada 5 warna C0, C1, C2, C3, C4
    • CXmembutuhkan Ykontribusi dengan3X <= y < 3(X+1)
    • Surat harus bergantian antara C1danC2
    • Spasi tidak memiliki warna
    • Setiap ukuran huruf harus tumpang tindih persis 1 kolom dengan huruf yang berdekatan
    • Jika sel memiliki lebih dari 1 warna maka gunakan C3
  • Dot Matrix
    • Matriks titik adalah grafik riwayat kontribusi Github
    • Jika hari ini Senin, 1 Mei 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    
  • Keluaran
    • Fleksibel tentang cara pemberian ini
    • (x, y) berpasangan
    • x adalah tanggal yang lebih besar dari atau sama dengan tanggal saat ini
    • y adalah jumlah kontribusi yang harus dilakukan pada tanggal tersebut, x
    • Harus dalam urutan kronologis (agar saya dapat mengisi kalender saya)
    • Jika untuk setiap tanggal,, kontribusi yang xdiberikan ydibuat, pesan input harus muncul pada grafik Github (dengan pewarnaan yang benar)
    • Tanggal pertama harus sedini mungkin
  • Mencetak gol
    • Program / fungsi terpendek dalam byte menang

Alfabet

Dibuat oleh sylvan.black di bawah CC

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini


Uji Kasus

Untuk kasus uji ini, anggap tanggal saat ini adalah 25 Mei 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
Buah Nonlinier
sumber
Apakah C4 pernah digunakan?
FryAmTheEggman
@FryAmTheEggman Tidak, tapi saya memasukkannya untuk menghindari kebingungan karena Github menampilkan 5 warna dalam legenda.
NonlinearFruit
Seberapa ketat / longgar Anda pada format output tanggal?
Stephen
1
@StephenS Fleksibel, asalkan dapat dibaca manusia (mis May 20th, 2017: 3. (3,"20/5/17"))
NonlinearFruit
Di mana Anda menemukan tabel kontribusi itu?
Erik the Outgolfer

Jawaban:

11

JavaScript (ES6), 743 byte

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

Output adalah array array 2-item dalam formulir [dateString, contribs]. Cuplikan di bawah ini menunjukkan bagaimana hal itu dapat diformat agar lebih mudah dibaca.

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

Di mana <...>mewakili string karakter 364-byte yang saya buat untuk menyandikan bentuk dot matrix setiap huruf.

Penjelasan

String yang disandikan:

jn4x733nx8gjw6nhricv6nx8dpz2vilui81vikl7b4nhridnzvgc1svznx8dji8g16fkg0vgc6341vg38oe9vh669ofvgm1dvjnhricvyvikl7aonhrjrjxvikmm29m0rqqp2nqmi6o0vbnf6dav2t14e4vbnjqpqs0g34o3tlqqwdso43oixtg1uyt8vvgddxn2hizrn2ahizrmdbhj4suq4gtytq8wgshvtzyvgc4mq7gzhwhz4g15ymf4vg72q9snx7r2f4jmffjm7jm5gavjhizrn2mjmkh3wogsgmianjm5gavcgwxpc3mhvni2kijhgqujjj8mcsgsjhgslnihw2cx75iqyv1cuhwdrh5d

Setiap 7 karakter adalah angka biner yang dienkode base-36 yang berisi pemetaan untuk karakter pada indeks itu. Bentuk biner selalu memiliki yang terdepan 1untuk menjaga yang terdepan 0. Misalnya, huruf besar Tmemetakan nqmi6o0, yang dikonversi menjadi 1100 00001000 00011111 11100000 01000000. Melewati 1 yang terkemuka, setiap bit adalah satu hari. Sebagian besar angka memiliki 5 kolom / minggu, sehingga angka dengan kurang dari 5 kolom memiliki satu atau dua set 7 trailing nol yang kemudian dihapus sebelum parsing ( .replace(/(0{7})+$/,"")). Ini menjaga agar semua string yang disandikan memiliki panjang yang sama, menghilangkan kebutuhan akan pembatas.

Mungkin masih ada lebih banyak cara untuk memperbaiki hal ini, terutama dengan mengompres pemetaan surat lebih lanjut, jadi jangan ragu untuk berbagi ide.

Format biner dari pemetaan huruf (sintaks JS, diawali dengan 0b), dapat ditemukan di sini .

Cuplikan Dasar

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

Contoh interaktif

Menggunakan perpustakaan cal-heatmap , saya membuat peta panas interaktif dari tanggal yang dihasilkan. Ini digunakan untuk menguji semuanya saat bekerja, dan itu hanya terlihat rapi.

Justin Mariner
sumber
1
Contoh interaktifnya benar-benar luar biasa. Pekerjaan yang baik!
NonlinearFruit
1
Ya Tuhan, seseorang benar-benar melakukan ini! Bagus!
Magic Gurita Guci
Terima kasih teman-teman! Ini adalah tantangan yang sangat keren, saya berharap lebih banyak orang akan datang mencobanya. Saya telah mengedit jawaban saya untuk memasukkan huruf dot matrix dalam biner sehingga orang lain dapat menggunakan ide yang sama.
Justin Mariner
1
@JustinMariner Saya memasukkan ini ke profil saya, harap Anda tidak keberatan. Jawaban yang bagus, senang seseorang menyelesaikan tantangan ini :)
Stephen
@StephenS Bagus, senang Anda menyukainya!
Justin Mariner