BuK/IIm20/Vorlesung 2 Grüning/Hilbert Python

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Python</language>
<code id="60717516e7a6a">
import copy
import math


class stream:

    def make_stream(self):
        n = False
        while True:
            yield n

    def __init__(self, *args):
        self.li = []
        if len(args) > 0:
            self.stream = args[0]

        else:
            self.stream = self.make_stream()

    def anext(self):
        try:
          item = next(self.stream)
        except TypeError:
          item = next(self.stream.get_infinite())
        self.li.append(item)
        return item

    def next_until(self, n):
        if n < len(self.li):
            return self.li[n]
        else:
            item = None
            while n >= len(self.li):
                item = self.anext()
        return item

    def get(self, n):
        if n >= len(self.li):
            return self.next_until(n)
        else:
            return self.li[n]

    def get_finite(self):
        return self.li

    def get_infinite(self):
        return self.stream

    def einzelbuchung(self, n, value, error=True):
        self.get(n)
        if self.li[n] == False:
            self.li[n] = value
            return 0
        else:
            if error:
                print(f"Error in einzelbuchung: Zimmer {n} ist belegt! Hier wohnt {self.li[n - 1]}")
            return -1

    def zeig_mir(self, n, seats = -1, p=True):
        if seats >= 0:
              ret = []
              for i in self.zeig_mir(n, -1, False):
                  ret.append(i.zeig_mir(seats, -1, p))
              return ret
        else:
          self.get(n - 1) #-?
          ret = self.get_finite()[0:n]
          if p:
              ret.append("...")
              print(ret)

          return ret

    def kleingruppenbuchung(self, finite_bus):
        for i, value in enumerate(finite_bus):
            pos = i
            while self.einzelbuchung(pos, value, False) == -1:
                pos += 1

    def fill_finite_part(self, infinite_bus):
        finite_size = len(self.li)
        f = infinite_bus.zeig_mir(finite_size, -1, False)
        self.kleingruppenbuchung(f)


    def imerge(self, a, b):
        for i, j in zip(a, b):
            yield i
            yield j

    def i_bus_merge(self, a, b):
        while True:
            i = next(a)
            j = next(b)
            if i == False:
                i = next(a)
                if i == False:
                    yield j
                else:
                    yield i
                    yield j
            else:
                yield i
                yield j

    def check_in(self, infinite_bus):
        self.fill_finite_part(infinite_bus)
        self.stream = self.i_bus_merge(self.stream, infinite_bus.get_infinite())


    def gehe_in_gerade(self):
        li_copy = copy.copy(self.li)
        f = len(self.li)
        self.li.extend([False] * f)
        for i, value in list(enumerate(li_copy))[::-1]:
            new_index = 2 * i
            self.li[new_index] = li_copy[i]
            if i != 0:
                self.li[i] = False
        self.stream = self.imerge(self.stream, self.make_stream())


hilberthotel = stream()
hilberthotel.zeig_mir(11)

print("EINZELBUCHUNGEN")
hilberthotel.einzelbuchung(3, "Otto Grundmann")
hilberthotel.zeig_mir(12)

hilberthotel.einzelbuchung(2, "Hella Milkel")
hilberthotel.einzelbuchung(3, "Heribert Wuischke")
hilberthotel.einzelbuchung(7, "Heribert Wuischke")
hilberthotel.zeig_mir(12)
print()


class finite_bus:
    def __init__(self, id, places):
        self.id = id
        self.places = places

    def zeig_mir(self, p=True):
        li = [tuple((self.id, i)) for i in range(self.places + 1)]
        if p:
            print(li)
        return li


print("KLEINBUS")
kleinbus815 = finite_bus(815, 8)
kleinbus815.zeig_mir(False)

hilberthotel.kleingruppenbuchung(kleinbus815.zeig_mir(False))
hilberthotel.zeig_mir(15)
print()


def make_infinite_bus(bus_id):
    n = 0
    t = tuple((bus_id, n))
    while True:
        yield t
        n += 1
        t = tuple((bus_id, n))


print("UNENDLICHER BUS")
bus3813 = stream(make_infinite_bus(3813))
bus3813.zeig_mir(8)
hilberthotel.check_in(bus3813)
hilberthotel.zeig_mir(20)
print()

print("GEHE IN GERADE")
hilberthotel.gehe_in_gerade()
hilberthotel.zeig_mir(45)
print()

print("2. UNENDLICHER BUS")
bus33 = stream(make_infinite_bus(33))

hilberthotel.check_in(bus33)

hilberthotel.zeig_mir(130)
print()

print("KONVOI")



class konvoi:
  def __init__(self, id):
    self.id = id
    self.places = places

def konvoi_macher(id):
  number = 0
  while True:
    yield stream(make_infinite_bus(id + str(number)))
    number += 1


k1 = stream(konvoi_macher("MH"))
k1.zeig_mir(6, 4, True)
print()
k1.zeig_mir(6, 4, False)

def konvoi_kette(konvoi):
    def get_x_y(z):
      w = math.floor((math.sqrt(8*z + 1) - 1) / 2)
      y = z - w*(w + 1) / 2
      x = w - y
      return int(x), int(y)


    def make_konvoi_kette(konvoi):
      n = 0
      ret = []
      while True:
        x, y = get_x_y(n)
        yield konvoi.zeig_mir(x + 1, y + 1, False)[x][y]
        n += 1
    return stream(make_konvoi_kette(konvoi))


kk = konvoi_kette(k1)

hilberthotel.gehe_in_gerade()
hilberthotel.check_in(stream(kk))
hilberthotel.zeig_mir(42)

print(hilberthotel.zeig_mir(235, -1, False)[234])
</code>