diff options
| author | Archargelod <archargelod@gmail.com> | 2024-03-08 19:02:07 +0800 |
|---|---|---|
| committer | Archargelod <archargelod@gmail.com> | 2024-03-08 19:02:07 +0800 |
| commit | c45f2d8a7ae3836921747c832d2bfe9db7cc9aa9 (patch) | |
| tree | cea6fb0f51440f00210ab68d018e334c92bc7ef5 /challenge-038 | |
| parent | 510484bb98b0d2413f8c09c0a827e91b992d2533 (diff) | |
| download | perlweeklychallenge-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/README | 1 | ||||
| -rwxr-xr-x | challenge-038/archargelod/nim/ch_1.nim | 47 | ||||
| -rwxr-xr-x | challenge-038/archargelod/nim/ch_2.nim | 86 |
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() |
