diff options
| author | Archargelod <archargelod@gmail.com> | 2024-03-23 13:33:35 +0800 |
|---|---|---|
| committer | Archargelod <archargelod@gmail.com> | 2024-03-23 13:33:35 +0800 |
| commit | 3a120930c5773eba4641d49e02ea5e58c12dcfcb (patch) | |
| tree | 703beab5827accad694e4d0ae60c5edf8e69ecf9 /challenge-047/archargelod | |
| parent | 8e95e94de527f8344f979dbb45b935139b1ddeb7 (diff) | |
| download | perlweeklychallenge-club-3a120930c5773eba4641d49e02ea5e58c12dcfcb.tar.gz perlweeklychallenge-club-3a120930c5773eba4641d49e02ea5e58c12dcfcb.tar.bz2 perlweeklychallenge-club-3a120930c5773eba4641d49e02ea5e58c12dcfcb.zip | |
weeks 41-47, 260, 261 in Nim
Diffstat (limited to 'challenge-047/archargelod')
| -rw-r--r-- | challenge-047/archargelod/README | 1 | ||||
| -rwxr-xr-x | challenge-047/archargelod/nim/ch_1.nim | 81 | ||||
| -rwxr-xr-x | challenge-047/archargelod/nim/ch_2.nim | 26 |
3 files changed, 108 insertions, 0 deletions
diff --git a/challenge-047/archargelod/README b/challenge-047/archargelod/README new file mode 100644 index 0000000000..6cd57e1074 --- /dev/null +++ b/challenge-047/archargelod/README @@ -0,0 +1 @@ +Solution by archargelod diff --git a/challenge-047/archargelod/nim/ch_1.nim b/challenge-047/archargelod/nim/ch_1.nim new file mode 100755 index 0000000000..4108cc100d --- /dev/null +++ b/challenge-047/archargelod/nim/ch_1.nim @@ -0,0 +1,81 @@ +#!/usr/bin/env -S nim r -d:release --verbosity:0 --hints:off +import std/[strutils, parseutils] + +type RomanDigit = enum + I = 1 + V = 5 + X = 10 + L = 50 + C = 100 + D = 500 + M = 1000 + +const + Squish = { + "VIIII": "IX", + "LXXXX": "XC", + "DCCCC": "CM", + "IIII": "IV", + "XXXX": "XL", + "CCCC": "CD", + } + +const RomanDescending = [M, D, C, L, X, V, I] + +proc toRoman(dec: int): string = + var dec = dec + while dec > 0: + for roman in RomanDescending: + if dec >= roman.ord: + dec -= roman.ord + result &= $roman + break + + for (sub, by) in Squish: + result = result.replace(sub, by) + +proc toDec(roman: string): int = + var prev = M + for c in roman: + let r = parseEnum[RomanDigit]($c) + result += r.ord + if prev < r: + result -= prev.ord * 2 + prev = r + +proc romanCalculator(input: string): string = + let tmp = input.splitWhitespace() + assert tmp.len == 3 + let (arg1, op, arg2) = (tmp[0], tmp[1], tmp[2]) + + toRoman( + case op + of "+": toDec(arg1) + toDec(arg2) + of "-": toDec(arg1) - toDec(arg2) + of "*": toDec(arg1) * toDec(arg2) + else: + raiseAssert("Invalid expression") + ) + +when isMainModule: + import std/unittest + + const + Test = [ + "XXXVI + X", + "DIV - X", + "VII * X", + ] + Expected = [ + "XLVI", + "CDXCIV", + "LXX", + ] + + suite "Show multiple arrays content": + test "Addition": + check romanCalculator(Test[0]) == Expected[0] + test "Subtraction": + check romanCalculator(Test[1]) == Expected[1] + test "Multiplication": + check romanCalculator(Test[2]) == Expected[2] diff --git a/challenge-047/archargelod/nim/ch_2.nim b/challenge-047/archargelod/nim/ch_2.nim new file mode 100755 index 0000000000..9f02ecc75c --- /dev/null +++ b/challenge-047/archargelod/nim/ch_2.nim @@ -0,0 +1,26 @@ +#!/usr/bin/env -S nim r -d:release --verbosity:0 --hints:off +import std/math + +proc isGapful(n: int): bool = + let last = n mod 10 + let first = int(n / (10 ^ int log10(float n))) + n mod (first * 10 + last) == 0 + +proc firstGapfulNumbers(n: int): seq[int] = + var number = 100 + while result.len < n: + if number.isGapful(): + result.add number + inc number + +when isMainModule: + import std/unittest + + const + Test = 20 + Expected = [100, 105, 108, 110, 120, 121, 130, 132, 135, 140, 143, 150, 154, + 160, 165, 170, 176, 180, 187, 190] + + suite "Gapful Number": + test "first 20": + check firstGapfulNumbers(Test) == Expected |
