{"id":18925635,"url":"https://github.com/jm1/code-cracker-curriculum-2020","last_synced_at":"2026-01-26T18:04:18.817Z","repository":{"id":69767674,"uuid":"313307099","full_name":"JM1/Code-Cracker-Curriculum-2020","owner":"JM1","description":"Advent calendar 2020 for my lovely wife, Mareike.","archived":false,"fork":false,"pushed_at":"2020-12-18T09:21:32.000Z","size":73,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-25T00:19:20.059Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Makefile","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JM1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-11-16T13:13:23.000Z","updated_at":"2020-12-18T09:21:10.000Z","dependencies_parsed_at":null,"dependency_job_id":"fc233dd8-50a1-4dc7-8b18-597cc4fddbda","html_url":"https://github.com/JM1/Code-Cracker-Curriculum-2020","commit_stats":null,"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/JM1/Code-Cracker-Curriculum-2020","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JM1%2FCode-Cracker-Curriculum-2020","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JM1%2FCode-Cracker-Curriculum-2020/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JM1%2FCode-Cracker-Curriculum-2020/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JM1%2FCode-Cracker-Curriculum-2020/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JM1","download_url":"https://codeload.github.com/JM1/Code-Cracker-Curriculum-2020/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JM1%2FCode-Cracker-Curriculum-2020/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28784093,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T13:55:28.044Z","status":"ssl_error","status_checked_at":"2026-01-26T13:55:26.068Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T11:12:40.737Z","updated_at":"2026-01-26T18:04:18.810Z","avatar_url":"https://github.com/JM1.png","language":"Makefile","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Code Cracker Curriculum (CCC) 2020\n\nTo my lovely wife, Mareike.\n\nWelcome to your advent calender 2020 🎅\nThis year's edition is going to be different, it's special, so thrilling, you will lovin' it...\nBut wait, what the f***? 😮\n\nA filthy little mobster 👻 has stolen all of your sweets and hid them all over our house!😱\nBut do not despair! 😎\n\nBeing a wannabe prankster😝, he left behind a series of code puzzles.\nEach puzzle consists of a tiny programming exercise that, once solved,\nwill reveal a secret that leads to the location of your daily sweets 🍬🍭🍫\n\nApparently, this jerk wasn't very clever nor cautious, as he left traces and hints everywhere.\nAnd, as the last resort, you can always ask your fella 👨💍, of course.\nBut beware: Cheating won’t help in the long run, because the course\ndifficulty might adapted dynamically to match your progress 😉\n\nI hope you will enjoy your little journey into the world of coding.\nIt will require your investigative intuition, combinatory ability and analytic skills 👮‍\nBut you wanted to learn Python anyway, didn't you? 😉\n\nSo let the games begin!\n\n## 2020-12-01, Tuesday, Day 0: Warmup\n\nAs every good detective 👮‍, before following traces and hunting down wrongdoers 😈,\nyou have to setup your working environment first. Our ultimate goal is to find all sweets,\nhence we need tools that keeps us focussed on cracking the secrets. No muss, no fuss.\n\nFrom your fellow data scientist you've heard of [Python 🐍](https://www.manning.com/books/get-programming),\na very popular programming language to get things done.\nSo let us start!\n\nFirst, download and install Python 3 and a suitable [IDE](https://wiki.python.org/moin/IntegratedDevelopmentEnvironments)\nfor Python development on Windows 10.\n\nExamples:\n* [`Spyder IDE`](https://docs.anaconda.com/anaconda/user-guide/tasks/integration/spyder/)\n  bundled with [Anaconda](https://www.anaconda.com/products/individual) (⚠️Recommended⚠️)\n\n  *NOTE*:\n  \u003e [`Spyder IDE`](https://www.spyder-ide.org/) is pre-installed in\n  \u003e [Anaconda Navigator](https://docs.anaconda.com/anaconda/navigator/),\n  \u003e which is included in [Anaconda](https://www.anaconda.com/products/individual).\n  \u003e On the Navigator Home tab, click the Spyder icon.\n\n  Free and open source under MIT license.\n\n* [PyDev](https://www.pydev.org/)\n\n  Python IDE for Eclipse.\n  Free and open source under [Eclipse Public License](https://www.eclipse.org/legal/epl-v10.html).\n\n  \u003e The recommended way of using PyDev is bundled in [LiClipse](http://www.liclipse.com/).\n\n* [Sublime Text 3](https://www.sublimetext.com/3) and\n  [install its Python package](https://howtodoinjava.com/python/python-basics/install-python-sublime-editor/)\n\n  \u003e Sublime Text may be downloaded and evaluated for free, however a license\n  \u003e must be purchased for continued use. There is currently no enforced time\n  \u003e limit for the evaluation.\n\nNext, fetch [Python script `secret.py`](https://berrendorf.inf.h-brs.de/~jmeng2m/ccc2020/day01/secret.py),\nopen it with your newly installed IDE and hit `RUN`.\nThat's it for today! Easy start, wasn't it? 😘\n\n## 2020-12-02, Wednesday, Day Ⅰ: Security through Obscurity\n\nOur favorite villain left us a cryptic message: `QXVmIGRlciBNYXRyYXR6ZSB1bnRlciBkZW0gQmV0dCBpbSBEYWNoZ2VzY2hvc3MK`\n\nThis string looks like being [Base64](https://www.geeksforgeeks.org/base64-b64encode-in-python/) encoded.\nGood for you! Obviously, the mystery-monger did not know that decoding is not encryption and that you\ncan easily reconstruct the secret by just decoding the base64 string! 🐧\n\nHints:\n\u003e Use Python's [base64](https://docs.python.org/3/library/base64.html) library to decode the secret!\n\nLines of Code (excl. blank lines): ~3\n\n## 2020-12-03, Thursday, Day Ⅱ: World wide investigations\n\nOur jester detected his shortcomings in security and has moved his secrets into the cloud 🌎\nAs if that would save him...\n\nDownload file [`secret.txt`](https://berrendorf.inf.h-brs.de/~jmeng2m/ccc2020/day03/secret.txt) using Python\nand `print` its context.\n\nHints:\n\u003e Do not even think about using a browser to download that file, it won't work 😉\n\n\u003e You might use the [`Requests`](https://requests.readthedocs.io/en/master/) module for fetching content via HTTP.\n\n\u003e To install additional Python packages, follow install steps for your IDE, e.g.:\n\u003e * [Anaconda](https://docs.anaconda.com/anaconda/user-guide/tasks/install-packages/)\n\u003e * Standalone [Spyder IDE](https://miamioh.instructure.com/courses/38817/pages/downloading-and-installing-packages)\n    (Try [Anaconda](https://docs.anaconda.com/anaconda/user-guide/tasks/install-packages/) first!)\n\u003e * [PyDev](https://www.planetofbits.com/python/how-to-install-a-python-package-in-eclipse/)\n\u003e * Use [PIP](https://matthewhorne.me/how-to-install-python-and-pip-on-windows-10/), e.g.\n    `python -m pip install requests`\n\nLines of Code (excl. blank lines): ~3-10\n\n## 2020-12-04, Friday, Day Ⅲ: Bridging worlds\n\nIt's friday and it looks like our stupid buddy is already becoming lazy. One man's loss is another woman's gain 😁\n\nDownload file [`secret_base64.txt`](https://berrendorf.inf.h-brs.de/~jmeng2m/ccc2020/day04/secret_base64.txt),\ndecode its context and print the results!\n\nHints:\n\u003e Combine your programs from the last two days!\n\nLines of Code (excl. blank lines): ~4-10\n\n## 2020-12-05, Saturday, Day Ⅳ: Soul split and retrieval\n\nThe horcrux.. ehm.. secret has been cutted into 3 pieces!\nDownload [all files from here](https://berrendorf.inf.h-brs.de/~jmeng2m/ccc2020/day05/) and reconstruct the secret.\n\nHints:\n\u003e Reconstruction requires you to fetch and merge all strings. Doing so does not necessarily imply\n\u003e [loops](https://www.learnpython.org/en/Loops), although mastering loops might come in handy soon.\n\n\u003e It is not necessary to parse the site or its HTML code in Python, just manually\n\u003e search the site for links to files and then download these links within Python!\n\nLines of Code (excl. blank lines): ~8-10\n\n## 2020-12-06, Sunday, Day ᚏ: 🍟🍗🍸\n\nDamn, what a slaughterhouse 🔪⛑🌹🌷\nIt looks like this lunatic worked more thoroughly this time:\nOur daily secret has been splitted into dozens of pieces!\nDownload [all files from here](https://berrendorf.inf.h-brs.de/~jmeng2m/ccc2020/day06/) and reconstruct the secret!\n\nHints:\n\u003e Do use [loops](https://www.learnpython.org/en/Loops).\n\n\u003e It is not necessary to parse the site or its HTML code in Python, just manually\n\u003e search the site for links to files, look for repeating pattern(s) within the urls,\n\u003e write a loop to generate the urls in Python and then download these urls with Python!\n\nLines of Code (excl. blank lines): ~8-10\n\n## 2020-12-07, Monday, Day `b0110`: вєωαяє, ι αм ƒαη¢у!\n\nYou got mail! But.. (⊙_☉) ..wtf?\n\n```Python\n#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\nsecret = r'''\n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\nXS54bWxQSwUGAAAAAAkACQA8AgAAfA4AAAAA\n'''\n```\n\nTo make sense of this pile of byte junk,\nyou have to `base64`-decode variable `secret`\nand write its contents to a `*.docx` file.\nOpen this `*.docx` file in Word!\n\nHints:\n\u003e No further processing is required, just decode and write to disk.\n\n\u003e Use [Python's `with` statement](https://www.pythonforbeginners.com/files/with-statement-in-python),\n\u003e because it will automatically close the file.\n\nLines of Code (excl. blank lines): ~5-8\n\n## 2020-12-08, Tuesday, Day `b0111`: `¯\\(°_o)/¯`\n\nYou found a link:\n[`mysterious_hint.txt`](https://berrendorf.inf.h-brs.de/~jmeng2m/ccc2020/day08/mysterious_hint.txt).\nWhat now, Miss Marple?\n\nHints:\n\u003e 🌎📥🚪🔑📨\n\n\u003e You may use the `IPython Console`, which e.g. comes preinstalled with\n\u003e [`Spyder IDE`](http://docs.spyder-ide.org/develop/current/ipythonconsole.html),\n\u003e to execute and visualize Python code interactively.\n\u003e (`Spyder IDE` is bundled with [`Anaconda`](https://docs.anaconda.com/anaconda/user-guide/tasks/integration/spyder/))\n\nLines of Code (excl. blank lines): ~8-10\n\n## 2020-12-09, Wednesday, Day `b1000`: High priestess of the Temple of Apollo\n\nOur cheeky rascal did not leave any trace today. Hmm..\nLet us consult [Pythia](https://en.wikipedia.org/wiki/Pythia) aka the Oracle of Delphi!\n\nSend your `{'question': 'Where to find today\\'s suprise?'}` using `HTTP POST` to\n[`the oracle`](https://berrendorf.inf.h-brs.de/~jmeng2m/ccc2020/day09/oracle) and\n`print` the serve..eh..oracle's response!\n\nHints:\n\u003e Note, nowadays Pythia is speaking Python only, no ancient greek nor modern browser'ish!\n\n\u003e Making a request with [`Requests`](https://requests.readthedocs.io/en/master/user/quickstart/) is very simple.\n\nLines of Code (excl. blank lines): ~3-5\n\n## 2020-12-10, Thursday, Day `b1001`: Swarm intelligence\n\nDetective 👮‍, we found five individuals that witnessed how our criminal tried to hide his loot.\nDue to the corona situation, we'll have to do the questioning of the witnesses remotely.\n\nSend your `{'question': 'What did you see?'}` using `HTTP POST` to\n[all witnesses](https://berrendorf.inf.h-brs.de/~jmeng2m/ccc2020/day10/),\nfetch their responses and `print` your conclusion on this case.\n\nHints:\n\u003e You may combine your findings from Saturday and yesterday.\n\nLines of Code (excl. blank lines): ~8-10\n\n## 2020-12-11, Friday, Day X: Cold cases\n\nWe have to go through the [archive](https://berrendorf.inf.h-brs.de/~jmeng2m/ccc2020/day11/) and\nsearch all previous cases to find hints about where our kidnap victim (🍬) might have been taken to.\n\nGo `get` and `print` all criminal records, there must be something that leads us to today's crime scene!\n\nHints:\n\u003e Use `HTTP GET`, no `HTTP POST` required.\n\n\u003e Note, for security reasons access to our logs is granted via Python only. Browser access has been disabled!\n\nLines of Code (excl. blank lines): ~10-15\n\n## 2020-12-12, Saturday, Day B: Career Advancement\n\nYour combinatory proficiency and programming skills have been recognized by the federal intelligence service 🔫😎.\nYou have been asked to help with a mysterious message that was received from unknown origin.\n\n```Python\n#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\ncipher = [' ', ' ', ' ', ' ', ' ', ' ', 'a', 'a', 'b', 'c',\n          'c', 'd', 'd', 'e', 'e', 'e', 'e', 'e', 'e', 'e',\n          'e', 'h', 'h', 'i', 'i', 'i', 'l', 'l', 'm', 'n',\n          'n', 'n', 'n', 'r', 'r', 'r', 's', 't', 't', 't', 't']\nlookup_table = ( 2,  6, 16, 20, 24, 31, 10, 33, 32,  8,\n                11,  3, 21,  4, 14, 22, 26, 27, 29, 36,\n                39,  9, 12,  0, 18, 38, 15, 25, 17,  1,\n                23, 30, 40,  5, 28, 37,  7, 13, 19, 34, 35)\n```\n\nHints:\n\u003e No coding required! Use Pen and paper.\n\n\u003e Zero-based numbering, i.e. initial element of a sequence is assigned the index 0, rather than the index 1!\n\nLines of Code (excl. blank lines): 0\n\n## 2020-12-13, Sunday, Day C: First day at Bletchley Park\n\nYou have been asked to decipher yet another cryptic message:\n```Python\ncipher = [ 8, 13, 30,  3,  4,\n          17, 30, 10, 11,  4,\n           8, 13,  4, 13, 30,\n          15,  5,  0, 13, 13,\n           4, 30, 27,  1,  4,\n          17, 30,  3,  4, 12,\n          30, 10, 27,  7, 11,\n          18,  2,  7, 17,  0,\n          13, 10, 30,  8, 13,\n          30,  3,  4, 17, 30,\n          10, 27,  2,  7,  4 ]\n```\nWhich secret might be concealed within this cryptic message?!?\n\nMa'am, we just got a call from London!\nOur spies found a blueprint of the Enigma machine that was used to encrypt the above's secret:\n\n```Python\n#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n# TOP SECRET\n\ncleartext = 'classified information example'.lower()\n\n#       0    1    2    3    4    5    6    7    8    9   10\nabc = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',\n#      11   12   13   14   15   16   17   18   19   20   21\n       'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',\n#      22   23   24   25   26   27   28   29   30   31   32\n       'w', 'x', 'y', 'z', 'ö', 'ü', 'ä', 'ß', ' ', ',', '-']\n\ncipher = []\nfor c in cleartext:\n    idx = abc.index(c)\n    cipher.append(idx)\n\nprint(cipher)\n```\n\nFind out how this encryption machine works.\nManually apply all steps in reverse order to decrypt today's location in cleartext!\n\nHints:\n\n\u003e No coding required!\n\u003e Step through the code line by line to understand its internals.\n\u003e Lookup unknown function in the Python documentation,\n\u003e e.g. [More on Lists](https://docs.python.org/3/tutorial/datastructures.html#more-on-lists).\n\u003e Use pen and paper to track all variables inside and outside of the loop in a\n\u003e [table of values](https://de.wikipedia.org/wiki/Wertetabelle).\n\u003e Once you got an idea of the code, develop an inverse algorithm in pseudo code on paper,\n\u003e that rewinds all changes and recovers the original input!\n\n\u003e It is strongly recommended to use a debugger! This allows one to add breakpoints at arbitrary lines of code at which\n\u003e the program's execution flow will be interrupted, so that e.g. variable values at the current loop iteration can be\n\u003e inspected. [Spyder GUI has a debugger built-in](https://docs.spyder-ide.org/current/debugging.html).\n\n\u003e IF YOU'RE STUCK, THEN ASK YOUR CHIEF SCIENTIST NEXT DOOR!!!\n\nLines of Code (excl. blank lines): 0\n\n## 2020-12-14, Monday, Day D: Codebreakers\n\nMa'am, we intercepted another encrypted message:\n\n```Python\ncipher = [ 8, 12, 30, 11,  8,\n          13, 10,  4, 18, 19,\n           4, 13, 31, 30, 14,\n           1,  4, 17,  4, 13,\n          30, 18,  2,  7, 20,\n           7, 30,  0, 20,  5,\n          30,  3,  4, 13, 30,\n          18,  2,  7, 20,  7,\n          18,  2,  7, 17, 28,\n          13, 10,  4, 13, 30,\n           8, 12, 30, 10,  4,\n           11, 11, 4, 17 ]\n```\n\nBuild a decryption machine that applies all instructions of the Enigma machine in reverse order.\n\nHints:\n\u003e Codify your algorithm from yesterday!\n\n\u003e If you're stuck, use the enigma machine as a starting point.\n\u003e One possible way to write the inverse mechanism looks very much\n\u003e like the original enigma machine with just minor changes.\n\n\u003e IF YOU'RE STUCK, THEN ASK YOUR CHIEF SCIENTIST NEXT DOOR!!!\n\nLines of Code (excl. blank lines): 9-10\n\n## 2020-12-15, Tuesday, Day E: Multidimensional confusion\n\nGosh, darn it! The encryption machine has been enhanced from 1d to 2d:\n\n```Python\ncipher = [[0, 0], [6, 2], [1, 2], [10, 0],\n          [1, 0], [1, 1], [4, 0], [10, 0],\n          [4, 0], [0, 0], [2, 2], [2, 1],\n          [1, 1], [5, 2], [8, 1], [10, 0],\n          [2, 2], [4, 0], [10, 0], [1, 0],\n          [0, 0], [0, 2], [2, 1], [2, 0],\n          [1, 1], [6, 0], [0, 2], [2, 1],\n          [4, 2], [6, 0], [6, 0]]\n```\n\nFortunately, our mole among has not been revealed yet and\nmanaged to leak the blueprint of the second enigma revision as well:\n\n```Python\n#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n# TOP SECRET\n\nimport sys\n\ncleartext = 'classified information example'.lower()\n\nabc_2d = [# 0    1    2    j/i\n          ['a', 'b', 'c'], # 0\n          ['d', 'e', 'f'], # 1\n          ['g', 'h', 'i'], # 2\n          ['j', 'k', 'l'], # 3\n          ['m', 'n', 'o'], # 4\n          ['p', 'q', 'r'], # 5\n          ['s', 't', 'u'], # 6\n          ['v', 'w', 'x'], # 7\n          ['y', 'z', 'ö'], # 8\n          ['ü', 'ä', 'ß'], # 9\n          [' ', ',', '-']] # 10\n\ndef find_index(c, array2d):\n    height = len(array2d)\n    for i in range(height):\n        row = array2d[i]\n        width = len(row)\n        for j in range(width):\n            if array2d[i][j] == c:\n                return list([i, j])\n    return None\n\ncipher = []\nfor c in cleartext:\n    idx = find_index(c, abc_2d)\n    cipher.append(idx)\n\nprint(cipher)\n```\n\nHints:\n\u003e Zero-based numbering, i.e. initial element of a sequence is assigned the index 0, rather than the index 1!\n\n\u003e No coding required!\n\u003e Step through the code line by line to understand its internals.\n\u003e Lookup unknown function in the Python documentation,\n\u003e e.g. [More on Lists](https://docs.python.org/3/tutorial/datastructures.html#more-on-lists).\n\u003e Use pen and paper to track all variables inside and outside of the loop in a\n\u003e [table of values](https://de.wikipedia.org/wiki/Wertetabelle).\n\u003e Once you got an idea of the code, develop an inverse algorithm in pseudo code on paper,\n\u003e that rewinds all changes and recovers the original input!\n\n\u003e It is strongly recommended to use a debugger! This allows one to add breakpoints at arbitrary lines of code at which\n\u003e the program's execution flow will be interrupted, so that e.g. variable values at the current loop iteration can be\n\u003e inspected. [Spyder GUI has a debugger built-in](https://docs.spyder-ide.org/current/debugging.html).\n\n\u003e IF YOU'RE STUCK, THEN ASK YOUR CHIEF SCIENTIST NEXT DOOR!!!\n\nLines of Code (excl. blank lines): 0\n\n## 2020-12-16, Wednesday, Day F: The lull before the storm\n\nAfter four exhausting days abroad, helping out the federal intelligence service, you are glad to be back at your office.\nSitting in front of your desk, you are looking forward to some relaxing time for the rest of the week,\nwithout further adventures or surprises ☀️⛱️😎🌅\n\n*\\*Ping\\** You got mail! 📨\n\nA mail without any hint about the sender. Just a plain mail with a link to an\n[Excel sheet](https://berrendorf.inf.h-brs.de/~jmeng2m/ccc2020/day16/secret.xlsx).\nWhat could that be?\n\nOf course you cannot simply click on this link, too dangerous.\nUse Python library [`Pandas`](https://www.journaldev.com/33306/pandas-read_excel-reading-excel-file-in-python) to\nread and print this [Excel sheet `secret.xlsx`](https://berrendorf.inf.h-brs.de/~jmeng2m/ccc2020/day16/secret.xlsx).\n\nHints:\n\u003e [`Pandas` has support for various URL shemes built-in, e.g. `http`](\n    https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html).\n\u003e It is not necessary to download the Excel sheet with `urllib` or `requests` libraries.\n\n\u003e [To read Excel sheets with Pandas, install and use `openpyxl`](https://stackoverflow.com/a/65266270/6490710):\n\u003e In Anaconda run `%pip install openpyxl`, then pass `engine='openpyxl'` to `read_excel`.\n\n\u003e Optionally, pass `header=None` as an extra argument to `read_excel`, \n\u003e so `Pandas` won't use the first row for the column labels.\n\nLines of Code (excl. blank lines): ~3-5\n\n## 2020-12-17, Thursday, Day XVI: Pandas do lay eggs\n\nStill halfdozing, with freshly brewed tea ☕ in your left hand and stirring in your breakfast 🍯 with the other,\nyou are sitting in front of your computer 💻 and sift halfhearted through your mails 📥📬.\nSuddenly, a mail 📧 grabs your attention. It is empty except for a link to another\n[Excel sheet](https://berrendorf.inf.h-brs.de/~jmeng2m/ccc2020/day17/secret.xlsx).\nWhat is that? 🔐\n\nHints:\n\u003e You may download the spreadsheet with any browser.\n\n\u003e You may inspect the spreadsheet with e.g. Microsoft Excel.\n\n\u003e [To read Excel sheets with Pandas, install and use `openpyxl`](https://stackoverflow.com/a/65266270/6490710):\n\u003e In Anaconda run `%pip install openpyxl`, then pass `engine='openpyxl'` to `read_excel`.\n\n\u003e Pass `header=None` as an extra argument to\n\u003e [`read_excel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html),\n\u003e so `Pandas` won't use the first row for the column labels.\n\nLines of Code (excl. blank lines): ~8-10\n\n## 2020-12-18, Friday, Day XVII: Pythonic arms race\n\nFinally, friday is here!\nBefore enjoying your well-deserved vacation, you have a couple of hours left to ramp up your programming skills 🔧⚙️\nTwo days before you had to extract data from a single cell.\nYesterday the location string was split across a table row.\nThe next logical step is a two-dimensional array aka a full table with rows and columns 📈 📊\n\nDownload this [spreadsheet](https://berrendorf.inf.h-brs.de/~jmeng2m/ccc2020/day18/secret.xlsx) using any browser\nand open it in e.g. Microsoft Excel to inspect its contents. Use Python to concatenate all cell values into a single \none-dimensional array of characters aka a string and `base64`-decode it!\n\nHints:\n\u003e [`pandas.DataFrame.shape`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.shape.html)\n\u003e will return the dimensionality of the DataFrame.\n\n\u003e [`pandas.DataFrame.at`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.at.html) and/or\n\u003e [`pandas.DataFrame.iat`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iat.html)\n\u003e access a single value for a row/column label pair (`at`) or a row/column pair by integer position (`iat`).\n\n\u003e [To read Excel sheets with Pandas, install and use `openpyxl`](https://stackoverflow.com/a/65266270/6490710):\n\u003e In Anaconda run `%pip install openpyxl`, then pass `engine='openpyxl'` to `read_excel`.\n\n\u003e Pass `header=None` as an extra argument to\n\u003e [`read_excel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html),\n\u003e so `Pandas` won't use the first row for the column labels.\n\n\u003e Many roads lead to rome.\n\u003e You could use loop(s) with [`at`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.at.html)\n\u003e /[`iat`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iat.html) to iterate over\n\u003e the DataFrame's 2d array. Or you could use a more functional style of programming using\n\u003e [`to_numpy`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html),\n\u003e [`flatten`](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.flatten.html) and\n\u003e [`join`](https://stackoverflow.com/a/4481731/6490710). Or you could come up with a completely different approach.\n\nLines of Code (excl. blank lines): ~5-13\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjm1%2Fcode-cracker-curriculum-2020","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjm1%2Fcode-cracker-curriculum-2020","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjm1%2Fcode-cracker-curriculum-2020/lists"}