BuK/IIm15/KA-Hilbertbus
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>FLACI_c97gpsjc5dyr</language>
Hilfsprozeduren zur Streambehandlung
<code id="56fcb78422c21">
;Streambehandlung
(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)))))
;; Operationen mit streams
(define make-stream
(lambda (seed proc)
(letrec
((stream-builder
(lambda (n)
(stream-cons n (stream-builder (proc n))))))
(stream-builder seed))))
(define stream-item
(lambda (str k)
(if (= k 0)
(stream-car str)
(stream-item (stream-cdr str) (- k 1)))))
(define stream-map
(lambda (f str)
(stream-cons
(f (stream-car str))
(stream-map f (stream-cdr str)))))
(define print-stream
(lambda (stm n)
(cond
((<= n 0) (display "...")(newline))
(else
(display (stream-car stm))
(display ", ")
(print-stream (stream-cdr stm) (- n 1))))))
(define nat_zahlen (make-stream 0 (lambda (n) (+ n 1))))
(define generiere_aufzaehlbare_menge
(lambda (f)
(stream-map f nat_zahlen )))
(define zeig-mir print-stream)
</code>
Erstellung eines Hilberthotels
<code id="56fcb78422cd1">
(define hilbert
(lambda (n)
#f))
(define baue-hilberthotel (generiere_aufzaehlbare_menge hilbert))
(define hilberthotel baue-hilberthotel)
</code>
<run id="56fcb78423403">
(zeig-mir hilberthotel 11)
</run>
Erstellung einer Einzelbuchung
<code id="56fcb78422d7a">
(define einzelbuchung
(lambda (name stm pos)
(if (not (equal? (stream-item stm pos) #f))
(error "Fehler aufgetreten: Zimmer belegt.")
(cond
([and (= pos 0)(equal? (stream-item stm pos) #f)] (stream-cons name (stream-cdr stm)))
(else (stream-cons (stream-car stm) (einzelbuchung name (stream-cdr stm) (- pos 1))))))))
(set! hilberthotel (einzelbuchung "Otto Grundmann" hilberthotel 3))
</code>
<run id="56fcb78423480">
(zeig-mir hilberthotel 12)
</run>
<code id="56fcb78422e2a">
(set! hilberthotel (einzelbuchung "Hella Milkel" hilberthotel 2))
;(set! hilberthotel (einzelbuchung "Heribert Wuischke" hilberthotel 3))
(set! hilberthotel (einzelbuchung "Heribert Wuischke" hilberthotel 7))
</code>
<run id="56fcb784234f8">
(zeig-mir hilberthotel 12)
</run>
Erstellung eines Kleinbusses
<code id="56fcb78422ed9">
(define baue-kleinbus1
(lambda (name plaetze)
(cond
([= plaetze 0] (list (cons name plaetze)))
(else (cons (cons name plaetze) (baue-kleinbus1 name (- plaetze 1)))))))
(define umkehr
(lambda (ls)
(cond
([equal? (cdr ls) '()] (list (car ls)))
(else (append (umkehr (cdr ls)) (list (car ls)))))))
(define baue-kleinbus
(lambda (name plaetze)
(umkehr (baue-kleinbus1 name plaetze))))
(define kleinbus815 (baue-kleinbus 815 8))
</code>
<run id="56fcb7842356f">
(write kleinbus815)
</run>
Erstellung einer Kleingruppenbuchung
<code id="56fcb78422f84">
(define getFirstFreePosition
(lambda (stm pos)
(if (equal? (stream-car stm) #f) pos
(getFirstFreePosition (stream-cdr stm) (+ pos 1)))))
(define kleingruppenbuchung
(lambda (ls stm)
(cond
([equal? ls '()] stm)
(else (kleingruppenbuchung (cdr ls) (einzelbuchung (car ls) stm (getFirstFreePosition stm 0)))))))
(set! hilberthotel (kleingruppenbuchung kleinbus815 hilberthotel))
</code>
<run id="56fcb784235e6">
(zeig-mir hilberthotel 12)
</run>
Erstellung eines Hilbertbusses
<code id="56fcb78423036">
(define hilbertb
(lambda (name str)
(stream-cons (cons name (stream-car str))
(hilbertb name (stream-cdr str)))))
(define baue-hilbertbus
(lambda (name)
(hilbertb name nat_zahlen)))
(define bus3813 (baue-hilbertbus 3813))
</code>
<run id="56fcb7842367b">
(zeig-mir bus3813 8)
</run>
Erstellung des Check-In für einen Hilbertbus
<code id="56fcb784230c9">
(define hilbertCheckIn
(lambda (stmBus str)
(if (not (equal? (stream-car str) #f))
(stream-cons (stream-car str) (hilbertCheckIn stmBus (stream-cdr str)))
(stream-cons (stream-car stmBus) (hilbertCheckIn (stream-cdr stmBus) (stream-cdr str)))
)))
(set! hilberthotel (hilbertCheckIn bus3813 hilberthotel))
</code>
<run id="56fcb78423729">(zeig-mir hilberthotel 20)</run>
Umzug der Hotelbewohner auf gerade Zimmernummern
<code id="56fcb78423143">
(define gehe-in-gerade
(lambda (stm n)
(cond
([even? n] (stream-cons (stream-car stm) (gehe-in-gerade (stream-cdr stm) (+ n 1))))
(else (stream-cons #f (gehe-in-gerade stm (+ n 1)))))))
(set! hilberthotel (gehe-in-gerade hilberthotel 0))
</code>
<run id="56fcb784237e3">
(zeig-mir hilberthotel 30)
</run>
Erstellung und Check-In eines weiteren Hilbertbusses
<code id="56fcb784231bb">
(define bus33 (baue-hilbertbus 33))
(set! hilberthotel (hilbertCheckIn bus33 hilberthotel))
</code>
<run id="56fcb7842388e">
(zeig-mir hilberthotel 30)
</run>
Erstellung eines Hilbertkonvoi
<code id="56fcb78423243">
(define hilbertK
(lambda (buchstabenname name str)
(stream-cons (cons (string-append buchstabenname (number->string name)) (stream-car str))
(hilbertK buchstabenname name (stream-cdr str)))))
(define baue-hilbertbusKonvoi
(lambda (buchstabenname name)
(hilbertK buchstabenname name nat_zahlen)))
(define make-KStream
(lambda (buchstabe name)
(letrec
((stream-builder
(lambda (n name)
(stream-cons n (stream-builder (baue-hilbertbusKonvoi buchstabe name) (+ name 1))))))
(stream-builder (baue-hilbertbusKonvoi buchstabe name) (+ name 1)))))
(define zeige-mir
(lambda (stm spalte)
(zeig-mir (stream-item stm 0) spalte)
(zeig-mir (stream-item stm 1) spalte)
(zeig-mir (stream-item stm 2) spalte)
(zeig-mir (stream-item stm 3) spalte)
(zeig-mir (stream-item stm 4) spalte)
(zeig-mir (stream-item stm 5) spalte)))
(define k1 (make-KStream "MH" 0))
</code>
<run id="56fcb784239b4">
(zeige-mir k1 4)
</run>
Umwandlung des Konvoi in einen einzigen Stream
<code id="56fcb784232e0">
(define deleteValue
(lambda (stm u)
(cond
([= u 0](stream-cons (stream-cdr (stream-item stm u)) (stream-cdr stm)))
(else (stream-cons (stream-car stm) (deleteValue (stream-cdr stm) (- u 1)))))))
(define konvoi->kette
(lambda (strBusse o u)
(cond
([= u 0] (stream-cons (stream-car (stream-item strBusse u)) (konvoi->kette (deleteValue strBusse u) (+ o 1)(+ o 1))))
(else (stream-cons (stream-car (stream-item strBusse u)) (konvoi->kette (deleteValue strBusse u) o (- u 1)))))))
</code>
<run id="56fcb78423b2c">
(zeig-mir (konvoi->kette k1 0 0) 20)
</run>
Check-In des Konvoi
<code id="56fcb78423354">
(set! hilberthotel (gehe-in-gerade hilberthotel 0))
(set! hilberthotel (hilbertCheckIn (konvoi->kette k1 0 0) hilberthotel))
</code>
<run id="56fcb78423be6">
(zeig-mir hilberthotel 42)
</run>
Wer wohnt in Zimmer 234?
<run id="56fcb78423ca1">
(stream-item hilberthotel 234)
</run>