Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions docs/code-adventure/index.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
---
description: A story-based series of Programming Puzzles inspired by Advent of Code
---

#

[![Practical Python Code Adventure](/static/code-adventure/MAINlight.png#only-light)](#adventures)
[![Practical Python Code Adventure](/static/code-adventure/MAINdark.png#only-dark)](#adventures)

Practical Python Code Adventure is a series of programming puzzles inspired by Eric Wastl's *Advent of Code*.

Each year features __10 story-driven puzzles__ designed to teach programming concepts, popular algorithms,
and real topics from mathematics and science. Every puzzle has two parts, with the second building on the first
to provide an extra challenge. As you progress, the story unfolds alongside the puzzles, adding another layer
of mystery and satisfaction to each solution.

The puzzles are __free for everyone to enjoy__. Signing in with Discord is optional and lets you save your
progress, but you are also welcome to play as a guest. For the best experience, we recommend completing the
puzzles in order so the story develops naturally, though you're free to tackle them in any order or skip a
puzzle if it proves too challenging.

Do you love solving puzzles and learning something new? __Join us on a Code Adventure!__


## :octicons-trophy-24:{ .md .middle } Adventures

<div class="grid cards adventure" markdown>

- :material-rocket-launch:{ .lg .middle } &nbsp; __2025__

---

[![2025 Challenges](/static/code-adventure/2025.png)](https://adventure.practicalpython.org/2025)

Begin your adventure on board the STS Solara with Captain Xarlos and his crew, embarking
on a space adventure to save the universe from a mysterious threat.


- :material-bone:{ .lg .middle } &nbsp; __2026__

---

[![2026 Challenges](/static/code-adventure/2026.png)](https://adventure.practicalpython.org/2026)

Continue where you left off, finding yourself in a strange place and time, separated from
your captain and the crew. Will you be able to find them, and what dangers await?


- :material-help-circle:{ .lg .middle } &nbsp; __2027 (Coming Next Summer)__

---

![2027 Challenges](/static/code-adventure/2027BLUR.png) <!-- (https://adventure.practicalpython.org/2027) -->


</div>


!!! tip ""

## :material-campfire:{ .lg .middle } Around the campfire :material-campfire:{ .lg .middle .flip }

*Shedding some <span class="highlight">light</span> on the __people__ and __work__ behind the adventure*

---

[:material-heart-outline:{ .lg .middle } __Gratitude__](https://adventure.practicalpython.org/gratitude)

: Practical Python Code Adventure wouldn't be what it is without the help of a great community.
Several people have contributed their time and expertise by helping with hosting, beta testing,
UX testing, and advice. __They deserve recognition, so you'll find them listed here__!

[:material-star-shooting-outline:{ .lg .middle } __Sponsors__](https://adventure.practicalpython.org/sponsor)

: Enjoying the puzzles and want to help keep the adventure going? There are two patron tiers,
__starting at $5__. These puzzles take all year to build, and we want to keep them free for
everyone. If you can, __your support means a lot and is genuinely appreciated__.

: __See who's already helped support the adventure__, or find out how you can become a sponsor yourself.

: __Corporate sponsorship opportunities are also available__.

[:simple-github:{ .lg .middle } __Github__](https://github.com/JefeThePug/Practical-Python-Code-Adventure)

: Curious about how the adventure was made? __Check out the project on GitHub__.
If you like what you see, feel free to give it a :material-star:{ .lg .bottom }.
Binary file addeddocs/static/code-adventure/2025.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/2026.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/2027BLUR.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/MAINdark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/MAINlight.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
36 changes: 36 additions & 0 deletions docs/stylesheets/extra.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -41,6 +41,42 @@
margin: 0.3rem 0.2rem 0;
}

.flip svg {
transform: scaleX(-1);
}

.highlight {
color: var(--md-accent-fg-color);
font-weight: 700;
}

.adventure img {
transition: transform 0.15s ease;
border-radius: 0.5rem;
}

.adventure img:hover {
animation: magic-pulse 1.3s infinite;
transform: scale(1.02);
}

@keyframes magic-pulse {
0%,
100% {
box-shadow:
0 0 0 rgba(94, 139, 222, 0),
0 0 8px rgba(94, 139, 222, 0.35),
0 0 18px rgba(94, 139, 222, 0.2);
}

50% {
box-shadow:
0 0 12px rgba(94, 139, 222, 0.9),
0 0 30px rgba(94, 139, 222, 0.7),
0 0 60px rgba(94, 139, 222, 0.5);
}
}

@media screen and (max-width: 44.98em) {
.pp-hero {
padding: 1.6rem 0 1.2rem;
Expand Down
3 changes: 3 additions & 0 deletions zensical.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,9 @@ nav = [
"rules/moderation.md",
"rules/channels.md",
] },
{ "Code Adventure" = [
"code-adventure/index.md",
] },
]

[project.theme]
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Feature/code adventure page by JefeThePug · Pull Request #8 · practical-python-org/practical-python-dot-org · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions docs/code-adventure/index.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
---
description: A story-based series of Programming Puzzles inspired by Advent of Code
---

#

[![Practical Python Code Adventure](/static/code-adventure/MAINlight.png#only-light)](#adventures)
[![Practical Python Code Adventure](/static/code-adventure/MAINdark.png#only-dark)](#adventures)

Practical Python Code Adventure is a series of programming puzzles inspired by Eric Wastl's *Advent of Code*.

Each year features __10 story-driven puzzles__ designed to teach programming concepts, popular algorithms,
and real topics from mathematics and science. Every puzzle has two parts, with the second building on the first
to provide an extra challenge. As you progress, the story unfolds alongside the puzzles, adding another layer
of mystery and satisfaction to each solution.

The puzzles are __free for everyone to enjoy__. Signing in with Discord is optional and lets you save your
progress, but you are also welcome to play as a guest. For the best experience, we recommend completing the
puzzles in order so the story develops naturally, though you're free to tackle them in any order or skip a
puzzle if it proves too challenging.

Do you love solving puzzles and learning something new? __Join us on a Code Adventure!__


## :octicons-trophy-24:{ .md .middle } Adventures

<div class="grid cards adventure" markdown>

- :material-rocket-launch:{ .lg .middle } &nbsp; __2025__

---

[![2025 Challenges](/static/code-adventure/2025.png)](https://adventure.practicalpython.org/2025)

Begin your adventure on board the STS Solara with Captain Xarlos and his crew, embarking
on a space adventure to save the universe from a mysterious threat.


- :material-bone:{ .lg .middle } &nbsp; __2026__

---

[![2026 Challenges](/static/code-adventure/2026.png)](https://adventure.practicalpython.org/2026)

Continue where you left off, finding yourself in a strange place and time, separated from
your captain and the crew. Will you be able to find them, and what dangers await?


- :material-help-circle:{ .lg .middle } &nbsp; __2027 (Coming Next Summer)__

---

![2027 Challenges](/static/code-adventure/2027BLUR.png) <!-- (https://adventure.practicalpython.org/2027) -->


</div>


!!! tip ""

## :material-campfire:{ .lg .middle } Around the campfire :material-campfire:{ .lg .middle .flip }

*Shedding some <span class="highlight">light</span> on the __people__ and __work__ behind the adventure*

---

[:material-heart-outline:{ .lg .middle } __Gratitude__](https://adventure.practicalpython.org/gratitude)

: Practical Python Code Adventure wouldn't be what it is without the help of a great community.
Several people have contributed their time and expertise by helping with hosting, beta testing,
UX testing, and advice. __They deserve recognition, so you'll find them listed here__!

[:material-star-shooting-outline:{ .lg .middle } __Sponsors__](https://adventure.practicalpython.org/sponsor)

: Enjoying the puzzles and want to help keep the adventure going? There are two patron tiers,
__starting at $5__. These puzzles take all year to build, and we want to keep them free for
everyone. If you can, __your support means a lot and is genuinely appreciated__.

: __See who's already helped support the adventure__, or find out how you can become a sponsor yourself.

: __Corporate sponsorship opportunities are also available__.

[:simple-github:{ .lg .middle } __Github__](https://github.com/JefeThePug/Practical-Python-Code-Adventure)

: Curious about how the adventure was made? __Check out the project on GitHub__.
If you like what you see, feel free to give it a :material-star:{ .lg .bottom }.
Binary file addeddocs/static/code-adventure/2025.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/2026.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/2027BLUR.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/MAINdark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/MAINlight.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
36 changes: 36 additions & 0 deletions docs/stylesheets/extra.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -41,6 +41,42 @@
margin: 0.3rem 0.2rem 0;
}

.flip svg {
transform: scaleX(-1);
}

.highlight {
color: var(--md-accent-fg-color);
font-weight: 700;
}

.adventure img {
transition: transform 0.15s ease;
border-radius: 0.5rem;
}

.adventure img:hover {
animation: magic-pulse 1.3s infinite;
transform: scale(1.02);
}

@keyframes magic-pulse {
0%,
100% {
box-shadow:
0 0 0 rgba(94, 139, 222, 0),
0 0 8px rgba(94, 139, 222, 0.35),
0 0 18px rgba(94, 139, 222, 0.2);
}

50% {
box-shadow:
0 0 12px rgba(94, 139, 222, 0.9),
0 0 30px rgba(94, 139, 222, 0.7),
0 0 60px rgba(94, 139, 222, 0.5);
}
}

@media screen and (max-width: 44.98em) {
.pp-hero {
padding: 1.6rem 0 1.2rem;
Expand Down
3 changes: 3 additions & 0 deletions zensical.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,9 @@ nav = [
"rules/moderation.md",
"rules/channels.md",
] },
{ "Code Adventure" = [
"code-adventure/index.md",
] },
]

[project.theme]
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Feature/code adventure page by JefeThePug · Pull Request #8 · practical-python-org/practical-python-dot-org · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions docs/code-adventure/index.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
---
description: A story-based series of Programming Puzzles inspired by Advent of Code
---

#

[![Practical Python Code Adventure](/static/code-adventure/MAINlight.png#only-light)](#adventures)
[![Practical Python Code Adventure](/static/code-adventure/MAINdark.png#only-dark)](#adventures)

Practical Python Code Adventure is a series of programming puzzles inspired by Eric Wastl's *Advent of Code*.

Each year features __10 story-driven puzzles__ designed to teach programming concepts, popular algorithms,
and real topics from mathematics and science. Every puzzle has two parts, with the second building on the first
to provide an extra challenge. As you progress, the story unfolds alongside the puzzles, adding another layer
of mystery and satisfaction to each solution.

The puzzles are __free for everyone to enjoy__. Signing in with Discord is optional and lets you save your
progress, but you are also welcome to play as a guest. For the best experience, we recommend completing the
puzzles in order so the story develops naturally, though you're free to tackle them in any order or skip a
puzzle if it proves too challenging.

Do you love solving puzzles and learning something new? __Join us on a Code Adventure!__


## :octicons-trophy-24:{ .md .middle } Adventures

<div class="grid cards adventure" markdown>

- :material-rocket-launch:{ .lg .middle } &nbsp; __2025__

---

[![2025 Challenges](/static/code-adventure/2025.png)](https://adventure.practicalpython.org/2025)

Begin your adventure on board the STS Solara with Captain Xarlos and his crew, embarking
on a space adventure to save the universe from a mysterious threat.


- :material-bone:{ .lg .middle } &nbsp; __2026__

---

[![2026 Challenges](/static/code-adventure/2026.png)](https://adventure.practicalpython.org/2026)

Continue where you left off, finding yourself in a strange place and time, separated from
your captain and the crew. Will you be able to find them, and what dangers await?


- :material-help-circle:{ .lg .middle } &nbsp; __2027 (Coming Next Summer)__

---

![2027 Challenges](/static/code-adventure/2027BLUR.png) <!-- (https://adventure.practicalpython.org/2027) -->


</div>


!!! tip ""

## :material-campfire:{ .lg .middle } Around the campfire :material-campfire:{ .lg .middle .flip }

*Shedding some <span class="highlight">light</span> on the __people__ and __work__ behind the adventure*

---

[:material-heart-outline:{ .lg .middle } __Gratitude__](https://adventure.practicalpython.org/gratitude)

: Practical Python Code Adventure wouldn't be what it is without the help of a great community.
Several people have contributed their time and expertise by helping with hosting, beta testing,
UX testing, and advice. __They deserve recognition, so you'll find them listed here__!

[:material-star-shooting-outline:{ .lg .middle } __Sponsors__](https://adventure.practicalpython.org/sponsor)

: Enjoying the puzzles and want to help keep the adventure going? There are two patron tiers,
__starting at $5__. These puzzles take all year to build, and we want to keep them free for
everyone. If you can, __your support means a lot and is genuinely appreciated__.

: __See who's already helped support the adventure__, or find out how you can become a sponsor yourself.

: __Corporate sponsorship opportunities are also available__.

[:simple-github:{ .lg .middle } __Github__](https://github.com/JefeThePug/Practical-Python-Code-Adventure)

: Curious about how the adventure was made? __Check out the project on GitHub__.
If you like what you see, feel free to give it a :material-star:{ .lg .bottom }.
Binary file addeddocs/static/code-adventure/2025.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/2026.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/2027BLUR.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/MAINdark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/MAINlight.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
36 changes: 36 additions & 0 deletions docs/stylesheets/extra.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -41,6 +41,42 @@
margin: 0.3rem 0.2rem 0;
}

.flip svg {
transform: scaleX(-1);
}

.highlight {
color: var(--md-accent-fg-color);
font-weight: 700;
}

.adventure img {
transition: transform 0.15s ease;
border-radius: 0.5rem;
}

.adventure img:hover {
animation: magic-pulse 1.3s infinite;
transform: scale(1.02);
}

@keyframes magic-pulse {
0%,
100% {
box-shadow:
0 0 0 rgba(94, 139, 222, 0),
0 0 8px rgba(94, 139, 222, 0.35),
0 0 18px rgba(94, 139, 222, 0.2);
}

50% {
box-shadow:
0 0 12px rgba(94, 139, 222, 0.9),
0 0 30px rgba(94, 139, 222, 0.7),
0 0 60px rgba(94, 139, 222, 0.5);
}
}

@media screen and (max-width: 44.98em) {
.pp-hero {
padding: 1.6rem 0 1.2rem;
Expand Down
3 changes: 3 additions & 0 deletions zensical.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,9 @@ nav = [
"rules/moderation.md",
"rules/channels.md",
] },
{ "Code Adventure" = [
"code-adventure/index.md",
] },
]

[project.theme]
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Feature/code adventure page by JefeThePug · Pull Request #8 · practical-python-org/practical-python-dot-org · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions docs/code-adventure/index.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
---
description: A story-based series of Programming Puzzles inspired by Advent of Code
---

#

[![Practical Python Code Adventure](/static/code-adventure/MAINlight.png#only-light)](#adventures)
[![Practical Python Code Adventure](/static/code-adventure/MAINdark.png#only-dark)](#adventures)

Practical Python Code Adventure is a series of programming puzzles inspired by Eric Wastl's *Advent of Code*.

Each year features __10 story-driven puzzles__ designed to teach programming concepts, popular algorithms,
and real topics from mathematics and science. Every puzzle has two parts, with the second building on the first
to provide an extra challenge. As you progress, the story unfolds alongside the puzzles, adding another layer
of mystery and satisfaction to each solution.

The puzzles are __free for everyone to enjoy__. Signing in with Discord is optional and lets you save your
progress, but you are also welcome to play as a guest. For the best experience, we recommend completing the
puzzles in order so the story develops naturally, though you're free to tackle them in any order or skip a
puzzle if it proves too challenging.

Do you love solving puzzles and learning something new? __Join us on a Code Adventure!__


## :octicons-trophy-24:{ .md .middle } Adventures

<div class="grid cards adventure" markdown>

- :material-rocket-launch:{ .lg .middle } &nbsp; __2025__

---

[![2025 Challenges](/static/code-adventure/2025.png)](https://adventure.practicalpython.org/2025)

Begin your adventure on board the STS Solara with Captain Xarlos and his crew, embarking
on a space adventure to save the universe from a mysterious threat.


- :material-bone:{ .lg .middle } &nbsp; __2026__

---

[![2026 Challenges](/static/code-adventure/2026.png)](https://adventure.practicalpython.org/2026)

Continue where you left off, finding yourself in a strange place and time, separated from
your captain and the crew. Will you be able to find them, and what dangers await?


- :material-help-circle:{ .lg .middle } &nbsp; __2027 (Coming Next Summer)__

---

![2027 Challenges](/static/code-adventure/2027BLUR.png) <!-- (https://adventure.practicalpython.org/2027) -->


</div>


!!! tip ""

## :material-campfire:{ .lg .middle } Around the campfire :material-campfire:{ .lg .middle .flip }

*Shedding some <span class="highlight">light</span> on the __people__ and __work__ behind the adventure*

---

[:material-heart-outline:{ .lg .middle } __Gratitude__](https://adventure.practicalpython.org/gratitude)

: Practical Python Code Adventure wouldn't be what it is without the help of a great community.
Several people have contributed their time and expertise by helping with hosting, beta testing,
UX testing, and advice. __They deserve recognition, so you'll find them listed here__!

[:material-star-shooting-outline:{ .lg .middle } __Sponsors__](https://adventure.practicalpython.org/sponsor)

: Enjoying the puzzles and want to help keep the adventure going? There are two patron tiers,
__starting at $5__. These puzzles take all year to build, and we want to keep them free for
everyone. If you can, __your support means a lot and is genuinely appreciated__.

: __See who's already helped support the adventure__, or find out how you can become a sponsor yourself.

: __Corporate sponsorship opportunities are also available__.

[:simple-github:{ .lg .middle } __Github__](https://github.com/JefeThePug/Practical-Python-Code-Adventure)

: Curious about how the adventure was made? __Check out the project on GitHub__.
If you like what you see, feel free to give it a :material-star:{ .lg .bottom }.
Binary file addeddocs/static/code-adventure/2025.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/2026.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/2027BLUR.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/MAINdark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/MAINlight.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
36 changes: 36 additions & 0 deletions docs/stylesheets/extra.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -41,6 +41,42 @@
margin: 0.3rem 0.2rem 0;
}

.flip svg {
transform: scaleX(-1);
}

.highlight {
color: var(--md-accent-fg-color);
font-weight: 700;
}

.adventure img {
transition: transform 0.15s ease;
border-radius: 0.5rem;
}

.adventure img:hover {
animation: magic-pulse 1.3s infinite;
transform: scale(1.02);
}

@keyframes magic-pulse {
0%,
100% {
box-shadow:
0 0 0 rgba(94, 139, 222, 0),
0 0 8px rgba(94, 139, 222, 0.35),
0 0 18px rgba(94, 139, 222, 0.2);
}

50% {
box-shadow:
0 0 12px rgba(94, 139, 222, 0.9),
0 0 30px rgba(94, 139, 222, 0.7),
0 0 60px rgba(94, 139, 222, 0.5);
}
}

@media screen and (max-width: 44.98em) {
.pp-hero {
padding: 1.6rem 0 1.2rem;
Expand Down
3 changes: 3 additions & 0 deletions zensical.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,9 @@ nav = [
"rules/moderation.md",
"rules/channels.md",
] },
{ "Code Adventure" = [
"code-adventure/index.md",
] },
]

[project.theme]
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Feature/code adventure page by JefeThePug · Pull Request #8 · practical-python-org/practical-python-dot-org · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions docs/code-adventure/index.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
---
description: A story-based series of Programming Puzzles inspired by Advent of Code
---

#

[![Practical Python Code Adventure](/static/code-adventure/MAINlight.png#only-light)](#adventures)
[![Practical Python Code Adventure](/static/code-adventure/MAINdark.png#only-dark)](#adventures)

Practical Python Code Adventure is a series of programming puzzles inspired by Eric Wastl's *Advent of Code*.

Each year features __10 story-driven puzzles__ designed to teach programming concepts, popular algorithms,
and real topics from mathematics and science. Every puzzle has two parts, with the second building on the first
to provide an extra challenge. As you progress, the story unfolds alongside the puzzles, adding another layer
of mystery and satisfaction to each solution.

The puzzles are __free for everyone to enjoy__. Signing in with Discord is optional and lets you save your
progress, but you are also welcome to play as a guest. For the best experience, we recommend completing the
puzzles in order so the story develops naturally, though you're free to tackle them in any order or skip a
puzzle if it proves too challenging.

Do you love solving puzzles and learning something new? __Join us on a Code Adventure!__


## :octicons-trophy-24:{ .md .middle } Adventures

<div class="grid cards adventure" markdown>

- :material-rocket-launch:{ .lg .middle } &nbsp; __2025__

---

[![2025 Challenges](/static/code-adventure/2025.png)](https://adventure.practicalpython.org/2025)

Begin your adventure on board the STS Solara with Captain Xarlos and his crew, embarking
on a space adventure to save the universe from a mysterious threat.


- :material-bone:{ .lg .middle } &nbsp; __2026__

---

[![2026 Challenges](/static/code-adventure/2026.png)](https://adventure.practicalpython.org/2026)

Continue where you left off, finding yourself in a strange place and time, separated from
your captain and the crew. Will you be able to find them, and what dangers await?


- :material-help-circle:{ .lg .middle } &nbsp; __2027 (Coming Next Summer)__

---

![2027 Challenges](/static/code-adventure/2027BLUR.png) <!-- (https://adventure.practicalpython.org/2027) -->


</div>


!!! tip ""

## :material-campfire:{ .lg .middle } Around the campfire :material-campfire:{ .lg .middle .flip }

*Shedding some <span class="highlight">light</span> on the __people__ and __work__ behind the adventure*

---

[:material-heart-outline:{ .lg .middle } __Gratitude__](https://adventure.practicalpython.org/gratitude)

: Practical Python Code Adventure wouldn't be what it is without the help of a great community.
Several people have contributed their time and expertise by helping with hosting, beta testing,
UX testing, and advice. __They deserve recognition, so you'll find them listed here__!

[:material-star-shooting-outline:{ .lg .middle } __Sponsors__](https://adventure.practicalpython.org/sponsor)

: Enjoying the puzzles and want to help keep the adventure going? There are two patron tiers,
__starting at $5__. These puzzles take all year to build, and we want to keep them free for
everyone. If you can, __your support means a lot and is genuinely appreciated__.

: __See who's already helped support the adventure__, or find out how you can become a sponsor yourself.

: __Corporate sponsorship opportunities are also available__.

[:simple-github:{ .lg .middle } __Github__](https://github.com/JefeThePug/Practical-Python-Code-Adventure)

: Curious about how the adventure was made? __Check out the project on GitHub__.
If you like what you see, feel free to give it a :material-star:{ .lg .bottom }.
Binary file addeddocs/static/code-adventure/2025.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/2026.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/2027BLUR.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/MAINdark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/MAINlight.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
36 changes: 36 additions & 0 deletions docs/stylesheets/extra.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -41,6 +41,42 @@
margin: 0.3rem 0.2rem 0;
}

.flip svg {
transform: scaleX(-1);
}

.highlight {
color: var(--md-accent-fg-color);
font-weight: 700;
}

.adventure img {
transition: transform 0.15s ease;
border-radius: 0.5rem;
}

.adventure img:hover {
animation: magic-pulse 1.3s infinite;
transform: scale(1.02);
}

@keyframes magic-pulse {
0%,
100% {
box-shadow:
0 0 0 rgba(94, 139, 222, 0),
0 0 8px rgba(94, 139, 222, 0.35),
0 0 18px rgba(94, 139, 222, 0.2);
}

50% {
box-shadow:
0 0 12px rgba(94, 139, 222, 0.9),
0 0 30px rgba(94, 139, 222, 0.7),
0 0 60px rgba(94, 139, 222, 0.5);
}
}

@media screen and (max-width: 44.98em) {
.pp-hero {
padding: 1.6rem 0 1.2rem;
Expand Down
3 changes: 3 additions & 0 deletions zensical.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,9 @@ nav = [
"rules/moderation.md",
"rules/channels.md",
] },
{ "Code Adventure" = [
"code-adventure/index.md",
] },
]

[project.theme]
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Feature/code adventure page by JefeThePug · Pull Request #8 · practical-python-org/practical-python-dot-org · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions docs/code-adventure/index.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
---
description: A story-based series of Programming Puzzles inspired by Advent of Code
---

#

[![Practical Python Code Adventure](/static/code-adventure/MAINlight.png#only-light)](#adventures)
[![Practical Python Code Adventure](/static/code-adventure/MAINdark.png#only-dark)](#adventures)

Practical Python Code Adventure is a series of programming puzzles inspired by Eric Wastl's *Advent of Code*.

Each year features __10 story-driven puzzles__ designed to teach programming concepts, popular algorithms,
and real topics from mathematics and science. Every puzzle has two parts, with the second building on the first
to provide an extra challenge. As you progress, the story unfolds alongside the puzzles, adding another layer
of mystery and satisfaction to each solution.

The puzzles are __free for everyone to enjoy__. Signing in with Discord is optional and lets you save your
progress, but you are also welcome to play as a guest. For the best experience, we recommend completing the
puzzles in order so the story develops naturally, though you're free to tackle them in any order or skip a
puzzle if it proves too challenging.

Do you love solving puzzles and learning something new? __Join us on a Code Adventure!__


## :octicons-trophy-24:{ .md .middle } Adventures

<div class="grid cards adventure" markdown>

- :material-rocket-launch:{ .lg .middle } &nbsp; __2025__

---

[![2025 Challenges](/static/code-adventure/2025.png)](https://adventure.practicalpython.org/2025)

Begin your adventure on board the STS Solara with Captain Xarlos and his crew, embarking
on a space adventure to save the universe from a mysterious threat.


- :material-bone:{ .lg .middle } &nbsp; __2026__

---

[![2026 Challenges](/static/code-adventure/2026.png)](https://adventure.practicalpython.org/2026)

Continue where you left off, finding yourself in a strange place and time, separated from
your captain and the crew. Will you be able to find them, and what dangers await?


- :material-help-circle:{ .lg .middle } &nbsp; __2027 (Coming Next Summer)__

---

![2027 Challenges](/static/code-adventure/2027BLUR.png) <!-- (https://adventure.practicalpython.org/2027) -->


</div>


!!! tip ""

## :material-campfire:{ .lg .middle } Around the campfire :material-campfire:{ .lg .middle .flip }

*Shedding some <span class="highlight">light</span> on the __people__ and __work__ behind the adventure*

---

[:material-heart-outline:{ .lg .middle } __Gratitude__](https://adventure.practicalpython.org/gratitude)

: Practical Python Code Adventure wouldn't be what it is without the help of a great community.
Several people have contributed their time and expertise by helping with hosting, beta testing,
UX testing, and advice. __They deserve recognition, so you'll find them listed here__!

[:material-star-shooting-outline:{ .lg .middle } __Sponsors__](https://adventure.practicalpython.org/sponsor)

: Enjoying the puzzles and want to help keep the adventure going? There are two patron tiers,
__starting at $5__. These puzzles take all year to build, and we want to keep them free for
everyone. If you can, __your support means a lot and is genuinely appreciated__.

: __See who's already helped support the adventure__, or find out how you can become a sponsor yourself.

: __Corporate sponsorship opportunities are also available__.

[:simple-github:{ .lg .middle } __Github__](https://github.com/JefeThePug/Practical-Python-Code-Adventure)

: Curious about how the adventure was made? __Check out the project on GitHub__.
If you like what you see, feel free to give it a :material-star:{ .lg .bottom }.
Binary file addeddocs/static/code-adventure/2025.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/2026.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/2027BLUR.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/MAINdark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/MAINlight.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
36 changes: 36 additions & 0 deletions docs/stylesheets/extra.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -41,6 +41,42 @@
margin: 0.3rem 0.2rem 0;
}

.flip svg {
transform: scaleX(-1);
}

.highlight {
color: var(--md-accent-fg-color);
font-weight: 700;
}

.adventure img {
transition: transform 0.15s ease;
border-radius: 0.5rem;
}

.adventure img:hover {
animation: magic-pulse 1.3s infinite;
transform: scale(1.02);
}

@keyframes magic-pulse {
0%,
100% {
box-shadow:
0 0 0 rgba(94, 139, 222, 0),
0 0 8px rgba(94, 139, 222, 0.35),
0 0 18px rgba(94, 139, 222, 0.2);
}

50% {
box-shadow:
0 0 12px rgba(94, 139, 222, 0.9),
0 0 30px rgba(94, 139, 222, 0.7),
0 0 60px rgba(94, 139, 222, 0.5);
}
}

@media screen and (max-width: 44.98em) {
.pp-hero {
padding: 1.6rem 0 1.2rem;
Expand Down
3 changes: 3 additions & 0 deletions zensical.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,9 @@ nav = [
"rules/moderation.md",
"rules/channels.md",
] },
{ "Code Adventure" = [
"code-adventure/index.md",
] },
]

[project.theme]
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Feature/code adventure page by JefeThePug · Pull Request #8 · practical-python-org/practical-python-dot-org · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions docs/code-adventure/index.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
---
description: A story-based series of Programming Puzzles inspired by Advent of Code
---

#

[![Practical Python Code Adventure](/static/code-adventure/MAINlight.png#only-light)](#adventures)
[![Practical Python Code Adventure](/static/code-adventure/MAINdark.png#only-dark)](#adventures)

Practical Python Code Adventure is a series of programming puzzles inspired by Eric Wastl's *Advent of Code*.

Each year features __10 story-driven puzzles__ designed to teach programming concepts, popular algorithms,
and real topics from mathematics and science. Every puzzle has two parts, with the second building on the first
to provide an extra challenge. As you progress, the story unfolds alongside the puzzles, adding another layer
of mystery and satisfaction to each solution.

The puzzles are __free for everyone to enjoy__. Signing in with Discord is optional and lets you save your
progress, but you are also welcome to play as a guest. For the best experience, we recommend completing the
puzzles in order so the story develops naturally, though you're free to tackle them in any order or skip a
puzzle if it proves too challenging.

Do you love solving puzzles and learning something new? __Join us on a Code Adventure!__


## :octicons-trophy-24:{ .md .middle } Adventures

<div class="grid cards adventure" markdown>

- :material-rocket-launch:{ .lg .middle } &nbsp; __2025__

---

[![2025 Challenges](/static/code-adventure/2025.png)](https://adventure.practicalpython.org/2025)

Begin your adventure on board the STS Solara with Captain Xarlos and his crew, embarking
on a space adventure to save the universe from a mysterious threat.


- :material-bone:{ .lg .middle } &nbsp; __2026__

---

[![2026 Challenges](/static/code-adventure/2026.png)](https://adventure.practicalpython.org/2026)

Continue where you left off, finding yourself in a strange place and time, separated from
your captain and the crew. Will you be able to find them, and what dangers await?


- :material-help-circle:{ .lg .middle } &nbsp; __2027 (Coming Next Summer)__

---

![2027 Challenges](/static/code-adventure/2027BLUR.png) <!-- (https://adventure.practicalpython.org/2027) -->


</div>


!!! tip ""

## :material-campfire:{ .lg .middle } Around the campfire :material-campfire:{ .lg .middle .flip }

*Shedding some <span class="highlight">light</span> on the __people__ and __work__ behind the adventure*

---

[:material-heart-outline:{ .lg .middle } __Gratitude__](https://adventure.practicalpython.org/gratitude)

: Practical Python Code Adventure wouldn't be what it is without the help of a great community.
Several people have contributed their time and expertise by helping with hosting, beta testing,
UX testing, and advice. __They deserve recognition, so you'll find them listed here__!

[:material-star-shooting-outline:{ .lg .middle } __Sponsors__](https://adventure.practicalpython.org/sponsor)

: Enjoying the puzzles and want to help keep the adventure going? There are two patron tiers,
__starting at $5__. These puzzles take all year to build, and we want to keep them free for
everyone. If you can, __your support means a lot and is genuinely appreciated__.

: __See who's already helped support the adventure__, or find out how you can become a sponsor yourself.

: __Corporate sponsorship opportunities are also available__.

[:simple-github:{ .lg .middle } __Github__](https://github.com/JefeThePug/Practical-Python-Code-Adventure)

: Curious about how the adventure was made? __Check out the project on GitHub__.
If you like what you see, feel free to give it a :material-star:{ .lg .bottom }.
Binary file addeddocs/static/code-adventure/2025.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/2026.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/2027BLUR.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/MAINdark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/MAINlight.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
36 changes: 36 additions & 0 deletions docs/stylesheets/extra.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -41,6 +41,42 @@
margin: 0.3rem 0.2rem 0;
}

.flip svg {
transform: scaleX(-1);
}

.highlight {
color: var(--md-accent-fg-color);
font-weight: 700;
}

.adventure img {
transition: transform 0.15s ease;
border-radius: 0.5rem;
}

.adventure img:hover {
animation: magic-pulse 1.3s infinite;
transform: scale(1.02);
}

@keyframes magic-pulse {
0%,
100% {
box-shadow:
0 0 0 rgba(94, 139, 222, 0),
0 0 8px rgba(94, 139, 222, 0.35),
0 0 18px rgba(94, 139, 222, 0.2);
}

50% {
box-shadow:
0 0 12px rgba(94, 139, 222, 0.9),
0 0 30px rgba(94, 139, 222, 0.7),
0 0 60px rgba(94, 139, 222, 0.5);
}
}

@media screen and (max-width: 44.98em) {
.pp-hero {
padding: 1.6rem 0 1.2rem;
Expand Down
3 changes: 3 additions & 0 deletions zensical.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,9 @@ nav = [
"rules/moderation.md",
"rules/channels.md",
] },
{ "Code Adventure" = [
"code-adventure/index.md",
] },
]

[project.theme]
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Feature/code adventure page by JefeThePug · Pull Request #8 · practical-python-org/practical-python-dot-org · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions docs/code-adventure/index.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
---
description: A story-based series of Programming Puzzles inspired by Advent of Code
---

#

[![Practical Python Code Adventure](/static/code-adventure/MAINlight.png#only-light)](#adventures)
[![Practical Python Code Adventure](/static/code-adventure/MAINdark.png#only-dark)](#adventures)

Practical Python Code Adventure is a series of programming puzzles inspired by Eric Wastl's *Advent of Code*.

Each year features __10 story-driven puzzles__ designed to teach programming concepts, popular algorithms,
and real topics from mathematics and science. Every puzzle has two parts, with the second building on the first
to provide an extra challenge. As you progress, the story unfolds alongside the puzzles, adding another layer
of mystery and satisfaction to each solution.

The puzzles are __free for everyone to enjoy__. Signing in with Discord is optional and lets you save your
progress, but you are also welcome to play as a guest. For the best experience, we recommend completing the
puzzles in order so the story develops naturally, though you're free to tackle them in any order or skip a
puzzle if it proves too challenging.

Do you love solving puzzles and learning something new? __Join us on a Code Adventure!__


## :octicons-trophy-24:{ .md .middle } Adventures

<div class="grid cards adventure" markdown>

- :material-rocket-launch:{ .lg .middle } &nbsp; __2025__

---

[![2025 Challenges](/static/code-adventure/2025.png)](https://adventure.practicalpython.org/2025)

Begin your adventure on board the STS Solara with Captain Xarlos and his crew, embarking
on a space adventure to save the universe from a mysterious threat.


- :material-bone:{ .lg .middle } &nbsp; __2026__

---

[![2026 Challenges](/static/code-adventure/2026.png)](https://adventure.practicalpython.org/2026)

Continue where you left off, finding yourself in a strange place and time, separated from
your captain and the crew. Will you be able to find them, and what dangers await?


- :material-help-circle:{ .lg .middle } &nbsp; __2027 (Coming Next Summer)__

---

![2027 Challenges](/static/code-adventure/2027BLUR.png) <!-- (https://adventure.practicalpython.org/2027) -->


</div>


!!! tip ""

## :material-campfire:{ .lg .middle } Around the campfire :material-campfire:{ .lg .middle .flip }

*Shedding some <span class="highlight">light</span> on the __people__ and __work__ behind the adventure*

---

[:material-heart-outline:{ .lg .middle } __Gratitude__](https://adventure.practicalpython.org/gratitude)

: Practical Python Code Adventure wouldn't be what it is without the help of a great community.
Several people have contributed their time and expertise by helping with hosting, beta testing,
UX testing, and advice. __They deserve recognition, so you'll find them listed here__!

[:material-star-shooting-outline:{ .lg .middle } __Sponsors__](https://adventure.practicalpython.org/sponsor)

: Enjoying the puzzles and want to help keep the adventure going? There are two patron tiers,
__starting at $5__. These puzzles take all year to build, and we want to keep them free for
everyone. If you can, __your support means a lot and is genuinely appreciated__.

: __See who's already helped support the adventure__, or find out how you can become a sponsor yourself.

: __Corporate sponsorship opportunities are also available__.

[:simple-github:{ .lg .middle } __Github__](https://github.com/JefeThePug/Practical-Python-Code-Adventure)

: Curious about how the adventure was made? __Check out the project on GitHub__.
If you like what you see, feel free to give it a :material-star:{ .lg .bottom }.
Binary file addeddocs/static/code-adventure/2025.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/2026.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/2027BLUR.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/MAINdark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file addeddocs/static/code-adventure/MAINlight.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
36 changes: 36 additions & 0 deletions docs/stylesheets/extra.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -41,6 +41,42 @@
margin: 0.3rem 0.2rem 0;
}

.flip svg {
transform: scaleX(-1);
}

.highlight {
color: var(--md-accent-fg-color);
font-weight: 700;
}

.adventure img {
transition: transform 0.15s ease;
border-radius: 0.5rem;
}

.adventure img:hover {
animation: magic-pulse 1.3s infinite;
transform: scale(1.02);
}

@keyframes magic-pulse {
0%,
100% {
box-shadow:
0 0 0 rgba(94, 139, 222, 0),
0 0 8px rgba(94, 139, 222, 0.35),
0 0 18px rgba(94, 139, 222, 0.2);
}

50% {
box-shadow:
0 0 12px rgba(94, 139, 222, 0.9),
0 0 30px rgba(94, 139, 222, 0.7),
0 0 60px rgba(94, 139, 222, 0.5);
}
}

@media screen and (max-width: 44.98em) {
.pp-hero {
padding: 1.6rem 0 1.2rem;
Expand Down
3 changes: 3 additions & 0 deletions zensical.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,9 @@ nav = [
"rules/moderation.md",
"rules/channels.md",
] },
{ "Code Adventure" = [
"code-adventure/index.md",
] },
]

[project.theme]
Expand Down