Skip to content

Commit

Permalink
fix O(N)ovember
Browse files Browse the repository at this point in the history
  • Loading branch information
EthanThatOneKid committed Nov 5, 2023
1 parent 254e150 commit 4aa624e
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 60 deletions.
53 changes: 45 additions & 8 deletions src/lib/public/lc-dailies/onovember.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,23 @@ export function onovember(data: Season[]) {
calendar: {
dayOfMonth: string;
submissionCount: number;
submissionsText?: string;
question?: { title: string; url: string };
}[];
winners: {
username: string;
usernames: string[];
submissionCount: number;
// TODO: Add total player score.
}[];
}
> = {};
for (const year in seasonsMap) {
onovembersMap[year] = {
totalSubmissions: 0,
calendar: [],
winners: [],
dailies: {},
players: {},
totalSubmissions: 0, // Total submissions are tallied after dailies are created.
dailies: {}, // Dailies are created first.
players: {}, // Players are tallied after dailies are created.
winners: [], // Winners are sorted after players are tallied.
calendar: [], // Calendar is created at the end.
};
const seasons = seasonsMap[year];
for (const season of seasons) {
Expand Down Expand Up @@ -81,14 +83,49 @@ export function onovember(data: Season[]) {

onovembersMap[year].winners = Object.entries(onovembersMap[year].players)
.sort(({ 1: a }, { 1: b }) => b.submissionCount - a.submissionCount)
.map(({ 1: player }) => player);
.reduce((groups, { 1: player }) => {
const group = groups[groups.length - 1];
if (!group || group.submissionCount !== player.submissionCount) {
groups.push({ usernames: [player.username], submissionCount: player.submissionCount });
} else {
group.usernames.push(player.username);
}

return groups;
}, [] as { usernames: string[]; submissionCount: number }[]);

for (let i = 1; i <= 30; i++) {
const dayOfMonth = i.toString();
const playerIDs = onovembersMap[year].dailies[dayOfMonth]?.playerIDs;
const daily = onovembersMap[year].dailies[dayOfMonth];
if (!daily) {
onovembersMap[year].calendar.push({
dayOfMonth,
submissionCount: 0,
});
continue;
}

const playerIDs = Object.keys(daily.playerIDs);
const submissionsText = `${daily.questionTitle} answered by ${playerIDs.length}${
playerIDs.length > 0
? `, ${playerIDs
.sort(
(a, b) =>
onovembersMap[year].players[b].submissionCount -
onovembersMap[year].players[a].submissionCount
)
.map((id) => onovembersMap[year].players[id].username)
.join(', ')}`
: ''
}`;
onovembersMap[year].calendar.push({
dayOfMonth,
submissionCount: playerIDs ? Object.keys(playerIDs).length : 0,
question: {
title: onovembersMap[year].dailies[dayOfMonth].questionTitle,
url: onovembersMap[year].dailies[dayOfMonth].questionURL,
},
submissionsText,
});
}
}
Expand Down
9 changes: 2 additions & 7 deletions src/routes/(site)/lc-dailies/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,9 @@
time they take to do so. These scores reset on a weekly basis.
</p>

<p>
Usage instructions: <a href="/lc-dailies-handbook">acmcsuf.com/lc-dailies-handbook</a>
</p>
<p>Usage instructions: <a href="/lc-dailies-handbook">acmcsuf.com/lc-dailies-handbook</a></p>

<p>
See our daily O(N)ovember challenge: <a href="/onovember">acmcsuf.com/onovember</a>
</p>
<p>See our daily O(N)ovember challenge: <a href="/onovember">acmcsuf.com/onovember</a></p>

<h2>Seasons</h2>

Expand Down Expand Up @@ -67,7 +63,6 @@
p {
margin: 10px 0;
text-indent: 1em;
}
ol {
Expand Down
90 changes: 45 additions & 45 deletions src/routes/(site)/onovember/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -27,50 +27,46 @@
</h1>

{#each Object.entries(data.onovembers) as [year, onovember] (year)}
<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 onovember.calendar as { dayOfMonth, submissionCount }, i (i)}
{@const { question, playerIDs } = {
question: onovember.dailies[dayOfMonth],
playerIDs: Object.keys(onovember.dailies[dayOfMonth]?.playerIDs || {}),
}}
{#if question}
<div class="onovember-cell" style:--submission-count={submissionCount}>
<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 {dayOfMonth}<br /><code>0</code> submissions
</div>
{/if}
{/each}
</div>
<section>
<h2 id={year}>
<a href="/onovember#{year}"
>O(N)ovember {year}
<small
>{onovember.totalSubmissions} total submission{onovember.totalSubmissions !== 1
? 's'
: ''}</small
></a
>
</h2>

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

<div class="onovember-section">
{#each onovember.calendar as { dayOfMonth, submissionCount, submissionsText, question }, i (i)}
{#if question}
<div class="onovember-cell" style:--submission-count={submissionCount}>
<a href={question.url} title={submissionsText}>Nov {dayOfMonth}<br /></a><code
>{submissionCount}</code
> submissions
</div>
{:else}
<div class="onovember-cell" style:--submission-count="0">
Nov {dayOfMonth}<br /><code>0</code> submissions
</div>
{/if}
{/each}
</div>
</section>
{/each}
</main>

Expand Down Expand Up @@ -102,14 +98,18 @@
}
.onovember-cell {
background-color: hsl(24 calc(var(--submission-count, 0%) * 100%) 50%);
background-color: hsl(24, 100%, calc(50% - var(--submission-count, 0) * 5%));
padding: 1em;
margin: 0.5em;
border-radius: 5px;
display: inline-block;
text-align: center;
}
ol {
margin-left: 0px;
}
a {
text-decoration: none;
}
Expand Down

0 comments on commit 4aa624e

Please sign in to comment.