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 1)
                 (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 id="5d02a4d9315a5">(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 id="5d02a4d9317e3">(zeig-mir-konvoi k1 6 4)</run>


Hilfsfunktionen 

<code id="5d02a4d931646">

(define get_element
        (lambda (stm platznummer)
          (stream-item stm platznummer)))

(define get_busstream
  (lambda (konvoi busnummer)
    (stream-item konvoi busnummer)))


(define baue_zeilealsliste
  (lambda (stm zeile start test)
    (cond
      ([= zeile 0] (append test  (list(get_element (get_busstream stm 0) start)) ))
      (else
       (append test   (list(get_element (get_busstream stm zeile) start)) (baue_zeilealsliste stm (- zeile 1)(+ start 1) test))
       ))))

</code>


<code id="5d02a4d9316f0">
(define konvoi->kette
  (lambda (liste index stm)
    (cond
      ( [null? liste]
         (konvoi->kette (baue_zeilealsliste stm index 0 '() ) (+ index 1) stm))
        (else
         (stream-cons (car liste)(konvoi->kette (cdr liste) index stm))
    ))))</code>

<run id="5d02a4d93186e">(zeig-mir (konvoi->kette '() 0 k1) 20) </run>