aboutsummaryrefslogtreecommitdiff
path: root/challenge-043
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-043
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-043')
-rw-r--r--challenge-043/archargelod/README1
-rwxr-xr-xchallenge-043/archargelod/nim/ch_1.nim51
-rwxr-xr-xchallenge-043/archargelod/nim/ch_2.nim51
3 files changed, 103 insertions, 0 deletions
diff --git a/challenge-043/archargelod/README b/challenge-043/archargelod/README
new file mode 100644
index 0000000000..6cd57e1074
--- /dev/null
+++ b/challenge-043/archargelod/README
@@ -0,0 +1 @@
+Solution by archargelod
diff --git a/challenge-043/archargelod/nim/ch_1.nim b/challenge-043/archargelod/nim/ch_1.nim
new file mode 100755
index 0000000000..c8849dc17c
--- /dev/null
+++ b/challenge-043/archargelod/nim/ch_1.nim
@@ -0,0 +1,51 @@
+#!/usr/bin/env -S nim r -d:release --verbosity:0 --hints:off
+import std/[sequtils, options, algorithm, sugar]
+
+type
+ Number = ref object
+ value: Option[int]
+ Ring = object
+ color: string
+ numbers: seq[Number]
+
+proc sum(s: Ring): int =
+ for n in s.numbers:
+ if n.value.isSome():
+ result += n.value.get()
+
+proc main =
+ var numbers = [
+ Number(value: some(9)),
+ Number(value: none(int)),
+ Number(value: some(5)),
+ Number(value: none(int)),
+ Number(value: none(int)),
+ Number(value: none(int)),
+ Number(value: some(7)),
+ Number(value: none(int)),
+ Number(value: some(8)),
+ ]
+
+ var rings = [
+ Ring(color: "red", numbers: @[numbers[0], numbers[1]]),
+ Ring(color: "green", numbers: @[numbers[1], numbers[2], numbers[3]]),
+ Ring(color: "black", numbers: @[numbers[3], numbers[4], numbers[5]]),
+ Ring(color: "yellow", numbers: @[numbers[5], numbers[6], numbers[7]]),
+ Ring(color: "purple", numbers: @[numbers[7], numbers[8]]),
+ ]
+
+ var empty = collect:
+ for n in numbers:
+ if n.value.isNone(): n
+
+ var givenNums = [1,2,3,4,6]
+ while not rings.allIt(it.sum() == 11):
+ for i, n in givenNums:
+ empty[i].value = some(n)
+ givenNums.nextPermutation()
+
+ for ring in rings:
+ echo ring.color, ": ", ring.numbers.mapIt(it.value.get())
+
+when isMainModule:
+ main()
diff --git a/challenge-043/archargelod/nim/ch_2.nim b/challenge-043/archargelod/nim/ch_2.nim
new file mode 100755
index 0000000000..bac6cbe9ba
--- /dev/null
+++ b/challenge-043/archargelod/nim/ch_2.nim
@@ -0,0 +1,51 @@
+#!/usr/bin/env -S nim r -d:release --verbosity:0 --hints:off
+## Anyone could implement a formula, so here is a
+## bruteforce approach of trying every combination of digits
+## which sum is equal to the base and checking if number is self-descriptive.
+## It's very slow past base 12.
+import std/[sequtils, strutils, bitops, math, sugar]
+
+type Number = object
+ data: seq[int]
+
+proc `$`(number: Number): string =
+ const digits = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ var digitSeq: seq[char]
+ for i in countDown(number.data.high, 0):
+ digitSeq.insert(digits[number.data[i]])
+ digitSeq.join()
+
+iterator combinations(fullSet: openarray[int], n: int): seq[int] =
+ for i in 1..2^fullSet.len:
+ if i.countSetBits() != n: continue
+
+ var buf = newSeqOfCap[int](n)
+ for j in 0..fullSet.high:
+ if i.testBit(j):
+ buf.add fullSet[j]
+
+ yield buf
+
+iterator groupCombinations(n, m: int): seq[int] =
+ for c in combinations(toSeq(0..<n+m-1), m-1):
+ let res = collect:
+ for s in zip(@[-1] & c, c & @[n + m - 1]):
+ s[1] - s[0] - 1
+ yield res
+
+proc isSelfDescriptive(number: Number): bool =
+ for i, val in number.data:
+ if number.data.count(i) != val:
+ return false
+ true
+
+when isMainModule:
+ const bases = [4,5,7,8,9,10,11,12]
+
+ for base in bases:
+ for comb in groupCombinations(base, base):
+ if comb.anyIt(it >= base): continue
+ let number = Number(data: comb)
+ if number.isSelfDescriptive():
+ echo base, ": ", number
+ break