aboutsummaryrefslogtreecommitdiff
path: root/challenge-038
diff options
context:
space:
mode:
authorArchargelod <archargelod@gmail.com>2024-03-08 19:02:07 +0800
committerArchargelod <archargelod@gmail.com>2024-03-08 19:02:07 +0800
commitc45f2d8a7ae3836921747c832d2bfe9db7cc9aa9 (patch)
treecea6fb0f51440f00210ab68d018e334c92bc7ef5 /challenge-038
parent510484bb98b0d2413f8c09c0a827e91b992d2533 (diff)
downloadperlweeklychallenge-club-c45f2d8a7ae3836921747c832d2bfe9db7cc9aa9.tar.gz
perlweeklychallenge-club-c45f2d8a7ae3836921747c832d2bfe9db7cc9aa9.tar.bz2
perlweeklychallenge-club-c45f2d8a7ae3836921747c832d2bfe9db7cc9aa9.zip
weeks 27-40, 259 in Nim
Diffstat (limited to 'challenge-038')
-rw-r--r--challenge-038/archargelod/README1
-rwxr-xr-xchallenge-038/archargelod/nim/ch_1.nim47
-rwxr-xr-xchallenge-038/archargelod/nim/ch_2.nim86
3 files changed, 134 insertions, 0 deletions
diff --git a/challenge-038/archargelod/README b/challenge-038/archargelod/README
new file mode 100644
index 0000000000..6cd57e1074
--- /dev/null
+++ b/challenge-038/archargelod/README
@@ -0,0 +1 @@
+Solution by archargelod
diff --git a/challenge-038/archargelod/nim/ch_1.nim b/challenge-038/archargelod/nim/ch_1.nim
new file mode 100755
index 0000000000..a5663f3205
--- /dev/null
+++ b/challenge-038/archargelod/nim/ch_1.nim
@@ -0,0 +1,47 @@
+#!/usr/bin/env -S nim r -d:release --verbosity:0 --hints:off
+import std/strutils
+
+proc formattedDate(date: string): string =
+ template throwError =
+ raise newException(ValueError, "Invalid date format, use: (0-1)(00-99)(01-12)(01-31)")
+
+ if date.len != 7:
+ throwError()
+
+ # year
+ case date[0]
+ of '1': result.add "20"
+ of '2': result.add "19"
+ else:
+ throwError()
+
+ if {date[1], date[2]} <= Digits:
+ result.add date[1] & date[2]
+ else:
+ throwError()
+
+ try:
+ # month
+ if parseInt(date[3] & date[4]) in 1..12:
+ result.add '-' & date[3] & date[4]
+ else:
+ throwError()
+
+ # day
+ if parseInt(date[5] & date[6]) in 1..31:
+ result.add '-' & date[5] & date[6]
+ else:
+ throwError()
+ except ValueError:
+ throwError()
+
+when isMainModule:
+ import std/unittest
+
+ const
+ Test = "2230120"
+ Expected = "1923-01-20"
+
+ suite "Date parser":
+ test "Example 1":
+ check formattedDate(Test) == Expected
diff --git a/challenge-038/archargelod/nim/ch_2.nim b/challenge-038/archargelod/nim/ch_2.nim
new file mode 100755
index 0000000000..e98dbf0fee
--- /dev/null
+++ b/challenge-038/archargelod/nim/ch_2.nim
@@ -0,0 +1,86 @@
+#!/usr/bin/env -S nim r -d:release --verbosity:0 --hints:off
+import std/[strutils, strformat, tables, sets, random]
+
+type
+ WordGame = ref object
+ points: Table[char, int]
+ bag: CountTable[char]
+ dict: HashSet[string]
+
+proc draw*(game: var WordGame, n: Natural): seq[char] =
+ for _ in 1..n:
+ let notEmpty: seq[char] = block:
+ var tmp: seq[char]
+ for val, cnt in game.bag:
+ if cnt > 0: tmp.add val
+ tmp
+
+ let choice = notEmpty[rand(notEmpty.low..notEmpty.high)]
+ result.add choice
+ game.bag.inc(choice, -1)
+
+proc rate*(game: WordGame, word: string): int =
+ for c in word:
+ result += game.points[c]
+
+proc spellBestWord*(game: WordGame, letters: seq[char]): string =
+ let available = letters.toCountTable()
+ var bestRating = 0
+
+ for word in game.dict:
+ block validWord:
+ var available = available
+ for c in word:
+ if c in available:
+ available.inc(c, -1)
+ else:
+ break validWord
+
+ let rating = game.rate(word)
+ if rating > bestRating:
+ bestRating = rating
+ result = word
+
+proc loadDict(filename: string, maxLen = int.high): HashSet[string] =
+ for word in lines filename:
+ if word.len > maxLen: continue
+ block onlyLetters:
+ for c in word:
+ if c notin Letters:
+ break onlyLetters
+
+ result.incl word.toLowerAscii
+
+proc main =
+ const
+ MaxWordLength = 7
+ Points = {
+ 'a': 1, 'g': 1, 'i': 1, 's': 1, 'u': 1, 'x': 1, 'z': 1,
+ 'e': 2, 'j': 2, 'l': 2, 'r': 2, 'v': 2, 'y': 2,
+ 'f': 3, 'd': 3, 'p': 3, 'w': 3,
+ 'b': 4, 'n': 4,
+ 't': 5, 'o': 5, 'h': 5, 'm': 5, 'c': 5,
+ 'k': 10, 'q': 10,
+ }.toTable()
+ Bag = toCountTable(
+ "aaaaaaaagggiiiiisssssssuuuuuxxzzzzzeeeeeeeeejjjlllrrrvvvyyyyyfffdddpppppwwwwwbbbbbnnnntttttooohhhmmmmcccckkqq"
+ )
+
+ var
+ game = WordGame(
+ points: Points,
+ bag: Bag,
+ dict: loadDict("/usr/share/dict/words", MaxWordLength)
+ )
+
+ randomize()
+
+ let
+ letters = game.draw(MaxWordLength)
+ bestWord = game.spellBestWord(letters)
+ rating = game.rate(bestWord)
+
+ echo &"The best word you can spell out of letters {letters} is '{bestWord}', with rating of {rating} points."
+
+when isMainModule:
+ main()