IIm18-Kreativaufgabe1

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>SchemeJS</language>
== Aufgabenstellung ==


Modellieren Sie die skurrilen Deutungen von Unendlichkeit am Beispiel [https://web1.hszg.de/cwagenknecht-lehre/TI/Berechenbarkeitstheorie/VL/hilbertbus-CW.pdf ”Hilbertbus“] im ProgrammingWiki.

Wer wohnt in Zimmer 234? Hinweis: Verwenden Sie streams.

Arbeiten Sie im Team an Verbesserungen und ggf. an Erweiterungen.


=== Hilfsfunktionen ===

<code id="5cfd7282efed6">
;Streambehandlung
(define stream-car car)

(define stream-cdr
  (lambda (stm)
    (force (cdr stm))))


;; Konstruktoren

(define-macro (stream-cons head tail)
  `(cons ,head (delay ,tail)))

(define stream-item
  (lambda (str k)
    (if (= k 0)
        (stream-car str)
        (stream-item (stream-cdr str) (- k 1)))))


</code>

=== Hotel bauen ===


<code id="5cfd7282eff44">(define baue-hilberthotel
  (lambda ()
    (stream-cons #f (baue-hilberthotel)))
  )
</code>

<code id="5cfd7282effa7">(define hilberthotel (baue-hilberthotel))</code>

<code id="5cfd7282f0006">(define zeig-mir
  (lambda (stm n)
    (cond
      ((= n 0)
       (cond
         ((null? stm) (display ""))
         (else
          (display "...\n"))))
      (else
       (display (stream-car stm))
       (zeig-mir (stream-cdr stm) (- n 1))))))
</code>
<run id="5cf7eff092710">(zeig-mir hilberthotel 12)</run>

=== Einzelbuchung ===


<code id="5cfd781038155">(define einzelbuchung
  (lambda (s str roomold)
    (let ([s s] [str str] [room roomold])
      (letrec
          ((helper
            (lambda (s str room)
              (cond ((= room 0)
                     (cond ((eq? (stream-car str) #f)
                            (stream-cons s (stream-cdr str)))
                           (else
                            (string-append "Error in einzelbuchung: Zimmer " (format "~a " roomold) " ist belegt. Hier wohnt " (stream-car str) ".")
                            )))
                    (else
                     (stream-cons  (stream-car str) (helper s (stream-cdr str) (- room 1)) 
                                   )))
              )))
        (helper s str room)))))

(set! hilberthotel (einzelbuchung "Otto Grundmann" hilberthotel 3))
(set! hilberthotel (einzelbuchung "Hella Milkel" hilberthotel 2))
(set! hilberthotel (einzelbuchung "Heribert Wuischke" hilberthotel 7))</code>


<run id="5cfd781038385">(zeig-mir hilberthotel 15)</run>

=== Baue Kleinbus ===

<code id="5cfd781038203">

(define baue-kleinbus
  (lambda (nr anzahl)
    (let ([anz anzahl] [nr nr] )
      (letrec
          ((helper
            (lambda (anz)
              (cond
                ((< anz 0)
                 (display ""))
                (else (stream-cons (cons nr (- anzahl anz)) (helper ( - anz 1)))))
              )))
        (helper anz)
        ))))

(define kleinbus0815 (baue-kleinbus 815 8))</code>

<run id="5cfd781038469">(zeig-mir kleinbus0815 8)</run>

=== Kleingruppenbuchung ===

<code id="5cfd7810382cc">(define kleingruppenbuchung
  (lambda (bus hotel)
    (cond ((js-undefined? bus) hotel)
          (else
           (cond ((eq? (stream-car hotel) #f)
                  (stream-cons (stream-car bus) (kleingruppenbuchung (stream-cdr bus) (stream-cdr hotel)))
                  )
                 (else
                  (stream-cons (stream-car hotel) (kleingruppenbuchung bus (stream-cdr hotel)))))))))


(set! hilberthotel (kleingruppenbuchung kleinbus0815 hilberthotel))</code>

<run id="5cfdf3b680ae5">(zeig-mir hilberthotel 15)</run>

=== baue Hilbertbus ===

<code id="5cfdf3b680991">; Hilbertbus

(define baue-hilbertbus
  (lambda (nr)
    (let ([anz 0] [nr nr] )
      (letrec
          ((helper
            (lambda (anz)
                (stream-cons (cons nr anz) (helper (+ anz 1)))))
              )
        (helper anz)
        ))))

(define bus3813 (baue-hilbertbus 3813))</code>

=== check-in Hilbertbusgäste ===


<code id="5cfdf3b680a45">(define check-in
  (lambda (bus hotel)
    (cond ((js-undefined? bus) hotel)
          (else
           (cond ((eq? (stream-car hotel) #f)
                  (stream-cons (stream-car bus) (check-in (stream-cdr bus) (stream-cdr hotel)))
                  )
                 (else
                  (stream-cons (stream-car hotel) (check-in bus (stream-cdr hotel)))))))))


(set! hilberthotel (check-in bus3813 hilberthotel))</code>

<run id="5cfdf3b680b51">(zeig-mir hilberthotel 30)</run>

=== Umzug nach gerade ===


<code id="5cfe385e8dbe9">(define gehe-in-gerade
  (lambda (stm)
    (let ([stm stm] [index 0])
      (letrec
          ((helper
            (lambda (stm index)
              (cond
                ([even? index]  (stream-cons (stream-car stm) (helper (stream-cdr stm) (+ index 1))))
                (else  (stream-cons #f (helper stm (+ index 1)))))   
              )))
        (helper stm index))))) 

(set! hilberthotel (gehe-in-gerade hilberthotel))
</code>

<run id="5cfe385e8dd24">(zeig-mir hilberthotel 30)</run>

<code id="5cfe385e8dc80">(define bus33 (baue-hilbertbus 33))

(set! hilberthotel (check-in bus33 hilberthotel))</code>

<run id="5cfe385e8dd9a">(zeig-mir hilberthotel 30)</run>

=== Konvoi ===

<code>(define konvoimacher
  (lambda (str)
    (let ([str str] [index 0] [anz 0])
      (letrec
          ((helper
            (lambda (str index)
              (stream-cons (baue-hilbertbus (string-append str (format "~a " index))) (helper str (+ index 1))))))
        (helper str index)))))

(define k1 (konvoimacher "MH"))

(define zeig-mir-konvoi
  (lambda (stm n platz)
       (let ([stm stm][ n n ][n2 platz] [z 0])
         (letrec
             ((helper
               (lambda (z)
                 (cond
                   ((= n 0)(display ""))
                   (else
                    (cond
                      ((= z n2) (display "...\n")(zeig-mir-konvoi (stream-cdr stm) (- n 1) platz))
                      (else
                       (display (stream-item (stream-car stm) z) )
                       (helper (+ z 1)))))
                   ))))
           (helper z )))))</code>

<run>(zeig-mir-konvoi k1 6 4)</run>