aboutsummaryrefslogtreecommitdiff
path: root/challenge-015
diff options
context:
space:
mode:
authorArchargelod <archargelod@gmail.com>2024-03-01 14:43:05 +0800
committerArchargelod <archargelod@gmail.com>2024-03-01 14:43:05 +0800
commit534715243e65728db4ee90b5ee5dee644ce71dac (patch)
treefe17b389593130a0961afea924afc8e180fb365a /challenge-015
parentd64cde6fdb1521b4a240e30615a90febcaf46799 (diff)
downloadperlweeklychallenge-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/README1
-rwxr-xr-xchallenge-015/archargelod/nim/ch_1.nim48
-rwxr-xr-xchallenge-015/archargelod/nim/ch_2.nim49
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