BuK/IIm11/Studenten/sidatasc/k1
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Scheme</language>
== Arbeiten mit Streams ==
Definition von grundlegenden Funktionen für die Arbeit mit Streams:
<code id="4f774a106346f">
;; Selektoren
(define stream-car car)
(define stream-cdr
(lambda (stm)
(force (cdr stm))))
;; Konstruktoren
(define-syntax stream-cons
(syntax-rules ()
((_ head tail) (cons head (delay tail)))))
;; Praedikat
(define stream?
(lambda (stm)
(and (pair? stm)(promise? (cdr stm)))))
;; Operationen mit streams
(define print-stream
(lambda (stm n)
(cond
((<= n 0) (display "...\n"))
(else
(display (stream-car stm))
(display ", ")
(print-stream (stream-cdr stm) (- n 1))))))
(define stream-item
(lambda (str k)
(if (= k 0)
(stream-car str)
(stream-item (stream-cdr str) (- k 1)))))
</code>
== Hilberthotel ==
Das Hilberthotel besitzt undendlich viele Zimmer. Leere Zimmer werden mit "#f" gekennzeichnet.
<code id="4f774a1063a00">
(define baue-hilberthotel
(lambda ()
(stream-cons #f (baue-hilberthotel))
)
)
(define zeig-mir
(lambda(hotel n)
(print-stream hotel n)
)
)
(define hilberthotel (baue-hilberthotel))
</code>
<run id="4f774a1063dbe">
(zeig-mir hilberthotel 11)
</run>
== einzelne Gäste ==
<code id="4f774a1063ac2">
(define einzelbuchung
(lambda (value stream index)
(if (<= index 0)
(if (eq? (stream-car stream) #f)
(stream-cons value (stream-cdr stream))
(error (string-append "Error in einzelbuchung: Dieses Zimmer ist schon durch " (stream-car stream) " belegt."))
)
(stream-cons (stream-car stream) (einzelbuchung value (stream-cdr stream) (- index 1)))
)
)
)
(set! hilberthotel (einzelbuchung "Otto Grundmann" hilberthotel 3))
(set! hilberthotel (einzelbuchung "Hella Milkel" hilberthotel 2))
(set! hilberthotel (einzelbuchung "Heribert Wuischke" hilberthotel 7))
</code>
<run id="4f774a1063e80">
(zeig-mir hilberthotel 12)
</run>
== kleine Reisegruppe ==
<code id="4f774a1063b65">
(define baue-kleinbus
(lambda (name count)
(if (> count 0)
(append (baue-kleinbus name (- count 1)) (list (cons name count)))
(list (cons name count))
)
)
)
(define kleingruppenbuchung
(lambda (list stream)
(if (null? list)
stream
(if (eq? (stream-car stream) #f)
(stream-cons (car list) (kleingruppenbuchung (cdr list) (stream-cdr stream)))
(stream-cons (stream-car stream) (kleingruppenbuchung list (stream-cdr stream)))
)
)
)
)
(define zeig-mir-kleinbus
(lambda (list)
(display list)
)
)
(define kleinbus815 (baue-kleinbus 815 8))
(set! hilberthotel (kleingruppenbuchung kleinbus815 hilberthotel))
</code>
Kleinbus kommt angefahren:
<run id="4f774a1063f3a">
(zeig-mir-kleinbus kleinbus815)
</run>
Zimmerbelegung nach Check-In:
<run id="4f774a1064002">
(zeig-mir hilberthotel 15)
</run>
== Hilbertbus ==
<code id="4f774a1063c09">
(define baue-hilbertbus
(lambda (name)
(letrec
((fabrik
(lambda (start)
(stream-cons (cons name start) (fabrik (+ start 1)))
)
))
(fabrik 0)
)
)
)
(define check-in
(lambda (bus-stream hotel-stream)
(if (eq? (stream-car hotel-stream) #f)
(stream-cons (stream-car bus-stream) (check-in (stream-cdr bus-stream) (stream-cdr hotel-stream)))
(stream-cons (stream-car hotel-stream) (check-in bus-stream (stream-cdr hotel-stream)))
)
)
)
(define bus3813 (baue-hilbertbus 3813))
(set! hilberthotel (check-in bus3813 hilberthotel))
(define bus33 (baue-hilbertbus 33))
</code>
groooßer Hilbertbus kommt angefahren:
<run id="4f774a10640ee">
(zeig-mir bus3813 8)
</run>
Zimmerbelegung nach Check-In:
<run id="4f774a10641b6">
(zeig-mir hilberthotel 20)
</run>
Es scheinen keine freien Zimmer mehr zu sein, doch da kommt noch an bus gefahren:
<run id="4f774a1064279">
(zeig-mir bus33 8)
</run>
Gäste müssen umziehen:
<code id="4f78907d5331b">
(define gehe-in-gerade
(lambda (hotel-stream)
(stream-cons (stream-car hotel-stream) (stream-cons #f (gehe-in-gerade (stream-cdr hotel-stream))))
)
)
(set! hilberthotel (gehe-in-gerade hilberthotel))
</code>
<run id="4f774a106433e">
(zeig-mir hilberthotel 30)
</run>
Zimmerbelegung nach Check-In:
<code id="4f78907d533f5">
(set! hilberthotel (check-in bus33 hilberthotel))
</code>
<run id="4f774a1064424">
(zeig-mir hilberthotel 30)
</run>
== Hilbertbus-Konvoi ==
<code id="4f7893099718e">
(define konvoimacher
(lambda (name)
(letrec
((fabrik
(lambda (abteilung)
(stream-cons (baue-hilbertbus (string-append name (number->string abteilung))) (fabrik (+ abteilung 1)))
)
))
(fabrik 0)
)
)
)
(define zeig-mir-konvoi
(lambda (stream n m)
(if (<= n 0)
(if (<= m 0)
(display "...\n")
(begin
(display "..., ")
(zeig-mir-konvoi stream 0 (- m 1))
)
)
(begin
(print-stream (stream-car stream) m)
(zeig-mir-konvoi (stream-cdr stream) (- n 1) m)
)
)
)
)
(define k1 (konvoimacher "MH"))
</code>
Macrohard macht Betriebsausflug mit folgenden Bussen (eine Zeile = 1 Bus):
<run id="4f7893099721e">
(zeig-mir-konvoi k1 4 8)
</run>
== Konvoi->Stream ==
Mathematische Hilfsfunktionen, um aus einen Stream von Hilbertbussen, einen einzelnen Stream von Hotelgästen zu definieren.
<code id="4f78971c01ba5">
(define helper-f
(lambda (i)
(/ (* (+ i 1) i) 2)
)
)
(define helper-q
(lambda (i)
(letrec (
(helfer
(lambda (zaehler)
(if (<= (helper-f zaehler) i)
(helfer (+ zaehler 1))
zaehler
)
)
))
(- (helfer 0) 1)
)
)
)
</code>
<code id="4f78971c01c20">
(define zimmer
(lambda (nr stream)
(if (<= nr 0)
(stream-car stream)
(zimmer (- nr 1) (stream-cdr stream))
)
)
)
(define konvoi->kette
(lambda (konvoi)
(letrec
((platzanweiser
(lambda (index)
(letrec (
(hole-person
(lambda (busse bus-nr platz-nr)
(if (<= bus-nr 0)
(zimmer platz-nr (stream-car busse)) ;; zimmer-funktion hat gleiches Prinzip :-)
(hole-person (stream-cdr busse) (- bus-nr 1) platz-nr)
)
)
))
(let ((j (helper-q index)))
(let ((y (- index (helper-f j))))
(let ((x (- j y)))
(stream-cons (hole-person konvoi x y) (platzanweiser (+ index 1)))
)
)
)
)
)
))
(platzanweiser 0)
)
)
)
</code>
Passagiere treten in folgender Reihenfolge zum Check-In an:
<run id="4f78971c01c9a">
(zeig-mir (konvoi->kette k1) 20)
</run>
Hotelgäste müssen umziehen, damit die ungeraden Zimmer frei werden. Danach beziehen die Konvoi-Gäste ihre Zimmer.
<code id="4f789838b013e">
(set! hilberthotel (gehe-in-gerade hilberthotel))
(set! hilberthotel (check-in (konvoi->kette k1) hilberthotel))
</code>
Zimmerbelegung nach Check-In:
<run id="4f789838b01a0">
(zeig-mir hilberthotel 42)
</run>
== Wer wohnt in Zimmer 234? ==
<run id="4f789838b01f1">
(zimmer 234 hilberthotel)
</run>