From 1b093be47d99ed0563ae674fef028cdbd6bdf3f5 Mon Sep 17 00:00:00 2001 From: luise jedlitschka Date: Mon, 6 Feb 2023 11:38:13 +0100 Subject: [PATCH] erste Fassung von Michael eingecheckt --- Roundabouts.py | 244 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 Roundabouts.py diff --git a/Roundabouts.py b/Roundabouts.py new file mode 100644 index 0000000..e63f996 --- /dev/null +++ b/Roundabouts.py @@ -0,0 +1,244 @@ +import unittest + + + +class Roundabout: + def __init__(self, rotation = 0): + self.coatHangers = list() + self.rotation = rotation + + def addList(self, items): + for item in items: + self.add(item) + + def add(self, item): + if self.rotation == 0: #linksdrehend + self.coatHangers.insert(0, item) + else: + self.coatHangers.append(item) + + def remove(self): + if self.rotation == 0: #linksdrehend + return self.coatHangers.pop() + else: + return self.coatHangers.pop(0) + + def content(self): + return self.coatHangers + + def itemOnSeparator(self): + if self.rotation == 0: #linksdrehend + return self.coatHangers[-1] + else: + return self.coatHangers[0] + + def getSmallestItem(self): + return min(self.coatHangers) + + def isEmpty(self): + return len(self.coatHangers) == 0 + + +class Switch: + def __init__(self, left_roundabout: Roundabout, right_roundabout: Roundabout): + self.lR = left_roundabout + self.rR = right_roundabout + self.set_to_left() + + def switch(self): + if self.is_left(): + self.set_to_right() + else: + self.set_to_left() + + def set_to_left(self): + self.status = 0 + return self.status + + def set_to_right(self): + self.status = 1 + return self.status + + def is_left(self): + if self.status == 0: + return True + return False + + def is_right(self): + if self.status == 1: + return True + return False + + def assign(self, item): + if self.is_left(): + self.lR.add(item) + else: + self.rR.add(item) + + +class RoundaboutPair: + def __init__(self, left_roundabout: Roundabout, right_roundabout: Roundabout, switch: Switch): + self.lR = left_roundabout + self.rR = right_roundabout + self.sw = switch + self.sortProcedure = "p" # picksort + + def setSortType (self, t): + """ param t: walweise p(icksort) oder t(uplesort) + """ + self.sortProcedure = t + + def sortStep(self): + if self.sortProcedure == "p": # picksort + if self.lR.getSmallestItem() == self.lR.itemOnSeparator(): + item = self.lR.remove() + self.sw.set_to_right() + self.sw.assign(item) + self.sw.set_to_left() + else: + item = self.lR.remove() + self.sw.assign(item) + else: # tuplesort + self.sw.set_to_right() + runSorting = True + while runSorting: + maxOfLastItems = self.passageOfSeparatorItems() + leftItem = self.lR.itemOnSeparator() + rightItem = self.rR.itemOnSeparator() + minOfCurentSeparatorItems = min(leftItem, rightItem) + if maxOfLastItems > minOfCurentSeparatorItems: + self.sw.switch() + if self.lR.isEmpty(): + runSorting = False + + + + def passageOfSeparatorItems(self): + if self.lR.itemOnSeparator() < self.rR.itemOnSeparator(): + leftItem = self.lR.remove() + self.sw.assign(leftItem) + rightItem = self.rR.remove() + self.sw.assign(rightItem) + else: + rightItem = self.rR.remove() + self.sw.assign(rightItem) + leftItem = self.lR.remove() + self.sw.assign(leftItem) + return max(rightItem, leftItem) + + + def runSimulation(self): + number = 0 + while not self.lR.isEmpty(): + self.sortStep() + number += 1 + if number > 300: + break + + def show(self): + return (self.lR.content(), self.rR.content()) + + + + + +class TestObjectMethods(unittest.TestCase): + def test_roundabout(self): + k1 = Roundabout() + k1.addList([1, 2, 3]) + self.assertEqual(k1.content(), [3, 2, 1]) + self.assertEqual(k1.remove(), 1) + self.assertEqual(k1.content(), [3, 2]) + + k2 = Roundabout() # links drehend + k2.add(1) + k2.add(2) + k2.add(3) + k2.add(4) + self.assertEqual(k2.content(), [4, 3, 2, 1]) + + k3 = Roundabout(1) # rechts drehend + k3.add(5) + k3.add(6) + k3.add(7) + k3.add(8) + self.assertEqual(k3.content(), [5, 6, 7, 8]) + + + + self.assertEqual(k2.itemOnSeparator(), 1) + self.assertEqual(k3.itemOnSeparator(), 5) + + + self.assertEqual(k3.remove(), 5) + self.assertEqual(k2.remove(), 1) + + k5 = Roundabout() + self.assertEqual(k5.isEmpty(), True) + k5.addList([1, 2, 3]) + self.assertEqual(k5.isEmpty(), False) + self.assertEqual(k5.getSmallestItem(), 1) + + + def test_switch(self): + k1 = Roundabout() + k2 = Roundabout() + sw = Switch(k1, k2) + self.assertEqual(sw.set_to_left(), 0) + sw.set_to_right() + self.assertEqual(sw.is_right(), True) + self.assertEqual(sw.is_left(), False) + + def test_pair(self): + lK = Roundabout() + lK.addList([6, 5, 4, 3, 2, 1]) + rK = Roundabout(1) + sw = Switch(lK, rK) + p = RoundaboutPair(lK, rK, sw) + self.assertEqual(lK.content(), [1, 2, 3, 4, 5, 6]) + self.assertEqual(p.show(), ([1, 2, 3, 4, 5, 6], [])) + + p.sortStep() + self.assertEqual(p.show(), ([6, 1, 2, 3, 4, 5], [])) + p.sortStep() + self.assertEqual(p.show(), ([5, 6, 1, 2, 3, 4], [])) + p.sortStep() + self.assertEqual(p.show(), ([4, 5, 6, 1, 2, 3], [])) + p.sortStep() + self.assertEqual(p.show(), ([3, 4, 5, 6, 1, 2], [])) + p.sortStep() + self.assertEqual(p.show(), ([2, 3, 4, 5, 6, 1], [])) + p.sortStep() + self.assertEqual(p.show(), ([2, 3, 4, 5, 6], [1])) + + def test_picksort(self): + lK = Roundabout() + lK.addList([6, 5, 4, 3, 2, 1]) + rK = Roundabout(1) + sw = Switch(lK, rK) + p = RoundaboutPair(lK, rK, sw) + self.assertEqual(lK.content(), [1, 2, 3, 4, 5, 6]) + + p.runSimulation() + self.assertEqual(p.show(), ([], [1, 2, 3, 4, 5, 6])) + + def test_tuplesort(self): + lK = Roundabout() + lK.addList([3, 2, 1]) + rK = Roundabout(1) + rK.addList([6, 5, 4]) + sw = Switch(lK, rK) + p = RoundaboutPair(lK, rK, sw) + self.assertEqual(p.show(), ([1, 2, 3], [6, 5, 4])) + p.setSortType('t') + + p.sortStep() + self.assertEqual(p.show(), ([1, 2], [5, 4, 3, 6])) + + + + +if __name__ == '__main__': + unittest.main() + +