Primzahlsieb
proc sieb(n: int): seq[int] =
var prim = newSeq[bool](n + 1)
for i in 2..n: prim[i] = true
var i = 2
while i * i <= n:
if prim[i]:
var j = i * i
while j <= n:
prim[j] = false
j += i
inc i
for i in 2..n:
if prim[i]: result.add(i)
echo sieb(50)
echo sieb(10000).lenAusgabe
@[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47] 1229
Caesar-Chiffre und Palindrome
import std/[strutils, sequtils, algorithm]
proc verschiebe(text: string, schluessel: int): string =
for c in text:
if c in {'a'..'z'}:
result.add(char((ord(c) - ord('a') + schluessel + 26) mod 26 + ord('a')))
elif c in {'A'..'Z'}:
result.add(char((ord(c) - ord('A') + schluessel + 26) mod 26 + ord('A')))
else:
result.add(c)
proc istPalindrom(s: string): bool =
let b = s.toLowerAscii.filterIt(it in {'a'..'z'})
b == b.reversed
let geheim = verschiebe("Hallo Nim!", 3)
echo geheim
echo verschiebe(geheim, -3)
echo istPalindrom("Anna"), " ", istPalindrom("Nim"), " ", istPalindrom("Ein Esel lese nie")Ausgabe
Kdoor Qlp! Hallo Nim! true false true
Textstatistik
import std/[strutils, tables, algorithm, sequtils]
let text = "Der Hund und die Katze. Die Katze und der Hund! Der Hund schläft."
var zaehler = initCountTable[string]()
for w in text.toLowerAscii.split({' ', '.', '!'}):
if w.len > 0: zaehler.inc(w)
zaehler.sort()
var n = 0
for w, anzahl in zaehler:
echo w, ": ", anzahl
inc n
if n == 2: break
echo "Wörter gesamt: ", zaehler.values.toSeq.foldl(a + b)
echo "verschiedene: ", zaehler.lenAusgabe
der: 3 hund: 3 Wörter gesamt: 13 verschiedene: 6
Mini-Testframework
var bestanden, fehler = 0
template pruefe(ausdruck: untyped, erwartet: untyped) =
let ist = ausdruck
if ist == erwartet:
inc bestanden
echo "ok ", astToStr(ausdruck)
else:
inc fehler
echo "FEHLER ", astToStr(ausdruck), " => ", ist
proc fak(n: int): int = (if n <= 1: 1 else: n * fak(n - 1))
pruefe(fak(5), 120)
pruefe(fak(0), 1)
pruefe(@[3, 1, 2].len, 3)
pruefe(1 + 1, 3)
echo bestanden, " bestanden, ", fehler, " fehlgeschlagen"Ausgabe
ok fak(5) ok fak(0) ok @[3, 1, 2].len FEHLER 1 + 1 => 2 3 bestanden, 1 fehlgeschlagen
Merke
- Kleine Projekte (Sieb, Chiffre, Statistik) zeigen die Kürze von Nim
CountTableundsequtilsbeschleunigen Auswertungen- Mit Templates (
astToStr) lassen sich Testframeworks in wenigen Zeilen bauen - Nim erzeugt daraus schnelle, kleine Binärdateien
Aufgabe
Erweitere die Textstatistik um die Länge des längsten Wortes.