diff options
Diffstat (limited to 'challenge-127/andinus/README')
| -rw-r--r-- | challenge-127/andinus/README | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/challenge-127/andinus/README b/challenge-127/andinus/README new file mode 100644 index 0000000000..535d2258c5 --- /dev/null +++ b/challenge-127/andinus/README @@ -0,0 +1,166 @@ + ━━━━━━━━━━━━━━━ + CHALLENGE 126 + + Andinus + ━━━━━━━━━━━━━━━ + + + 2021-08-19 + + +Table of Contents +───────────────── + +Task 1 - Count Numbers +Task 2 - Minesweeper Game + + + + + +Task 1 - Count Numbers +══════════════════════ + + You are given a positive integer `$N'. + + Write a script to print count of numbers from 1 to `$N' that don’t + contain digit 1. + + Example: + ┌──── + │ Input: $N = 15 + │ Output: 8 + │ + │ There are 8 numbers between 1 and 15 that don't contain digit 1. + │ 2, 3, 4, 5, 6, 7, 8, 9. + │ + │ Input: $N = 25 + │ Output: 13 + │ + │ There are 13 numbers between 1 and 25 that don't contain digit 1. + │ 2, 3, 4, 5, 6, 7, 8, 9, 20, 22, 23, 24, 25. + └──── + + +Raku +──── + + • Program: <file:raku/ch-1.raku> + + Loop over `1..$N' and grep for numbers that don't have `1'. `hyper' + hints the compiler that this can be run in parallel. + + ┌──── + │ print .join: ', ' with (1..$N).hyper.grep(*.comb.grep(1).elems == 0); + │ put '.'; + └──── + + +C +─ + + • Program: <file:c/ch-1.c> + + `argv' holds the input & `argc' holds the number of inputs. The input + should be a single integer so `argc' should be equal to 2. After + checking for that, we check if valid integer was passed. + + After checks, we loop over all numbers from 1 to `num' (passed value) + and check if they contain digit `1'. The check is performed by + converting `num' to a string and matching for '1' in the string. If we + find it then we set the flag to false and don't print the number, + otherwise we print it. + + ┌──── + │ if (argc != 2) { + │ puts("Usage: ./ch-1 <number>"); + │ exit(0); + │ } + │ + │ const char *errstr; + │ int num = strtonum(argv[1], 1, INT_MAX, &errstr); + │ if (errstr != NULL) + │ errx(1, "number is %s: %s", errstr, argv[1]); + │ + │ for (int idx = 1; idx <= num; idx++) { + │ bool take = true; + │ + │ int str_size = 1 + snprintf(NULL, 0, "%d", idx); + │ char *num_str = calloc(str_size, sizeof(char)); + │ snprintf(num_str, str_size, "%d", idx); + │ + │ for (int x = 0; num_str[x] != '\0'; x++) + │ if (num_str[x] == '1') take = false; + │ free(num_str); + │ + │ if (take == true) printf("%d ", idx); + │ } + │ printf("\n"); + └──── + + +Task 2 - Minesweeper Game +═════════════════════════ + + You are given a rectangle with points marked with either x or *. + Please consider the x as a land mine. + + Write a script to print a rectangle with numbers and x as in the + Minesweeper game. + + A number in a square of the minesweeper game indicates the + number of mines within the neighbouring squares (usually + 8), also implies that there are no bombs on that square. + + Example: + ┌──── + │ Input: + │ x * * * x * x x x x + │ * * * * * * * * * x + │ * * * * x * x * x * + │ * * * x x * * * * * + │ x * * * x * * * * x + │ + │ Output: + │ x 1 0 1 x 2 x x x x + │ 1 1 0 2 2 4 3 5 5 x + │ 0 0 1 3 x 3 x 2 x 2 + │ 1 1 1 x x 4 1 2 2 2 + │ x 1 1 3 x 2 0 0 1 x + └──── + + +Raku +──── + + • Program: <file:raku/ch-2.raku> + + `@rect' holds the challenge grids and `@grids' holds the solution. We + loop over every cell and if it's not a land mine then we loop over + it's neighbors and find the number of neighboring land mines and set + it's value. + + The neighbors is returned by `neighbors' subroutine which is adapted + from `Octans::Neighbors' (projects/octans) which was adapted from my + 2020 AoC day 11's solution. + + ┌──── + │ my @rect = $input.IO.lines.map(*.words.cache); + │ die "Not rectangle" unless [==] @rect.map(*.elems); + │ + │ my @grid; + │ for 0 .. @rect.end -> $r { + │ for 0 .. @rect[$r].end -> $c { + │ given @rect[$r][$c] { + │ when "x" { @grid[$r][$c] = @rect[$r][$c] } + │ when "*" { + │ @grid[$r][$c] = 0; + │ for neighbors(@rect, $r, $c).List -> $pos { + │ @grid[$r][$c]++ if @rect[$pos[0]][$pos[1]] eq "x"; + │ } + │ } + │ } + │ } + │ } + │ .put for @grid; + └──── |
