Kurz: echo sieb(50) echo sieb(10000).len `output @[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47] 1229
Teil des Kurses Nim
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]
1229Caesar-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 trueTextstatistik
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: 6Mini-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 fehlgeschlagenMerke
- 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
Übungsaufgabe
Erweitere die Textstatistik um die Länge des längsten Wortes.
Quiz zur Selbstkontrolle
Wofür dient astToStr?
- Liefert den Quelltext eines Ausdrucks als String (richtig)
- Wandelt ASCII in Strings
- Prüft Typen
- Liest Dateien
Was macht zaehler.inc(w)?
- Erhöht den Zähler für w (richtig)
- Löscht w
- Gibt w aus
- Sortiert
Wo besonders stark?
- Schnelle Kommandozeilenwerkzeuge und Systemcode (richtig)
- Tabellenkalkulation
- Textverarbeitung
- Mobile Spiele-UI nur
Weiter im Kurs
Zurück: Fehler, Makros und Nebenläufigkeit
Weiter: Referenz und Spickzettel
Alle Kapitel: Nim im Überblick