garten-additiv.py
von chrbr- SNIPPET_DESC:
- garten-additiv.py
- SNIPPET_CREATION_TIME:
- 07.04.2023 02:21:08
- SNIPPET_PRUNE_TIME:
- Unendlich
- SNIPPET_TEXT:
-
- #!/usr/bin/env python3
- #======================================================================
- # Basierend auf der Arbeit von Huo
- # Der Graphentheorethische Teil ist per Hand gemacht.
- # Beginnend mit der Hauptpflanze werden zusätzliche Pflanzen
- # hinzu gefügt. Bei Unverträglichkeit wird diese Gruppe verworfen.
- # Ansonsten wird weiter gemacht bis man in keiner der Gruppen noch
- # eine Pflanze hinzufügen kann.
- #
- # Gute und schlechte Pflanzennachbarn müssen in zwei getrennten csv-Dateien
- # friends.csv und enemies.csv
- # in der Form PFLANZE1,PFLANZE2 hinterlegt sein (ein Paar pro Zeile)
- #
- # Die Pfade in den Zeilen 24 und 25 sind bei Bedarf anzupassen!
- #
- # Aufruf:
- # garten_dazu.py HAUPTPFLANZE
- # wobei HAUPTPFLANZE ein einzelner Name aus der Datei friends.csv ist
- #======================================================================
- import csv
- import itertools
- import os
- import sys
- # Einlesen der beiden csv-Dateien (Pfade bei Bedarf anpassen!) als Listen zwei-elementiger Mengen
- # Plausibilitätsprüfung der Listen auf widersprüchliche Nachbarbeziehungen
- if [s for s in friends if s in enemies] != []:
- print("Pflanzenpaar darf nicht zugleich in friends.csv und enemies.csv liegen")
- print("Dubletten:", [s for s in friends if s in enemies])
- # Check Parameter
- if not [i for i in friends if sys.argv[-1] in i] or len(sys.argv) != 2:
- print("Script muss mit einer Einzelpflanze aus friends.csv als einzigem Parameter aufgerufen werden!")
- hauptpflanze = sys.argv[1]
- # Gute Nachbarn der Hauptpflanze (Liste der Paare {Hauptpflanze, Guter Nachbar})
- # Menge der guten Nachbarn der Hauptpflanze
- fh = set().union(*friends_h)
- # Kombinationen dieser guten Nachbarn als Liste zwei-elementiger Mengen
- # darunter schlechte Nachbarn
- # Typen
- # friends <class 'list'>
- # enemies <class 'list'> of set as pair of fruits
- # enemies_c <class 'list'> of list as pair of fruits
- # friends_h <class 'list'>
- # fc <class 'list'>
- # fh <class 'set'>
- # print("friends", type(friends))
- # print("enemies", type(enemies))
- # print("enemies_c", type(enemies_c))
- # print("friends_h", type(friends_h))
- # print("fc", type(fc))
- # print("fh", type(fh))
- # Ausgabe der Guten Nachbarn der Hauptpflanze
- print ("-------------------------------------")
- print ("Gute Nachbarn von", hauptpflanze, ":")
- fh_d = fh
- fh_d.discard(hauptpflanze)
- print (*sorted(fh_d), sep=", ")
- print ()
- # Ausgabe der Paare schlechter Nachbarn:
- print ("Darunter harmonieren nicht:")
- print (*sorted(enemies_c), sep="\n")
- print ()
- # Zuerst wird eine sortierte Liste der Freunde der Hauptpflanze erzeugt.
- # Die wird in den Iterationen verwendet zum probeweisen Hinzufügen
- # von Pflanzen zu existierenden Gruppen.
- # sgroups sind die Eingangsgruppen in jeden Itrationsschritt.
- # Es wird für alle Elemente von lfriennds versucht, sie den
- # einzelnen Gruppen hinzuzufügen. NICHT: Dabei wird in lfriends nur nach rechts
- # von der hinzuzufügenden Pflanze gesucht. Die Kombinationen nach links wurden
- # implizit schon abgearbeitet und würden nur als Dubletten auftauchen.
- sgroups = set()
- for friend in lfriends:
- sgroups.add(frozenset([friend]))
- skandidat = frozenset(lfriends)
- lfinal = []
- etwas_erweiterbar = True
- while etwas_erweiterbar:
- snext = set()
- etwas_erweiterbar = False
- for group in sgroups:
- erweitert = False
- for kandidat in skandidat-group:
- vertraeglich = True
- for pflanze in group:
- vertraeglich = vertraeglich and set([kandidat, pflanze]) not in enemies
- if vertraeglich:
- erweitert = True
- etwas_erweiterbar = True
- tmp = set(group)
- tmp.add(kandidat)
- snext.add(frozenset(tmp))
- if not erweitert:
- ltmp.append(hauptpflanze)
- lfinal.append(sorted(ltmp))
- # Ausgabe der Mischkulturen (sortiert nach Größe)
- print ("Mögliche Mischkulturen:")
Quellcode
Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN