AlexAegis/advent-of-code

View on GitHub
readme.md

Summary

Maintainability
Test Coverage
# [Advent of Code](https://adventofcode.com/)

[![typescript ci](https://github.com/AlexAegis/advent-of-code/actions/workflows/cicd.yml/badge.svg)](https://github.com/AlexAegis/advent-of-code/actions/workflows/cicd.yml)
[![rust ci](https://github.com/AlexAegis/advent-of-code/actions/workflows/rust.yml/badge.svg)](https://github.com/AlexAegis/advent-of-code/actions/workflows/rust.yml)
[![python ci](https://github.com/AlexAegis/advent-of-code/actions/workflows/python.yml/badge.svg)](https://github.com/AlexAegis/advent-of-code/actions/workflows/python.yml)

[![Codacy Badge](https://app.codacy.com/project/badge/Grade/b135807698614bf19dab83afeac9bd15)](https://www.codacy.com/gh/AlexAegis/advent-of-code/dashboard?utm_source=github.com&utm_medium=referral&utm_content=AlexAegis/advent-of-code&utm_campaign=Badge_Grade)
[![Maintainability](https://api.codeclimate.com/v1/badges/5df3d3d67dfe389dc929/maintainability)](https://codeclimate.com/github/AlexAegis/advent-of-code/maintainability)
[![Test Coverage](https://api.codeclimate.com/v1/badges/5df3d3d67dfe389dc929/test_coverage)](https://codeclimate.com/github/AlexAegis/advent-of-code/test_coverage)
[![codecov](https://img.shields.io/codecov/c/github/AlexAegis/advent-of-code.svg?label=node%20coverage)](https://codecov.io/gh/AlexAegis/advent-of-code)
[![Coverage Status](https://img.shields.io/coveralls/github/AlexAegis/advent-of-code.svg?label=rust%20coverage)](https://coveralls.io/github/AlexAegis/advent-of-code?branch=master)

[![Last commit on GitHub](https://img.shields.io/github/last-commit/AlexAegis/advent-of-code.svg)](https://github.com/AlexAegis/advent-of-code)
[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier)

> This is a multi-language repository, for easy usage, all of them share the
> same root level. You need to individually set up each language you wish to
> use.

## Usage

The repository does not contain task inputs as my own inputs are located in a
private repository. If you wish to use this repository with your own inputs
provide them in the following folder structure:

```sh
resources
├── 2015
│   ├── 01
│   │   └── input.txt
│   ├── 02
│   │   └── input.txt
│   │  ...
│   └── 25
│       └── input.txt
│   ...
└── 2023
    ├── 01
    │   ├── example.1.txt
    │   ├── example.2.txt
    │   └── input.txt
    │  ...
    └── 25
        └── input.txt
```

### Cloning

> Reference for myself, cloning with my private inputs

```sh
git clone --recurse-submodules -j8 git@github.com:AlexAegis/advent-of-code.git
```

[Why and how](#working-with-private-files)

## [TypeScript](./solutions/typescript)

[![2023 TypeScript Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/typescript/2023.json)](/solutions/typescript/2023/)
[![2022 TypeScript Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/typescript/2022.json)](/solutions/typescript/2022/)
[![2021 TypeScript Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/typescript/2021.json)](/solutions/typescript/2021/)
[![2020 TypeScript Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/typescript/2020.json)](/solutions/typescript/2020/)
[![2019 TypeScript Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/typescript/2019.json)](/solutions/typescript/2019/)
[![2018 TypeScript Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/typescript/2018.json)](/solutions/typescript/2018/)
[![2017 TypeScript Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/typescript/2017.json)](/solutions/typescript/2017/)
[![2016 TypeScript Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/typescript/2016.json)](/solutions/typescript/2016/)
[![2015 TypeScript Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/typescript/2015.json)](/solutions/typescript/2015/)

### Setup TypeScript workspace

Install latest stable `node` and `pnpm`

```sh
pnpm install
```

### Running individual TypeScript solutions

```sh
# Navigate to the solution
cd solutions/typescript/2023/01
pnpm p1
pnpm p2
```

### Debugging TypeScript solutions using VS Code

Open the solutions file, then run the `[TS] Current File` debug profile.

### Testing all TypeScript solutions

```sh
pnpm test
```

### Testing individual TypeScript solutions

```sh
# Navigate to the solution
cd solutions/typescript/2023/01
pnpm test
```

### Benchmarking individual TypeScript solutions

```sh
# Navigate to the solution
cd solutions/typescript/2023/01
pnpm bench
```

### Linting all TypeScript solutions

```sh
pnpm lint
```

### Linting individual TypeScript solutions

```sh
# Navigate to the solution
cd solutions/typescript/2023/01
pnpm lint:tsc
pnpm lint:es
pnpm lint:format
```

## [Rust](./solutions/rust)

[![2023 Rust Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/rust/2023.json)](/solutions/rust/2023/)
[![2022 Rust Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/rust/2022.json)](/solutions/rust/2022/)
[![2021 Rust Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/rust/2021.json)](/solutions/rust/2021/)
[![2020 Rust Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/rust/2020.json)](/solutions/rust/2020/)
[![2019 Rust Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/rust/2019.json)](/solutions/rust/2019/)
[![2018 Rust Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/rust/2018.json)](/solutions/rust/2018/)
[![2017 Rust Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/rust/2017.json)](/solutions/rust/2017/)
[![2016 Rust Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/rust/2016.json)](/solutions/rust/2016/)
[![2015 Rust Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/rust/2015.json)](/solutions/rust/2015/)

## [Python](./solutions/python)

[![2023 Python Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/python/2023.json)](/solutions/python/year2023/)
[![2022 Python Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/python/2022.json)](/solutions/python/year2022/)
[![2021 Python Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/python/2021.json)](/solutions/python/year2021/)
[![2020 Python Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/python/2020.json)](/solutions/python/year2020/)
[![2019 Python Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/python/2019.json)](/solutions/python/year2019/)
[![2018 Python Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/python/2018.json)](/solutions/python/year2018/)
[![2017 Python Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/python/2017.json)](/solutions/python/year2017/)
[![2016 Python Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/python/2016.json)](/solutions/python/year2016/)
[![2015 Python Progress](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/AlexAegis/advent-of-code/master/.github/badges/python/2015.json)](/solutions/python/year2015/)

### Setup Python workspace

Install latest stable `python` and `pipenv`

```sh
pipenv install
pipenv shell
```

## Working with private files

If you wish to replicate the same input setup that I have so that it's compliant
with [Advent of Code](https://adventofcode.com/)'s rules, you should not keep
your inputs in a publicly hosted repository. I think the best solution to this
is to keep them in a private submodule, keeping your inputs private, but your
solutions public and keeping your CI happy and operational.

### Why?

See the _"Can I copy/redistribute part of Advent of Code?"_ section at
<https://adventofcode.com/2023/about>

### How?

1. Collect your input files into a new "advent-of-code-inputs" repository

2. Get a fresh clone of your repository!

3. [Install `git-filter-repo`](https://github.com/newren/git-filter-repo/blob/main/INSTALL.md)

   > You will completely rewrite your repository's history, so first educate
   > yourself on how
   > [`git-filter-repo`](https://github.com/newren/git-filter-repo) works. (The
   > tool you might find for this first is the BFG Repo cleaner, however
   > git-filter-repo is much more capable and can clean out huge repositories in
   > just milliseconds.)

4. Clean out the repository:
   `git filter-repo --invert-paths --path-glob '*.txt' --path inputs`

   > This is just an example command, add more globs or paths if needed

5. Verify that apart from the unwanted files everything is in order. Check older
   commits too!

   > Maybe in previous years you stored these files differently, and/or you
   > refactored them at some point!

6. Add back your inputs as a git submodule:

   ```sh
   git submodule add git@github.com:AlexAegis/advent-of-code-inputs.git resources
   git commit -m 'added inputs submodule'
   ```

7. Adjust your CI so that it checks out submodules too.

   > If you're using GitHub Actions and actions/checkout:

   ```yaml
   - name: checkout
     uses: actions/checkout@v4
     with:
       fetch-depth: 1
       submodules: true
   ```

8. Verify if everything works locally

9. If everything looks right, re-add your remote and force push the changes.
   (Since you started with a fresh clone, your old can be used to restore it if
   anything goes wrong at any point)

   ```sh
   git remote add origin git@github.com:AlexAegis/advent-of-code.git
   git push --force
   ```

10. Clean out remaining branches by either force pushing them too or just
    removing them.

## Disclaimer

[Advent of Code](https://adventofcode.com/) is made by
[Eric Wastl](http://was.tl/).