EMZETT.
Login

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

Kapitel 7 von 8 im Kurs Nim. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

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).len

Ausgabe:

@[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.len

Ausgabe:

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
  • CountTable und sequtils beschleunigen 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

Weiter im Kurs

Zurück: Fehler, Makros und Nebenläufigkeit

Weiter: Referenz und Spickzettel

Alle Kapitel: Nim im Überblick