├── .appends └── .github │ └── labels.yml ├── .gitattributes ├── .github ├── CODEOWNERS ├── labels.yml └── workflows │ ├── ci.yml │ ├── configlet.yml │ ├── no-important-files-changed.yml │ ├── ping-cross-track-maintainers-team.yml │ ├── pr.yml │ └── sync-labels.yml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── HOWTO-port-an-exercise.md ├── LICENSE ├── README.md ├── bin ├── ci ├── fetch-configlet ├── fetch-configlet.ps1 ├── pr ├── validate_exercises └── validate_one_exercise ├── concepts ├── .keep ├── TODO.md ├── fundamentals │ ├── .meta │ │ └── config.json │ ├── about.md │ ├── introduction.md │ └── links.json ├── nums-strs │ ├── .meta │ │ └── config.json │ ├── about.md │ ├── introduction.md │ └── links.json └── patterns │ ├── .meta │ └── config.json │ ├── about.md │ ├── introduction.md │ └── links.json ├── config.json ├── docs ├── ABOUT.md ├── INSTALLATION.md ├── LEARNING.md ├── RESOURCES.md ├── SNIPPET.txt ├── TESTS.md └── config.json └── exercises ├── .keep ├── concept ├── basics │ ├── .docs │ │ ├── hints.md │ │ ├── instructions.md │ │ ├── introduction.md │ │ └── introduction.md.tpl │ ├── .meta │ │ ├── config.json │ │ ├── design.md │ │ └── exemplar.sh │ ├── basics.sh │ ├── bats-extra.bash │ ├── passwd │ └── test-basics.bats └── simple-report │ ├── .docs │ ├── hints.md │ ├── instructions.md │ ├── introduction.md │ └── introduction.md.tpl │ ├── .meta │ ├── config.json │ ├── design.md │ └── exemplar.awk │ ├── bats-extra.bash │ ├── input.csv │ ├── simple-report.awk │ └── test-simple-report.bats ├── practice ├── .keep ├── acronym │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── acronym.awk │ ├── bats-extra.bash │ └── test-acronym.bats ├── affine-cipher │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── affine-cipher.awk │ ├── bats-extra.bash │ └── test-affine-cipher.bats ├── all-your-base │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── all-your-base.awk │ ├── bats-extra.bash │ └── test-all-your-base.bats ├── allergies │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── allergies.awk │ ├── bats-extra.bash │ └── test-allergies.bats ├── anagram │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── anagram.awk │ ├── bats-extra.bash │ └── test-anagram.bats ├── armstrong-numbers │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── armstrong-numbers.awk │ ├── bats-extra.bash │ └── test-armstrong-numbers.bats ├── atbash-cipher │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── atbash-cipher.awk │ ├── bats-extra.bash │ └── test-atbash-cipher.bats ├── automated-readability-index │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ └── example.awk │ ├── automated-readability-index.awk │ ├── bats-extra.bash │ └── test-automated-readability-index.bats ├── beer-song │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── beer-song.awk │ └── test-beer-song.bats ├── binary-search │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── binary-search.awk │ └── test-binary-search.bats ├── bob │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── bob.awk │ └── test-bob.bats ├── book-store │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── book-store.awk │ └── test-book-store.bats ├── bottle-song │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── bottle-song.awk │ └── test-bottle-song.bats ├── bowling │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── bowling.awk │ └── test-bowling.bats ├── change │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── change.awk │ └── test-change.bats ├── clock │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── clock.awk │ └── test-clock.bats ├── collatz-conjecture │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── collatz-conjecture.awk │ └── test-collatz-conjecture.bats ├── crypto-square │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── crypto-square.awk │ └── test-crypto-square.bats ├── darts │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── darts.awk │ └── test-darts.bats ├── diamond │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── diamond.awk │ └── test-diamond.bats ├── difference-of-squares │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── difference-of-squares.awk │ └── test-difference-of-squares.bats ├── eliuds-eggs │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── pop-count.awk │ └── test-pop-count.bats ├── etl │ ├── .docs │ │ ├── instructions.append.md │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── etl.awk │ └── test-etl.bats ├── food-chain │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── food-chain.awk │ └── test-food-chain.bats ├── forth │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── forth.awk │ └── test-forth.bats ├── gigasecond │ ├── .docs │ │ ├── instructions.append.md │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── gigasecond.awk │ └── test-gigasecond.bats ├── grade-school │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── grade-school.awk │ └── test-grade-school.bats ├── grains │ ├── .docs │ │ ├── instructions.append.md │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── grains.awk │ └── test-grains.bats ├── grep │ ├── .docs │ │ ├── instructions.append.md │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── grep.awk │ └── test-grep.bats ├── hamming │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── hamming.awk │ └── test-hamming.bats ├── hello-world │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── hello-world.awk │ └── test-hello-world.bats ├── high-scores │ ├── .docs │ │ ├── instructions.append.md │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── high-scores.awk │ └── test-high-scores.bats ├── house │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── house.awk │ └── test-house.bats ├── isogram │ ├── .docs │ │ ├── instructions.append.md │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── isogram.awk │ └── test-isogram.bats ├── killer-sudoku-helper │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── killer-sudoku-helper.awk │ └── test-killer-sudoku-helper.bats ├── kindergarten-garden │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── kindergarten-garden.awk │ └── test-kindergarten-garden.bats ├── knapsack │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── knapsack.awk │ └── test-knapsack.bats ├── largest-series-product │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── largest-series-product.awk │ └── test-largest-series-product.bats ├── leap │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── leap.awk │ └── test-leap.bats ├── list-ops │ ├── .docs │ │ ├── instructions.append.md │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── array-utils.awk │ ├── bats-extra.bash │ ├── list-ops.awk │ └── test-list-ops.bats ├── luhn │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── luhn.awk │ └── test-luhn.bats ├── matching-brackets │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── matching-brackets.awk │ └── test-matching-brackets.bats ├── matrix │ ├── .docs │ │ ├── instructions.append.md │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── matrix.awk │ └── test-matrix.bats ├── mazy-mice │ ├── .docs │ │ ├── hints.md │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ └── example.awk │ ├── bats-extra.bash │ ├── mazy-mice.awk │ ├── test-maze.awk │ └── test-mazy-mice.bats ├── meetup │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── meetup.awk │ └── test-meetup.bats ├── minesweeper │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── minesweeper.awk │ └── test-minesweeper.bats ├── nth-prime │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── nth-prime.awk │ └── test-nth-prime.bats ├── ocr-numbers │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── ocr-numbers.awk │ └── test-ocr-numbers.bats ├── pangram │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── pangram.awk │ └── test-pangram.bats ├── pascals-triangle │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── pascals-triangle.awk │ └── test-pascals-triangle.bats ├── phone-number │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── phone-number.awk │ └── test-phone-number.bats ├── pig-latin │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── pig-latin.awk │ └── test-pig-latin.bats ├── poker │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── poker.awk │ └── test-poker.bats ├── prime-factors │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── prime-factors.awk │ └── test-prime-factors.bats ├── protein-translation │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── protein-translation.awk │ └── test-protein-translation.bats ├── proverb │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── proverb.awk │ └── test-proverb.bats ├── pythagorean-triplet │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── pythagorean-triplet.awk │ └── test-pythagorean-triplet.bats ├── queen-attack │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── queen-attack.awk │ └── test-queen-attack.bats ├── raindrops │ ├── .docs │ │ ├── instructions.append.md │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── raindrops.awk │ └── test-raindrops.bats ├── rectangles │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── rectangles.awk │ └── test-rectangles.bats ├── resistor-color-duo │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── resistor-color-duo.awk │ └── test-resistor-color-duo.bats ├── resistor-color-trio │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── resistor-color-trio.awk │ └── test-resistor-color-trio.bats ├── reverse-string │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── reverse-string.awk │ └── test-reverse-string.bats ├── rna-transcription │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── rna-transcription.awk │ └── test-rna-transcription.bats ├── robot-simulator │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── robot-simulator.awk │ └── test-robot-simulator.bats ├── roman-numerals │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── roman-numerals.awk │ └── test-roman-numerals.bats ├── rotational-cipher │ ├── .docs │ │ ├── instructions.append.md │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── rotational-cipher.awk │ └── test-rotational-cipher.bats ├── run-length-encoding │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── run-length-encoding.awk │ └── test-run-length-encoding.bats ├── saddle-points │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── saddle-points.awk │ └── test-saddle-points.bats ├── say │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── say.awk │ └── test-say.bats ├── scrabble-score │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── scrabble-score.awk │ └── test-scrabble-score.bats ├── secret-handshake │ ├── .docs │ │ ├── instructions.append.md │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── secret-handshake.awk │ └── test-secret-handshake.bats ├── series │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── series.awk │ └── test-series.bats ├── sieve │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── sieve.awk │ └── test-sieve.bats ├── simple-cipher │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── simple-cipher.awk │ └── test-simple-cipher.bats ├── space-age │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── space-age.awk │ └── test-space-age.bats ├── spiral-matrix │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── spiral-matrix.awk │ └── test-spiral-matrix.bats ├── sum-of-multiples │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── sum-of-multiples.awk │ └── test-sum-of-multiples.bats ├── tournament │ ├── .docs │ │ ├── instructions.append.md │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── test-tournament.bats │ └── tournament.awk ├── triangle │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── test-triangle.bats │ └── triangle.awk ├── two-bucket │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── test-two-bucket.bats │ └── two-bucket.awk ├── two-fer │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── test-two-fer.bats │ └── two-fer.awk ├── variable-length-quantity │ ├── .docs │ │ ├── hints.md │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── test-variable-length-quantity.bats │ └── variable-length-quantity.awk ├── word-count │ ├── .docs │ │ ├── instructions.md │ │ └── introduction.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── test-word-count.bats │ └── word-count.awk ├── wordy │ ├── .docs │ │ └── instructions.md │ ├── .meta │ │ ├── config.json │ │ ├── example.awk │ │ └── tests.toml │ ├── bats-extra.bash │ ├── test-wordy.bats │ └── wordy.awk └── yacht │ ├── .docs │ ├── instructions.md │ └── introduction.md │ ├── .meta │ ├── config.json │ ├── example.awk │ └── tests.toml │ ├── bats-extra.bash │ ├── test-yacht.bats │ └── yacht.awk └── shared └── .docs ├── help.md └── tests.md /.appends/.github/labels.yml: -------------------------------------------------------------------------------- 1 | # ----------------------------------------------------------------------------------------- # 2 | # These are the repository-specific labels that augment the Exercise-wide labels defined in # 3 | # https://github.com/exercism/org-wide-files/blob/main/global-files/.github/labels.yml. # 4 | # ----------------------------------------------------------------------------------------- # 5 | 6 | - name: "duplicate" 7 | description: "" 8 | color: "cccccc" 9 | 10 | - name: "enhancement" 11 | description: "" 12 | color: "84b6eb" 13 | 14 | - name: "invalid" 15 | description: "" 16 | color: "e6e6e6" 17 | 18 | - name: "needs maintainer" 19 | description: "" 20 | color: "fc2929" 21 | 22 | - name: "new track" 23 | description: "" 24 | color: "159818" 25 | 26 | - name: "question" 27 | description: "" 28 | color: "cc317c" 29 | 30 | - name: "wontfix" 31 | description: "" 32 | color: "ffffff" 33 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # Code owners 2 | .github/CODEOWNERS @exercism/maintainers-admin 3 | 4 | # Changes to `fetch-configlet` should be made in the `exercism/configlet` repo 5 | bin/fetch-configlet @exercism/maintainers-admin 6 | bin/fetch-configlet.ps1 @exercism/maintainers-admin 7 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | # Run all tests for commits to master 2 | 3 | name: AWK / main 4 | 5 | on: 6 | push: 7 | branches: 8 | - main 9 | 10 | jobs: 11 | ci: 12 | runs-on: ubuntu-24.04 13 | 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 17 | 18 | - name: Install software 19 | run: sudo apt update && sudo apt -y install gawk bats 20 | # bats v1.10.0 -- https://launchpad.net/ubuntu/noble/+source/bats 21 | # gawk v5.2.1 -- https://launchpad.net/ubuntu/noble/+source/gawk 22 | 23 | - name: Run tests for all exercises 24 | run: bash bin/ci 25 | -------------------------------------------------------------------------------- /.github/workflows/configlet.yml: -------------------------------------------------------------------------------- 1 | name: Configlet 2 | 3 | on: 4 | pull_request: 5 | push: 6 | branches: 7 | - main 8 | workflow_dispatch: 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | configlet: 15 | uses: exercism/github-actions/.github/workflows/configlet.yml@main 16 | -------------------------------------------------------------------------------- /.github/workflows/no-important-files-changed.yml: -------------------------------------------------------------------------------- 1 | name: No important files changed 2 | 3 | on: 4 | pull_request_target: 5 | types: [opened] 6 | branches: [main] 7 | paths: 8 | - "exercises/concept/**" 9 | - "exercises/practice/**" 10 | - "!exercises/*/*/.approaches/**" 11 | - "!exercises/*/*/.articles/**" 12 | - "!exercises/*/*/.docs/**" 13 | - "!exercises/*/*/.meta/**" 14 | 15 | permissions: 16 | pull-requests: write 17 | 18 | jobs: 19 | check: 20 | uses: exercism/github-actions/.github/workflows/check-no-important-files-changed.yml@main 21 | with: 22 | repository: ${{ github.event.pull_request.head.repo.owner.login }}/${{ github.event.pull_request.head.repo.name }} 23 | ref: ${{ github.head_ref }} 24 | -------------------------------------------------------------------------------- /.github/workflows/ping-cross-track-maintainers-team.yml: -------------------------------------------------------------------------------- 1 | name: Ping cross-track maintainers team 2 | 3 | on: 4 | pull_request_target: 5 | types: 6 | - opened 7 | 8 | permissions: 9 | pull-requests: write 10 | 11 | jobs: 12 | ping: 13 | if: github.repository_owner == 'exercism' # Stops this job from running on forks 14 | uses: exercism/github-actions/.github/workflows/ping-cross-track-maintainers-team.yml@main 15 | secrets: 16 | github_membership_token: ${{ secrets.COMMUNITY_CONTRIBUTIONS_WORKFLOW_TOKEN }} 17 | -------------------------------------------------------------------------------- /.github/workflows/pr.yml: -------------------------------------------------------------------------------- 1 | # Run tests for awk or test files modified in this PR. 2 | 3 | name: AWK / pr 4 | 5 | on: pull_request 6 | 7 | jobs: 8 | ci: 9 | runs-on: ubuntu-24.04 10 | 11 | steps: 12 | - name: Checkout PR 13 | uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 14 | 15 | - name: Install software 16 | run: sudo apt update && sudo apt -y install gawk bats 17 | # bats v1.10.0 -- https://launchpad.net/ubuntu/noble/+source/bats 18 | # gawk v5.2.1 -- https://launchpad.net/ubuntu/noble/+source/gawk 19 | 20 | - name: Run tests for changed/added exercises 21 | env: 22 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 23 | run: | 24 | pr_endpoint=$(jq -r '"repos/\(.repository.full_name)/pulls/\(.pull_request.number)"' "$GITHUB_EVENT_PATH") 25 | gh api "$pr_endpoint/files" --paginate --jq ' 26 | .[] | 27 | select(.status == "added" or .status == "modified" or .status == "renamed") | 28 | select(.filename | match("\\.(awk|bats|bash|md)$")) | 29 | .filename 30 | ' | xargs -r bash bin/pr 31 | -------------------------------------------------------------------------------- /.github/workflows/sync-labels.yml: -------------------------------------------------------------------------------- 1 | name: Tools 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | paths: 8 | - .github/labels.yml 9 | - .github/workflows/sync-labels.yml 10 | workflow_dispatch: 11 | schedule: 12 | - cron: 0 0 1 * * # First day of each month 13 | 14 | permissions: 15 | issues: write 16 | 17 | jobs: 18 | sync-labels: 19 | uses: exercism/github-actions/.github/workflows/labels.yml@main 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | bin/configlet 2 | bin/configlet.exe 3 | 4 | # gawk debugger files 5 | .gawkrc 6 | .gawk_history 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Exercism 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /bin/ci: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # invoked by .github/workflows/ci.yml 3 | 4 | bin/validate_exercises 5 | -------------------------------------------------------------------------------- /bin/pr: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # invoked by .github/workflows/pr.yml 3 | 4 | # We'll be handed the list of files added/modified in a PR. 5 | # From that, extract the list of exercise directories, and 6 | # test there. 7 | 8 | if ((BASH_VERSINFO[0] < 4)); then 9 | echo "[Failure] This script requires bash version 4+" >&2 10 | exit 4 11 | fi 12 | shopt -s extglob 13 | 14 | declare -A seen=() 15 | declare -a dirs 16 | status=0 17 | 18 | for file; do 19 | if [[ $file =~ ^exercises/(practice|concept)/[^/]+ ]]; then 20 | dir=${BASH_REMATCH[0]} 21 | if [[ -z ${seen[$dir]} ]]; then 22 | bin/validate_one_exercise "$dir" || status=1 23 | seen["$dir"]=yes 24 | fi 25 | fi 26 | done 27 | 28 | exit $status 29 | -------------------------------------------------------------------------------- /concepts/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/awk/e5f2aea8f799294e7c3896b7bd02109cf18ce3e9/concepts/.keep -------------------------------------------------------------------------------- /concepts/TODO.md: -------------------------------------------------------------------------------- 1 | # Potential concept topics 2 | 3 | - fundamentals 4 | - patterns and actions 5 | - records and fields 6 | - expressions 7 | - truthiness 8 | 9 | - loops 10 | 11 | - special-blocks 12 | - BEGIN and END 13 | - BEGINFILE and ENDFILE 14 | 15 | - datatypes 16 | - strings, numbers, arrays 17 | - type functions 18 | 19 | - strings 20 | - string functions 21 | 22 | - numbers 23 | - numeric functions 24 | - bitwise functions 25 | 26 | - arrays 27 | - numerically-indexed 28 | - associative 29 | - multidimensional (SUBSEP) 30 | - arrays of arrays 31 | - array traversal & sorting 32 | 33 | - functions 34 | - parameters & local variables 35 | - calling dynamic functions 36 | 37 | - variables 38 | - global vs function parameters 39 | - builtin vars (NR, FNR, NF, FILENAME, ARGV, ARGC) 40 | - user-settable vars (FS, OFS, RS, ORS, FPAT, FIELDWIDTHS) 41 | 42 | - redirection 43 | 44 | - include 45 | 46 | - namespaces 47 | 48 | -------------------------------------------------------------------------------- /concepts/fundamentals/.meta/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "blurb": "AWK Fundamentals", 3 | "authors": ["glennj"], 4 | "contributors": ["IsaacG"] 5 | } 6 | -------------------------------------------------------------------------------- /concepts/fundamentals/links.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "description": "The AWK language", 4 | "url": "https://www.gnu.org/software/gawk/manual/html_node/Getting-Started.html#Getting-Started" 5 | }, 6 | { 7 | "description": "How Input Is Split into Records", 8 | "url": "https://www.gnu.org/software/gawk/manual/html_node/Records.html" 9 | }, 10 | { 11 | "description": "Truth Values", 12 | "url": "https://www.gnu.org/software/gawk/manual/html_node/Truth-Values.html" 13 | } 14 | ] 15 | -------------------------------------------------------------------------------- /concepts/nums-strs/.meta/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "blurb": "AWK data types: Numbers and Strings", 3 | "authors": ["glennj"], 4 | "contributors": ["IsaacG"] 5 | } 6 | -------------------------------------------------------------------------------- /concepts/nums-strs/links.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "description": "Numeric and String Constants", 4 | "url": "https://www.gnu.org/software/gawk/manual/html_node/Scalar-Constants.html" 5 | }, 6 | { 7 | "description": "Numeric Functions", 8 | "url": "https://www.gnu.org/software/gawk/manual/html_node/Numeric-Functions.html" 9 | }, 10 | { 11 | "description": "String-Manipulation Functions", 12 | "url": "https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html" 13 | }, 14 | { 15 | "description": "Getting Type Information", 16 | "url": "https://www.gnu.org/software/gawk/manual/html_node/Type-Functions.html" 17 | }, 18 | { 19 | "description": "Conversion of Strings and Numbers", 20 | "url": "https://www.gnu.org/software/gawk/manual/html_node/Conversion.html" 21 | } 22 | ] 23 | -------------------------------------------------------------------------------- /concepts/patterns/.meta/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "blurb": "More about Patterns", 3 | "authors": [ 4 | "glennj" 5 | ], 6 | "contributors": [ 7 | "IsaacG", 8 | "booniepepper" 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /concepts/patterns/links.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "description": "Pattern Elements", 4 | "url": "https://www.gnu.org/software/gawk/manual/html_node/Pattern-Overview.html" 5 | }, 6 | { 7 | "description": "Truth Values", 8 | "url": "https://www.gnu.org/software/gawk/manual/html_node/Truth-Values.html" 9 | } 10 | ] 11 | -------------------------------------------------------------------------------- /docs/LEARNING.md: -------------------------------------------------------------------------------- 1 | # Learning 2 | 3 | For a quick overview of the language, refer to the [awk info page][so] on Stack Overflow. 4 | 5 | Some other learning resources: 6 | 7 | * [Awk.Info](https://web.archive.org/web/20160505033644/http://awk.info/) 8 | * [Learn X in Y minutes: awk](https://learnxinyminutes.com/docs/awk/) 9 | * [Awk tutorial](https://www.grymoire.com/Unix/Awk.html) 10 | * [The GNU Awk User's Guide](https://www.gnu.org/software/gawk/manual/) 11 | 12 | [so]: https://stackoverflow.com/tags/awk/info 13 | -------------------------------------------------------------------------------- /docs/RESOURCES.md: -------------------------------------------------------------------------------- 1 | # Resources 2 | 3 | The [Gawk: Effective AWK Programming][book] book serves both as a tutorial and a reference manual. 4 | 5 | The wikipedia [AWK page][wiki-books] has a list of books and other resources. 6 | 7 | The [awk info page][so] at Stack Overflow. 8 | 9 | 10 | 11 | [book]: https://www.gnu.org/software/gawk/manual 12 | [wiki-books]: https://en.wikipedia.org/wiki/AWK#Books 13 | [so]: https://stackoverflow.com/tags/awk/info 14 | -------------------------------------------------------------------------------- /docs/SNIPPET.txt: -------------------------------------------------------------------------------- 1 | BEGIN {print "Hello World!"} 2 | -------------------------------------------------------------------------------- /docs/TESTS.md: -------------------------------------------------------------------------------- 1 | # Tests 2 | 3 | You can use the online editor on the Exercism website to solve the exercises. 4 | Or, download the exercises to your computer, solve them locally and then submit them to Exercism. 5 | 6 | If you want to work locally, you'll need the [`bats`][bats] program. 7 | Please refer to the [Testing on the Bash track][test-bash] page for the installation instructions. 8 | 9 | [bats]: https://github.com/bats-core/bats-core 10 | [test-bash]: https://exercism.org/docs/tracks/bash/tests 11 | -------------------------------------------------------------------------------- /docs/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "docs": [ 3 | { 4 | "uuid": "a2731a70-0502-4a7d-9020-838b723d7884", 5 | "slug": "installation", 6 | "path": "docs/INSTALLATION.md", 7 | "title": "Installing AWK locally", 8 | "blurb": "Learn how to install AWK locally to solve Exercism's exercises on your own machine" 9 | }, 10 | { 11 | "uuid": "43c4e98b-65db-42df-8545-4a3f53a5a6bd", 12 | "slug": "learning", 13 | "path": "docs/LEARNING.md", 14 | "title": "How to learn AWK", 15 | "blurb": "An overview of how to get started from scratch with AWK" 16 | }, 17 | { 18 | "uuid": "4c0d5075-557e-4da1-8639-f9bb446a3c85", 19 | "slug": "tests", 20 | "path": "docs/TESTS.md", 21 | "title": "Testing on the AWK track", 22 | "blurb": "Learn how to test your AWK exercises on Exercism" 23 | }, 24 | { 25 | "uuid": "8ef28d94-f6f2-4c19-8bba-1059de819fb6", 26 | "slug": "resources", 27 | "path": "docs/RESOURCES.md", 28 | "title": "Useful AWK resources", 29 | "blurb": "A collection of useful resources to help you master AWK" 30 | } 31 | ] 32 | } 33 | -------------------------------------------------------------------------------- /exercises/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/awk/e5f2aea8f799294e7c3896b7bd02109cf18ce3e9/exercises/.keep -------------------------------------------------------------------------------- /exercises/concept/basics/.docs/hints.md: -------------------------------------------------------------------------------- 1 | # Hints 2 | 3 | For all of these tasks, you'll need the `print` command: 4 | ```awk 5 | {print "something", "something else"} 6 | ``` 7 | 8 | ## 1. List the usernames 9 | 10 | * Use [the `FS` variable][var-fs] to define the field separator. 11 | 12 | ## 2. Print the line numbers 13 | 14 | * Use the [built-in variable `NR`][var-nr] to get the line number. 15 | 16 | ## 3. Print records with invalid home directories. 17 | 18 | * The home directory is the 6th field. 19 | * Use the given `startsWith` function. 20 | * Use [Boolean operators][boolean-ops]: `&&`, `||`, `!`. 21 | 22 | ## 4. Print the number of valid users who use bash 23 | 24 | * The login shell is the last field; you can use [the `NF` variable][var-nf]. 25 | 26 | [boolean-ops]: https://www.gnu.org/software/gawk/manual/html_node/Boolean-Ops.html 27 | [var-fs]: https://www.gnu.org/software/gawk/manual/html_node/User_002dmodified.html#index-FS-variable-8 28 | [var-nf]: https://www.gnu.org/software/gawk/manual/html_node/Auto_002dset.html#index-NF-variable-2 29 | [var-nr]: https://www.gnu.org/software/gawk/manual/html_node/Auto_002dset.html#index-NR-variable-1 30 | -------------------------------------------------------------------------------- /exercises/concept/basics/.docs/introduction.md.tpl: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | %{concept:fundamentals} 4 | -------------------------------------------------------------------------------- /exercises/concept/basics/.meta/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "authors": [ 3 | "glennj" 4 | ], 5 | "files": { 6 | "solution": [ 7 | "basics.sh" 8 | ], 9 | "test": [ 10 | "test-basics.bats" 11 | ], 12 | "exemplar": [ 13 | ".meta/exemplar.sh" 14 | ], 15 | "editor": [ 16 | "passwd" 17 | ] 18 | }, 19 | "blurb": "Introduction to fundamental AWK concepts", 20 | "source": "ChatGPT conversation" 21 | } 22 | -------------------------------------------------------------------------------- /exercises/concept/basics/.meta/design.md: -------------------------------------------------------------------------------- 1 | # Design 2 | 3 | ## Goal 4 | 5 | The goal of this exercise is to teach the student the basics of programming in AWK. 6 | 7 | ## Learning objectives 8 | 9 | - pattern/action pairs 10 | - records and fields 11 | - BEGIN and END 12 | - builtin variables 13 | 14 | ## Out of scope 15 | 16 | - variables 17 | - functions 18 | 19 | ## Concepts 20 | 21 | The Concepts this exercise unlocks are: 22 | 23 | - `fundamentals` 24 | 25 | ## Prerequisites 26 | 27 | none 28 | -------------------------------------------------------------------------------- /exercises/concept/basics/.meta/exemplar.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ## task 1 4 | awk ' 5 | BEGIN {FS = ":"} 6 | {print $1} 7 | ' ./passwd 8 | 9 | ## task 2 10 | awk '{print NR}' ./passwd 11 | 12 | ## task 3 13 | awk ' 14 | function startsWith(text, prefix) { 15 | return text ~ "^"prefix 16 | } 17 | !(startsWith($6, "/home") || startsWith($6, "/root"))' FS=':' ./passwd 18 | 19 | ## task 4 20 | awk -F ':' ' 21 | function startsWith(text, prefix) { 22 | return text ~ "^"prefix 23 | } 24 | (startsWith($6, "/home") || startsWith($6, "/root")) && $NF ~ /bash/ 25 | ' ./passwd 26 | -------------------------------------------------------------------------------- /exercises/concept/basics/basics.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # You will implement this exercise with a shell script that contains some awk commands. 4 | # In subsequent exercises, the solution file will contains only awk code. 5 | # 6 | # You have 4 tasks to solve. 7 | # Replace the `{exit}` action with awk code to solve the task. 8 | 9 | ## task 1 10 | awk '{exit}' ./passwd 11 | 12 | ## task 2 13 | awk '{exit}' ./passwd 14 | 15 | ## task 3 16 | awk ' 17 | # returns true if the text starts with the prefix 18 | # 19 | # startsWith("Hello, World!", "He") # => true 20 | # startsWith("Goodbye, Mars!", "He") # => false 21 | # 22 | function startsWith(text, prefix) { 23 | return text ~ "^"prefix 24 | } 25 | 26 | {exit} 27 | ' ./passwd 28 | 29 | ## task 4 30 | awk ' 31 | function startsWith(text, prefix) { 32 | return text ~ "^"prefix 33 | } 34 | 35 | {exit} 36 | ' ./passwd 37 | -------------------------------------------------------------------------------- /exercises/concept/basics/passwd: -------------------------------------------------------------------------------- 1 | root:x:0:0:root:/root:/bin/bash 2 | john:x:1001:1001:John Doe:/home/john:/bin/bash 3 | jane:x:1002:1002:Jane Doe:/home/jane:/bin/bash 4 | mark:x:1003:1003:Mark Smith:/home/mark:/bin/zsh 5 | susan:x:1004:1004:Susan Johnson:/invalid/home:/bin/bash 6 | peter:x:1005:1005:Peter Wong:/home/peter:/bin/false 7 | bill:x:1006:1004:Bill Gates:/invalid/steve:/usr/local/bin/pwsh 8 | -------------------------------------------------------------------------------- /exercises/concept/simple-report/.docs/hints.md: -------------------------------------------------------------------------------- 1 | # Hints 2 | 3 | ## Task 1: Generate the report 4 | 5 | - Use string contatenation to join the number fields. 6 | - Use arithmetic to calculate the average. 7 | - Use the `print` statement and string contatenation to generate the output line. 8 | -------------------------------------------------------------------------------- /exercises/concept/simple-report/.docs/instructions.md: -------------------------------------------------------------------------------- 1 | # Instructions 2 | 3 | You are helping a friend generate a report from readings he has taken in different corners of his garden. 4 | Unfortunately, your friend has stored the data in a strange format. 5 | Each reading is a set of comma separated fields. 6 | However, he has stored two-digit numbers across two columns. 7 | 8 | | field number | meaning | 9 | | --- | --- | 10 | | 1 | ID number | 11 | | 2 | location | 12 | | 3 | first reading, tens value | 13 | | 4 | first reading, ones value | 14 | | 5 | second reading, tens value | 15 | | 6 | second reading, ones value | 16 | 17 | For an input row like `101,house,4,2,5,4` 18 | - the first reading is `42`, 19 | - the second reading is `54`. 20 | 21 | ## Task 1: Generate the report 22 | 23 | Your task is find the average of the two readings and output the results of each row in the following format 24 | 25 | ```none 26 | #,