BuK/IIm11/Studenten/sijeheid/hilbert

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Scheme</language>
<code id="4f75c771580bf">
(require-library 'sisc/libs/srfi/srfi-89)
(import srfi-89)

;; 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) (printf "...~n"))
      (else
       (printf "~a, " (stream-car stm))
       (print-stream (stream-cdr stm) (- n 1))))))

;; Hilberthotel
(define baue-hilberthotel
  (lambda ()
    (stream-cons "#f" (baue-hilberthotel))
  )
)
(define baue-kleinbus
  (lambda (name count)
    (if (> count 0) 
        (append (baue-kleinbus name (- count 1)) (list (cons name count)))
        (list (cons name count))
    )
  )
)
(define baue-hilbertbus
  (lambda (name [start 0])
    (stream-cons (cons name start) (baue-hilbertbus name (+ start 1)))
  )
)
(define konvoimacher
  (lambda (name [abteilung 0])
    (stream-cons (baue-hilbertbus (string-append name (number->string abteilung))) (konvoimacher name (+ abteilung 1)))
  )
)
(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)))
    )
  )
)
(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 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 gehe-in-gerade
  (lambda (hotel-stream)
    (stream-cons (stream-car hotel-stream) (stream-cons "#f" (gehe-in-gerade (stream-cdr hotel-stream))))
  )
)
(define zeig-mir
  (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">
(define hilberthotel (baue-hilberthotel))
(zeig-mir hilberthotel 11)

(printf "~nEinzelbuchungen:~n")
(force (set! hilberthotel (einzelbuchung "Otto Grundmann" hilberthotel 3)))
(force (set! hilberthotel (einzelbuchung "Hella Milkel" hilberthotel 2)))
(force (set! hilberthotel (einzelbuchung "Heribert Wuischke" hilberthotel 7)))
(zeig-mir hilberthotel 12)

(printf "~nKleingruppe reist an:~n")
(define kleinbus815 (baue-kleinbus 815 8))
(zeig-mir kleinbus815)
(printf "~nZimmerbelegung nach Check-In:~n")
(force (set! hilberthotel (kleingruppenbuchung kleinbus815 hilberthotel)))
(zeig-mir hilberthotel 15)

(printf "~ngroooßer Hilbertbus kommt angefahren:~n")
(define bus3813 (baue-hilbertbus 3813))
(zeig-mir bus3813 8)
(printf "Zimmerbelegung nach Check-In:~n")
(force (set! hilberthotel (check-in bus3813 hilberthotel)))
(zeig-mir hilberthotel 20)

(printf "~nTelefonanruf: groooßer Hilbertbus 33 kündigt sich an:~n")
(define bus33 (baue-hilbertbus 33))
(zeig-mir bus33 8)
(printf "Jeder Gast zieht in ein gerades Zimmer:~n")
(force (set! hilberthotel (gehe-in-gerade hilberthotel)))
(zeig-mir hilberthotel 30)
(printf "Bus 33 kommt: Zimmerbelegung nach Check-In:~n")
(force (set! hilberthotel (check-in bus33 hilberthotel)))
(zeig-mir hilberthotel 30)

(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>