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-043 | |
| 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-043')
| -rw-r--r-- | challenge-043/archargelod/README | 1 | ||||
| -rwxr-xr-x | challenge-043/archargelod/nim/ch_1.nim | 51 | ||||
| -rwxr-xr-x | challenge-043/archargelod/nim/ch_2.nim | 51 |
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 |
