BuK/IIm11/Studenten/sijeheid/hilbert

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>

== TODO ==

<code id="4f774a1063cae" >
;; Hilberthotel



(define konvoimacher
  (lambda (name [abteilung 0])
    (stream-cons (baue-hilbertbus (string-append name (number->string abteilung))) (konvoimacher name (+ abteilung 1)))
  )
)

(define zeig-mir-alt
  (lambda (stream [n null] [m null])
    (if (stream? stream)
        (if (stream? (stream-car stream))
            (begin ;; konvoi
             (if (<= n 0)
                 (if (<= m 0)
                     (printf "...~n")
                     (begin
                      (printf "..., ")
                      (zeig-mir stream 0 (- m 1))
                     )
                  )
                 (begin
                  (print-stream (stream-car stream) m)
                  (zeig-mir (stream-cdr stream) (- n 1) m)
                 )
             )
            )
            (print-stream stream n) ;; hotel oder bus
        )
        (display stream);; alles andere, zB kleinbus (liste)
    )
  )
)

;; berechnung der Umkehrfunktion der Paarungsfunktion
(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)
    )
  )
)

(define zimmer
  (lambda (nr stream)
    (if (<= nr 0)
        (stream-car stream)
        (zimmer (- nr 1) (stream-cdr stream))
    )
  )
)

(define konvoi->kette
  (lambda (konvoi [index 0])
    (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) (konvoi->kette konvoi (+ index 1)))
          )
        )
      )
     )
  )
)
</code>

<run id="4f75c77158263">


(printf "~nMacrohard macht Betriebsausflug mit folgenden Bussen (eine Zeile = 1 Bus):~n")
(define k1 (konvoimacher "MH"))
(zeig-mir k1 4 8)

(printf "~nPassagiere treten in folgender Reihenfolge zum Check-In an:~n")
(zeig-mir (konvoi->kette k1) 20)
(printf "Zimmerbelegung nach Check-In:~n")
(force (set! hilberthotel (gehe-in-gerade hilberthotel)))
(force (set! hilberthotel (check-in (konvoi->kette k1) hilberthotel)))
(zeig-mir hilberthotel 42)

(printf "~nWere wohnt in Zimmer 234?~n")
(zeig-mir (zimmer 234 hilberthotel))
</run>