{"id":35018528,"url":"https://github.com/treejamie/hackerrank-90days","last_synced_at":"2026-04-13T10:32:26.895Z","repository":{"id":273046163,"uuid":"918552391","full_name":"treejamie/hackerrank-90days","owner":"treejamie","description":"I'm using these challenges as a means to further my Python \u0026 Elixir skills and to assist me in learning Go and TypeScript.","archived":false,"fork":false,"pushed_at":"2025-04-22T13:53:47.000Z","size":1039,"stargazers_count":0,"open_issues_count":25,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-22T14:46:32.389Z","etag":null,"topics":["elixir","go","python","typescript"],"latest_commit_sha":null,"homepage":"https://www.hackerrank.com/interview/preparation-kits/three-month-preparation-kit","language":"Python","has_issues":true,"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/treejamie.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-01-18T08:19:04.000Z","updated_at":"2025-04-22T13:53:49.000Z","dependencies_parsed_at":"2025-04-22T14:44:57.130Z","dependency_job_id":null,"html_url":"https://github.com/treejamie/hackerrank-90days","commit_stats":null,"previous_names":["treejamie/hackerrank-90days"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/treejamie/hackerrank-90days","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/treejamie%2Fhackerrank-90days","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/treejamie%2Fhackerrank-90days/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/treejamie%2Fhackerrank-90days/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/treejamie%2Fhackerrank-90days/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/treejamie","download_url":"https://codeload.github.com/treejamie/hackerrank-90days/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/treejamie%2Fhackerrank-90days/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31749061,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T09:16:15.125Z","status":"ssl_error","status_checked_at":"2026-04-13T09:16:05.023Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["elixir","go","python","typescript"],"created_at":"2025-12-27T05:36:19.904Z","updated_at":"2026-04-13T10:32:26.889Z","avatar_url":"https://github.com/treejamie.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Tests](https://github.com/treejamie/hackerrank-90days/actions/workflows/test.yml/badge.svg)](https://github.com/treejamie/hackerrank-90days/actions/workflows/test.yml)\n\n# [HackerRank 90 Days](https://www.hackerrank.com/interview/preparation-kits/three-month-preparation-kit/three-month-week-three/challenges)\n\nThis repo’s layout isn’t idiomatic to any one language — it’s a mix of Elixir, Go, Python, and TypeScript.\n\n## Quality\n\nWhen I first started these challenges, I was in a teaching job and I was completing them between classes and during times when my students had been tasked and was literally doing nothing. These challenges go all the way up to week 4/5. These are not my best work, I was more interested in making stuff work.  However, when I quit the teaching job and was able to sit down and focus on quality, I started everything again. I went over the week one python work and moved everything to a standard that any colleage, customer or employer would be more than happy with. \n\nSo below is a table of challenges that I consider to be complete, and to have been completed to a high professional standard that you'd expect from any work I was doing. Inline docs, testing, linting, static code analysis, CI/ CD etc.  Each PR for each challenge is listed below. If it's not in this table and it's in the repo, consider it a working draft of my thoughts.\n\n\n### Week 1\n\n| |                                | Python                  | Elixir                  | TypeScript    | Go    |\n|-|-                               |-                        |-                        |-              |-      |  \n| W1/1| [Plus Minus][c11]          |[![PR](img/pr.svg)][11py]|[![PR](img/pr.svg)][11ex]|     ➖        |[![PR](img/pr.svg)][11go]|  \n| W1/2| [Mini Max Sum][c12]        |[![PR](img/pr.svg)][12py]|[![PR](img/pr.svg)][12ex]|     ➖        |[![PR](img/pr.svg)][11go]|  \n| W1/3| [Time Conversion][c13]     |[![PR](img/pr.svg)][13py]|[![PR](img/pr.svg)][13ex]|[![PR](img/pr.svg)][13ts]|[![PR](img/pr.svg)][11go]|  \n| W1/4| [Breaking Records][c14]    |[![PR](img/pr.svg)][14py]|[![PR](img/pr.svg)][14ex]|     ➖        |   ➖   |  \n| W1/5| [Camel Case][c15]          |[![PR](img/pr.svg)][15py]|[![PR](img/pr.svg)][15ex]|     ➖        |   ➖   |  \n| W1/6| [Divisible Sum Pairs][c16] |[![PR](img/pr.svg)][16py]|[![PR](img/pr.svg)][16ex]|     ➖        |   ➖   |  \n| W1/7| [Sparse Array][c17]        |[![PR](img/pr.svg)][17py]|[![PR](img/pr.svg)][17ex]|     ➖        |   ➖   |  \n\n[11py]: https://github.com/treejamie/hackerrank-90days/pull/108\n[12py]: https://github.com/treejamie/hackerrank-90days/pull/108\n[13py]: https://github.com/treejamie/hackerrank-90days/pull/109\n[14py]: https://github.com/treejamie/hackerrank-90days/pull/111\n[15py]: https://github.com/treejamie/hackerrank-90days/pull/113\n[16py]: https://github.com/treejamie/hackerrank-90days/pull/114\n[17py]: https://github.com/treejamie/hackerrank-90days/pull/115\n\n[11ex]: https://github.com/treejamie/hackerrank-90days/pull/103\n[12ex]: https://github.com/treejamie/hackerrank-90days/pull/138\n[13ex]: https://github.com/treejamie/hackerrank-90days/pull/141\n[14ex]: https://github.com/treejamie/hackerrank-90days/pull/142\n[15ex]: https://github.com/treejamie/hackerrank-90days/pull/148\n[16ex]: https://github.com/treejamie/hackerrank-90days/pull/151\n[17ex]: https://github.com/treejamie/hackerrank-90days/pull/152\n\n[11ts]: #\n[12ts]: #\n[13ts]: https://github.com/treejamie/hackerrank-90days/pull/136\n[14ts]: #\n[15ts]: #\n[16ts]: #\n[17ts]: #\n\n[11go]: https://github.com/treejamie/hackerrank-90days/pull/102\n[12go]: https://github.com/treejamie/hackerrank-90days/pull/105\n[13go]: https://github.com/treejamie/hackerrank-90days/pull/147\n[14go]: #\n[15go]: #\n[16go]: #\n[17go]: #\n\n### Week 2\n\nI'll update this README with week two once I've completed all the challenges in all the languages from week one.\n\n\nSpot something I could improve? Open an issue and point it out — that would be swell.\n\n## 🙋 Why?\n\nThe HackerRank 90-day course was designed as a three-month prep for recruitment pipelines. Whilst I started out with that intention, I’m not using it for that purpose anymore (_at least not directly_). I’m using it to apply my Python and Elixir knowledge to scaffold my development in Go and TypeScript.\n\nWhat I’m noticing, though, is that it’s also improving my authoring skills more broadly.\n\nI started in January. At first, I just wanted to get through it in Python — a collection of scripts to store solutions. Then I added per-file unit testing. Then I started doing the challenges in different languages, and it evolved from there. Now it’s basically a code dojo for me, where I’m working through each challenge in each language. I'm learning a lot. Especially about parsing text files (_test cases_).\n\nI’ll be very pleased if I complete these challenges by the end of 2025 in four languages: Python, Elixir, Go, and TypeScript. The aim is to get a nice 25% language distribution across the repository and to demonstrate competence in basic project layout, standard libraries, testing methodologies, and — most importantly — low-complexity solutions.\n\nFor example, many challenges can be solved easily with an `O(n^2)` approach, but HackerRank will timeout when you submit inefficient code. That’s a great forcing function — you’re not allowed to be lazy.\n\n## 🧱 Structure\n\nThe project is structured by **weeks**, not by language. That is: none of the projects follow idiomatic layouts for their respective languages.\n\nEach week has a folder named `w1`, `w2`, etc. Inside each is a `tc` (_test cases_) folder, which contains test files in a very specific format. For example, here’s the test case data for a made-up challenge where you’re given two integers and must sum them. Arguments are separated from expected output by two blank lines:\n\n```plaintext\n1 2\n\n3\n```\n\nThis format ensures each challenge across all languages consumes the same input/output.\n\n## 📅 Three Months?\n\nThis course was meant to be three months long, but I’m not treating it that way. Technically, you’re supposed to use HackerRank’s interface to author your code — but that’s a horrific experience.\n\nIf I finish all the challenges in four languages by the end of 2025, I’ll be very pleased.\n\n## 😱 Idiomaticity\n\n(_I made that word up_)\n\nThis repository is a mix of several languages, and I’ve prioritized their coexistence over idiomatic project layout. For example, the Elixir code isn’t structured like a proper Mix project — same with TypeScript, Python, and Go.\n\nThe point is to compare approaches side by side, not to build polished, standalone apps.\n\nThat said, I still try to write idiomatic code within each language’s norms.\n\n## 🤖 LLM usage\n\n### Code\n\nNone of the challenge solutions are directly written by AI. I do use LLMs while coding — they’re great scaffolds for learning.\n\n### Documentation \u0026 Comments\n\nMost comments were written by me and then passed through an LLM to make them more succinct. I tend to be overly wordy — LLMs are great at \"neutral speak\".\n\n\n## ✅ Test \u0026 Quality\n\n### Elixir\n\nThere are two quality checks ran on the challenges -  tests and static analysis.\n\nTests are handled with ExUnit:\n\n```bash\nmix test w*\n```\n\nStatic analysis is done with Dialyzer:\n\n```bash\nmix compile\nmix dialyzer\n```\n\nThe main aim of using dialyzer is to get some practice in with being clear about `@spec`.\n\n### Go\n\n```bash\ncd w1\ngo test -v\n```\n\n### TypeScript\n\n```bash\npnpm vitest run\n```\n\n\n### Python\n\n```bash\npython -m unittest -v  */*_test.py\n```\n\n\n\n[c11]: https://www.hackerrank.com/challenges/three-month-preparation-kit-plus-minus/problem?isFullScreen=true\u0026h_l=interview\u0026playlist_slugs%5B%5D=preparation-kits\u0026playlist_slugs%5B%5D=three-month-preparation-kit\u0026playlist_slugs%5B%5D=three-month-week-one\n[c12]: https://www.hackerrank.com/challenges/three-month-preparation-kit-mini-max-sum/problem?h_l=interview\u0026isFullScreen=true\u0026playlist_slugs%5B%5D%5B%5D=preparation-kits\u0026playlist_slugs%5B%5D%5B%5D=three-month-preparation-kit\u0026playlist_slugs%5B%5D%5B%5D=three-month-week-one\n[c13]: https://www.hackerrank.com/challenges/three-month-preparation-kit-time-conversion/problem?h_l=interview\u0026isFullScreen=true\u0026playlist_slugs%5B%5D%5B%5D=preparation-kits\u0026playlist_slugs%5B%5D%5B%5D=three-month-preparation-kit\u0026playlist_slugs%5B%5D%5B%5D=three-month-week-one\n[c14]: https://www.hackerrank.com/challenges/three-month-preparation-kit-breaking-best-and-worst-records/problem?h_l=interview\u0026isFullScreen=true\u0026playlist_slugs%5B%5D%5B%5D=preparation-kits\u0026playlist_slugs%5B%5D%5B%5D=three-month-preparation-kit\u0026playlist_slugs%5B%5D%5B%5D=three-month-week-one\n[c15]: https://www.hackerrank.com/challenges/three-month-preparation-kit-camel-case/problem?h_l=interview\u0026isFullScreen=true\u0026playlist_slugs%5B%5D%5B%5D=preparation-kits\u0026playlist_slugs%5B%5D%5B%5D=three-month-preparation-kit\u0026playlist_slugs%5B%5D%5B%5D=three-month-week-one\n[c16]: https://www.hackerrank.com/challenges/three-month-preparation-kit-divisible-sum-pairs/problem?h_l=interview\u0026isFullScreen=true\u0026playlist_slugs%5B%5D%5B%5D=preparation-kits\u0026playlist_slugs%5B%5D%5B%5D=three-month-preparation-kit\u0026playlist_slugs%5B%5D%5B%5D=three-month-week-one\n[c17]: https://www.hackerrank.com/challenges/three-month-preparation-kit-sparse-arrays/problem?h_l=interview\u0026isFullScreen=true\u0026playlist_slugs%5B%5D%5B%5D=preparation-kits\u0026playlist_slugs%5B%5D%5B%5D=three-month-preparation-kit\u0026playlist_slugs%5B%5D%5B%5D=three-month-week-one","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftreejamie%2Fhackerrank-90days","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftreejamie%2Fhackerrank-90days","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftreejamie%2Fhackerrank-90days/lists"}