aboutsummaryrefslogtreecommitdiff
path: root/challenge-047/archargelod
diff options
context:
space:
mode:
authorArchargelod <archargelod@gmail.com>2024-03-23 13:33:35 +0800
committerArchargelod <archargelod@gmail.com>2024-03-23 13:33:35 +0800
commit3a120930c5773eba4641d49e02ea5e58c12dcfcb (patch)
tree703beab5827accad694e4d0ae60c5edf8e69ecf9 /challenge-047/archargelod
parent8e95e94de527f8344f979dbb45b935139b1ddeb7 (diff)
downloadperlweeklychallenge-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/README1
-rwxr-xr-xchallenge-047/archargelod/nim/ch_1.nim81
-rwxr-xr-xchallenge-047/archargelod/nim/ch_2.nim26
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