Githubメッセンジャー


13

目標:この目標は、文字列を取得し、メッセージを表示するために何日に貢献する必要があるかを出力します。

ここに画像の説明を入力してください

仕様

  • 入力
    • サポート文字とスペース(すなわち[A-Za-z ]
    • スペースは空白です 3X7
    • 文字は、以下で提供されるこの5x7 DOTマトリックスフォントで定義されています
    • 各文字のサイズが最小の境界長方形である(例えばl = 3x7e = 5x5
  • 着色
    • 5色あります C0, C1, C2, C3, C4
    • CXとのY貢献が必要3X <= y < 3(X+1)
    • 文字はC1C2
    • スペースには色がありません
    • 各文字サイズは、隣接する文字と正確に1列重複する必要があります
    • セルに複数の色がある場合は、使用します C3
  • ドットマトリックス
    • ドットマトリックスはGithubの貢献履歴グラフです
    • 今日が2017年5月1日月曜日の場合:
 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グラフに表示されるはずです(正しい色付けで)
    • 最初の日付はできるだけ早く
  • 得点
    • バイト単位の最短プログラム/機能が優先されます

アルファベット

CCの下でsylvan.blackによって作成されました

ここに画像の説明を入力してください ここに画像の説明を入力してください


テストケース

これらのテストケースでは、現在の日付が2017年5月25日であると仮定します。

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は使用されていますか?
-FryAmTheEggman

@FryAmTheEggmanそうではありませんが、Githubが凡例に5色を表示するため、混乱を避けるために含めました。
NonlinearFruit

日付の出力形式はどの程度厳密ですか?
スティーブン

1
それは限り、それがあるとして、人間が読める(例えば柔軟である@StephenS May 20th, 2017: 3(3,"20/5/17")
NonlinearFruit

その貢献度表はどこで見つけましたか?
エリックアウトゴルファー

回答:


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進数でエンコードされた2進数です。バイナリ形式には、先頭の1を保持するために常に先頭0があります。たとえば、大文字はにTマッピングされnqmi6o0、に変換され1100 00001000 00011111 11100000 01000000ます。先頭の1をスキップすると、各ビットは1日です。ほとんどの数値には5列/週があるため、5列未満の数値には、解析する前に後で削除される7つの後続ゼロが1つまたは2つあります(.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
インタラクティブな例は本当に素晴らしいです。良くやった!
NonlinearFruit

1
ああ、誰かが実際にこれをやった!いいね!
魔法のタコUr

みんなありがとう!これは本当にクールな挑戦でした。もっと多くの人がやってみたいと思います。回答を編集して、他の人が同じアイデアを使用できるように、ドットマトリックス文字をバイナリで含めるようにしました。
ジャスティンマリナー

1
@JustinMarinerこれを自分のプロファイルに追加しました。気にしないでください。いい答えです。誰かがこのチャレンジを完了してくれてうれしいです:)
スティーブン

@StephenSニース、気に入ってくれて嬉しい!
ジャスティンマリナー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.