Skip to content

Commit

Permalink
add winners list
Browse files Browse the repository at this point in the history
  • Loading branch information
EthanThatOneKid committed Nov 5, 2023
1 parent cf04a00 commit bb1781a
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 59 deletions.
87 changes: 39 additions & 48 deletions src/lib/public/lc-dailies/onovember.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { Season, Player } from 'lc-dailies';
import type { Season } from 'lc-dailies';

const SEASON_DURATION = 7 * 24 * 60 * 60 * 1_000; // 1 week.
const ONOVEMBER_MONTH = 10; // November.
Expand All @@ -8,30 +8,33 @@ const ONOVEMBER_MONTH = 10; // November.
*/
export function onovember(data: Season[]) {
const seasonsMap = categorizeByMonth(data, ONOVEMBER_MONTH);
const onovembers: Record<
const onovembersMap: Record<
string, // Year.
{
totalSubmissions: number;
scores: {
players: Record<string, { submissionCount: number; username: string }>;
dailies: Record<
string, // Day of month.
{ questionTitle: string; questionURL: string; playerIDs: Record<string, number> }
>;
calendar: {
dayOfMonth: string;
submissionCount: number;
}[];
winners: {
username: string;
submissionCount: number;
// TODO: Add total player score.
}[];
dailies: Record<
string, // Day of month.
{
questionTitle: string;
questionURL: string;
playerIDs: Record<string, number>;
}
>;
}
> = {};
for (const year in seasonsMap) {
onovembers[year] = {
onovembersMap[year] = {
totalSubmissions: 0,
scores: [],
calendar: [],
winners: [],
dailies: {},
players: {},
};
const seasons = seasonsMap[year];
for (const season of seasons) {
Expand All @@ -42,8 +45,8 @@ export function onovember(data: Season[]) {
continue;
}

const dayOfMonth = (questionDate.getUTCDate() + 1).toString();
onovembers[year].dailies[dayOfMonth] = {
const dayOfMonth = questionDate.getUTCDate().toString();
onovembersMap[year].dailies[dayOfMonth] = {
questionTitle: question.title,
questionURL: question.url,
playerIDs: {},
Expand All @@ -61,48 +64,36 @@ export function onovember(data: Season[]) {
continue;
}

onovembers[year].dailies[dayOfMonth].playerIDs[playerID] = 0;
onovembers[year].totalSubmissions++;
onovembersMap[year].dailies[dayOfMonth].playerIDs[playerID] = 0;
onovembersMap[year].totalSubmissions++;
if (!onovembersMap[year].players[playerID]) {
onovembersMap[year].players[playerID] = {
username: season.players[playerID].lc_username,
submissionCount: 0,
};
}

onovembersMap[year].players[playerID].submissionCount++;
}
}
}

onovembers[year].scores = Object.values(season.players)
.map((player) => {
const { submissionCount } = analyzePlayer(player, season, ONOVEMBER_MONTH);
return { username: player.lc_username, submissionCount };
})
.sort((a, b) => a.submissionCount - b.submissionCount);
}
}

return onovembers;
}
onovembersMap[year].winners = Object.entries(onovembersMap[year].players)
.sort(({ 1: a }, { 1: b }) => b.submissionCount - a.submissionCount)
.map(({ 1: player }) => player);

/**
* analyzePlayer analyzes a player's submissions and returns the total score and submission count.
*/
function analyzePlayer(
player: Player,
season: Season,
month?: number
): { submissionCount: number } {
let submissionCount = 0;
for (const questionID in season.submissions[player.discord_user_id]) {
const question = season.questions[questionID];
if (month && new Date(`${question.date} GMT`).getUTCMonth() !== month) {
continue;
}

const submission = season.submissions[player.discord_user_id][questionID];
if (!submission) {
continue;
for (let i = 1; i <= 30; i++) {
const dayOfMonth = i.toString();
const playerIDs = onovembersMap[year].dailies[dayOfMonth]?.playerIDs;
onovembersMap[year].calendar.push({
dayOfMonth,
submissionCount: playerIDs ? Object.keys(playerIDs).length : 0,
});
}

submissionCount++;
}

return { submissionCount };
return onovembersMap;
}

/**
Expand Down
44 changes: 33 additions & 11 deletions src/routes/(site)/onovember/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -27,24 +27,46 @@
</h1>

{#each Object.entries(data.onovembers) as [year, onovember] (year)}
<h2 id={year}><a href="/onovember#{year}">{year}</a></h2>
<h2 id={year}>
<a href="/onovember#{year}">{year}: {onovember.totalSubmissions} total submissions</a>
</h2>

<ol>
{#each onovember.winners as { username, submissionCount } (name)}
<li>
<a href={`https://leetcode.com/${username}`} title={username}>{username}</a>:
<code>{submissionCount}</code> submissions
</li>
{/each}
</ol>

<div class="onovember-section">
{#each Array.from({ length: 30 }).map((_, i) => i + 1) as i (i)}
{@const { daily, submissionCount } = {
daily: onovember.dailies[(i + 1).toString()],
submissionCount: Object.values(onovember.dailies[(i + 1).toString()]?.playerIDs ?? {})
.length,
{#each onovember.calendar as { dayOfMonth, submissionCount }, i (i)}
{@const { question, playerIDs } = {
question: onovember.dailies[dayOfMonth],
playerIDs: Object.keys(onovember.dailies[dayOfMonth]?.playerIDs || {}),
}}
{#if daily}
{#if question}
<div class="onovember-cell" style:--submission-count={submissionCount}>
<a href={daily.questionURL} title={daily.questionTitle}>Nov {i}<br /></a><code
>{submissionCount}</code
> submissions
<a
href={question.questionURL}
title={`${question.questionTitle} answered by ${playerIDs.length}${
playerIDs.length > 0
? `, ${playerIDs
.sort(
(a, b) =>
onovember.players[b].submissionCount -
onovember.players[a].submissionCount
)
.map((id) => onovember.players[id].username)
.join(', ')}`
: ''
}`}>Nov {dayOfMonth}<br /></a
><code>{submissionCount}</code> submissions
</div>
{:else}
<div class="onovember-cell" style:--submission-count="0">
Nov {i}<br /><code>0</code> submissions
Nov {dayOfMonth}<br /><code>0</code> submissions
</div>
{/if}
{/each}
Expand Down

0 comments on commit bb1781a

Please sign in to comment.