diff options
| author | Archargelod <archargelod@gmail.com> | 2024-03-01 14:43:05 +0800 |
|---|---|---|
| committer | Archargelod <archargelod@gmail.com> | 2024-03-01 14:43:05 +0800 |
| commit | 534715243e65728db4ee90b5ee5dee644ce71dac (patch) | |
| tree | fe17b389593130a0961afea924afc8e180fb365a /challenge-015 | |
| parent | d64cde6fdb1521b4a240e30615a90febcaf46799 (diff) | |
| download | perlweeklychallenge-club-534715243e65728db4ee90b5ee5dee644ce71dac.tar.gz perlweeklychallenge-club-534715243e65728db4ee90b5ee5dee644ce71dac.tar.bz2 perlweeklychallenge-club-534715243e65728db4ee90b5ee5dee644ce71dac.zip | |
weeks 14-26, 258 in Nim
Diffstat (limited to 'challenge-015')
| -rw-r--r-- | challenge-015/archargelod/README | 1 | ||||
| -rwxr-xr-x | challenge-015/archargelod/nim/ch_1.nim | 48 | ||||
| -rwxr-xr-x | challenge-015/archargelod/nim/ch_2.nim | 49 |
3 files changed, 98 insertions, 0 deletions
diff --git a/challenge-015/archargelod/README b/challenge-015/archargelod/README new file mode 100644 index 0000000000..6cd57e1074 --- /dev/null +++ b/challenge-015/archargelod/README @@ -0,0 +1 @@ +Solution by archargelod diff --git a/challenge-015/archargelod/nim/ch_1.nim b/challenge-015/archargelod/nim/ch_1.nim new file mode 100755 index 0000000000..dd645f1540 --- /dev/null +++ b/challenge-015/archargelod/nim/ch_1.nim @@ -0,0 +1,48 @@ +#!/usr/bin/env -S nim r -d:release --verbosity:0 --hints:off +import std/math + +proc primeSieve(max: int): seq[int] = + var sieve = newSeq[bool](max) + + for p in 2 .. sieve.high: + if sieve[p]: + continue + + for i in countUp(2 * p, sieve.high, p): + sieve[i] = true + + for i, notPrime in sieve[2 ..^ 1]: + if not notPrime: + result.add i + 2 + +proc tierPrimesByStrength( + primes: openArray[int] +): tuple[weak, balanced, strong: seq[int]] = + for pInd, prime in primes[0 ..^ 2]: + if pInd == 0: + continue + let mean = (primes[pInd - 1] + primes[pInd + 1]) / 2 + + if almostEqual(prime.float, mean): + result.balanced.add prime + elif prime.float > mean: + result.strong.add prime + elif prime.float < mean: + result.weak.add prime + else: + raiseAssert("Error: bad float comparison.") + +when isMainModule: + import std/unittest + + const + ExpectedWeak = [3, 7, 13, 19, 23, 31, 43, 47, 61, 73] + ExpectedStrong = [11, 17, 29, 37, 41, 59, 67, 71, 79, 97] + + suite "Strong and weak primes": + let (weak, _, strong) = tierPrimesByStrength(primeSieve(200)) + + test "first 10 weak primes": + check weak[0 ..< 10] == ExpectedWeak + test "first 10 strong primes": + check strong[0 ..< 10] == ExpectedStrong diff --git a/challenge-015/archargelod/nim/ch_2.nim b/challenge-015/archargelod/nim/ch_2.nim new file mode 100755 index 0000000000..18770f6d15 --- /dev/null +++ b/challenge-015/archargelod/nim/ch_2.nim @@ -0,0 +1,49 @@ +#!/usr/bin/env -S nim r -d:release --verbosity:0 --hints:off +import std/[strutils, math] + +type cipherMode = enum + Encode + Decode + +proc alphaOrd(c: char): int = + c.ord - 'a'.ord + +proc rot(c: sink char, shift: int): char = + char('a'.ord + euclMod(c.alphaOrd + shift, 26)) + +proc vigenereCipher(plaintext: var string, key: string, mode = Encode) = + for i, c in plaintext: + if c notin Letters: + continue + + let key = block: + let tmp = key[i mod key.len].toLowerAscii.alphaOrd + if mode == Decode: -tmp else: tmp + + plaintext[i] = c.toLowerAscii.rot(key) + +proc encode*(plaintext: var string, key: string) = + vigenereCipher(plaintext, key, Encode) + +proc decode*(plaintext: var string, key: string) = + vigenereCipher(plaintext, key, Decode) + + +when isMainModule: + import std/unittest + + const + Plaintext = "attacking tonight" + Key = "OCULORHINOLARINGOLOGY" + ExpectedEncoded = "ovnlqbpvt eoeqtnh" + + suite "Vigenère cipher": + var text = Plaintext + + test "encode sample text": + text.encode(Key) + check text == ExpectedEncoded + + test "decode sample text": + text.decode(Key) + check text == Plaintext |
