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>