Advent of Code

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Steinardo

    Zu deiner Frage, warum deine Funktion "None"zurückliefert, solange du die Variable nicht global machst.

    Du hast in deiner Funktion kein Rückgabe wert drin. Versuche es mal mit "return lower_number statt

    seat_return = lower_number

    somit braucht es die Zeile

    Zitat
    Code
    seat_row = seat_return

    nicht mehr, da der Rückgabewert der Funktion direkt an die aufrufende Stelle zurückgegeben wird.

    Zusätzlich ist zu erwähnen,das globale Variablen eigentlich nie gebraucht werden.

    Freundliche Grüsse

    Dani

    2 Mal editiert, zuletzt von dll-live (5. Dezember 2020 um 21:56) aus folgendem Grund: Beitrag verständlicher formuliert.

  • Hi

    Das habe ich auch Versucht aber mein Versuch mit return lower_number gab mir folgendes zurück

    Code
    Traceback (most recent call last):
      File "day5_part1.py", line 63, in <module>
        main()
      File "day5_part1.py", line 52, in main
        seat_id = calculate_seat_id(seat_row, seat_column)
      File "day5_part1.py", line 23, in calculate_seat_id
        return (row * 8) + column
    TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'

    Wenn ich den type des Rückgabewert ausgeben lasse bekomme ich <class 'NoneType'>. Und genau das Verstehe ich nicht. Daher der Ansatz mit global. Ich wusste mir nicht anders zu helfen. Daher ja auch meine Frage.


    Hier der nicht funktionierende Code
  • Hi Steinardo

    Anbei dein Code so modifiziert, dass er funktioniert:

    jetzt funktionierender Code

    Der Schlüssel lag in einem zweiten return. Das ist nötig, da du die Funktion rekursiv aufrufst. Bei der Zeile

    Zitat
    Code
    define_seat(lower_number, upper_number, rows_or_column)

    musste einfach noch ein return vorne drangestellt werden.

    Dann funktioniert es.

    Gruss Dani

  • Ich finde es interessant wie kompliziert man diese Umwandlung von der Zeichenfolge in eine ID ausdrücken kann. ? Darum hier mal ohne mein übliches Grundgerüst mit Klasse für die Bordkarten und Unit-Tests. Bei der Klasse ging ich noch davon aus, das im zweiten Aufgabenteil vielleicht Reihe und Spalte gebraucht werden, aber man braucht ja wirklich nur die ID für beide Aufgabenteile:

    Spoiler anzeigen

    Die `pairwise()`-Funktion wird in der Python-Dokumentation vom `itertools`-Modul beschrieben.

    Vielleicht wird jetzt klarer warum ich diese Aufgabe enttäuschend einfach fand wenn man sich die eine, bzw. zwei Zeilen anschaut, die man braucht um im Grunde direkt von der Buchstabenfolge zur ID zu kommen, ohne irgendwelche Schleifen, Rekursionen, Datenstrukturen, oder so. Die Abbildung ist einfach super-trivial.

    Im deutschsprachigen Python-Forum gibt's eine Code-Golf-Lösung für die Aufgabe in Python die 127 Zeichen hat.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Und wieder muss ich heute vor Part 2 ohne fremde Hilfe kapitulieren.

    Es wird mir gesagt das meine Zahl viel zu hoch ist - sieht jemand meinen Fehler?

  • Auf Anhieb sehe ich den Fehler nicht, tut mir leid. Mit meinen Inputdaten findet Dein Code für Teil 2 die folgenden 527 Zahlen:

    Code
    [15, 11, 23, 19, 8, 7, 2, 12, 4, 12, 1, 5, 5, 1, 3, 14, 8, 17, 2, 10, 0, 0, 12, 9, 5, 0, 6, 7, 6, 2, 3, 0, 7, 19, 16, 8, 14, 26, 4, 20, 4, 10, 3, 5, 4, 7, 15, 5, 11, 9, 12, 1, 20, 8, 5, 1, 0, 8, 2, 3, 12, 4, 0, 11, 4, 21, 0, 0, 0, 1, 0, 1, 6, 6, 2, 13, 2, 0, 0, 1, 1, 3, 0, 6, 23, 0, 0, 0, 19, 19, 4, 5, 6, 2, 5, 16, 0, 4, 2, 1, 10, 9, 7, 20, 1, 2, 14, 7, 22, 4, 17, 17, 4, 1, 2, 4, 1, 12, 14, 9, 0, 0, 4, 18, 21, 10, 5, 1, 17, 7, 9, 16, 9, 1, 13, 7, 1, 3, 9, 18, 23, 1, 3, 6, 13, 9, 12, 7, 2, 3, 4, 3, 7, 14, 7, 2, 0, 1, 11, 2, 2, 4, 7, 1, 7, 0, 9, 10, 4, 1, 0, 1, 1, 2, 7, 13, 17, 8, 2, 3, 0, 5, 22, 3, 1, 1, 4, 1, 21, 11, 17, 1, 1, 7, 7, 18, 3, 0, 0, 3, 2, 6, 18, 1, 8, 7, 13, 9, 1, 0, 0, 6, 16, 3, 16, 0, 3, 4, 0, 3, 2, 3, 1, 4, 7, 15, 10, 4, 9, 3, 4, 1, 14, 6, 2, 2, 10, 12, 0, 16, 3, 20, 10, 3, 8, 5, 19, 21, 23, 7, 15, 0, 0, 9, 15, 7, 11, 2, 5, 6, 2, 17, 6, 0, 19, 8, 1, 2, 5, 7, 2, 8, 6, 17, 11, 15, 6, 5, 2, 1, 7, 0, 0, 1, 17, 2, 13, 10, 15, 7, 9, 22, 0, 0, 15, 1, 3, 7, 8, 3, 8, 20, 7, 11, 2, 2, 2, 2, 4, 14, 10, 6, 9, 10, 5, 4, 1, 5, 10, 15, 0, 16, 9, 9, 2, 6, 16, 4, 0, 3, 7, 3, 21, 0, 1, 10, 2, 16, 18, 2, 14, 4, 13, 0, 5, 0, 0, 2, 2, 6, 20, 4, 7, 1, 3, 11, 4, 3, 14, 2, 1, 3, 3, 2, 6, 8, 1, 10, 15, 0, 1, 18, 6, 12, 0, 1, 3, 7, 17, 8, 4, 6, 4, 11, 13, 11, 9, 1, 2, 6, 0, 2, 8, 4, 4, 0, 12, 4, 7, 3, 6, 18, 19, 20, 12, 5, 5, 5, 8, 5, 5, 13, 8, 19, 0, 1, 1, 7, 2, 7, 9, 3, 21, 0, 2, 9, 6, 1, 6, 7, 23, 3, 0, 1, 1, 0, 2, 1, 16, 10, 13, 12, 12, 2, 3, 14, 15, 2, 0, 1, 10, 17, 10, 0, 0, 10, 3, 1, 2, 15, 10, 24, 2, 4, 0, 0, 0, 1, 5, 3, 1, 12, 6, 2, 5, 2, 0, 13, 14, 7, 16, 0, 0, 10, 0, 0, 8, 3, 2, 2, 0, 2, 1, 11, 10, 13, 7, 5, 6, 3, 9, 1, 0, 1, 10, 5, 0, 3, 4, 7, 7, 4, 1, 0, 2, 3, 10, 2, 12, 13, 13, 5, 13, 3, 12, 3, 0]

    Mein eigener, korrekter Code liefert:

    Code
    [15, 11, 23, 19, 8, 7, 2, 12, 4, 12, 1, 5, 5, 1, 3, 14, 8, 17, 2, 10, 0, 12, 9, 5, 0, 7, 6, 2, 3, 0, 7, 19, 16, 8, 14, 26, 4, 20, 4, 10, 3, 5, 4, 7, 15, 5, 11, 9, 12, 1, 20, 8, 5, 1, 0, 8, 2, 3, 12, 4, 0, 11, 4, 21, 0, 0, 0, 6, 6, 2, 13, 2, 0, 1, 1, 3, 0, 23, 0, 0, 19, 19, 4, 5, 6, 2, 5, 16, 0, 2, 1, 10, 9, 7, 20, 1, 2, 14, 7, 22, 4, 17, 17, 4, 1, 2, 4, 1, 12, 14, 9, 0, 4, 18, 21, 10, 5, 1, 17, 7, 9, 16, 9, 1, 13, 7, 1, 3, 9, 18, 23, 1, 3, 6, 13, 9, 12, 7, 2, 3, 4, 3, 7, 14, 7, 2, 0, 1, 11, 2, 2, 4, 7, 1, 7, 0, 9, 10, 4, 1, 0, 1, 1, 2, 7, 13, 17, 8, 2, 3, 0, 22, 3, 1, 1, 4, 1, 21, 11, 17, 1, 1, 7, 7, 18, 3, 0, 3, 2, 6, 18, 1, 8, 7, 13, 9, 1, 0, 6, 16, 3, 16, 0, 4, 0, 2, 3, 1, 4, 7, 15, 10, 4, 9, 3, 4, 1, 14, 6, 2, 2, 10, 12, 0, 16, 3, 20, 10, 3, 8, 5, 19, 21, 23, 7, 15, 0, 0, 9, 15, 7, 11, 2, 5, 6, 2, 17, 6, 0, 19, 8, 1, 2, 5, 7, 2, 8, 6, 17, 11, 15, 6, 5, 2, 1, 7, 0, 1, 17, 2, 13, 10, 15, 7, 9, 22, 0, 15, 1, 3, 7, 8, 3, 8, 20, 7, 11, 2, 2, 2, 2, 4, 14, 10, 6, 9, 10, 5, 4, 1, 5, 10, 15, 0, 16, 9, 9, 2, 6, 16, 4, 0, 3, 7, 3, 21, 0, 1, 10, 2, 16, 18, 2, 14, 4, 13, 0, 5, 0, 0, 2, 2, 6, 20, 4, 7, 1, 3, 11, 4, 3, 14, 2, 1, 3, 3, 2, 6, 8, 1, 10, 15, 0, 18, 6, 12, 0, 1, 3, 7, 17, 8, 4, 6, 4, 11, 13, 11, 9, 1, 2, 6, 0, 2, 8, 4, 4, 0, 12, 4, 7, 3, 6, 18, 19, 20, 12, 5, 5, 5, 8, 5, 5, 13, 8, 19, 0, 1, 7, 2, 7, 9, 3, 21, 0, 9, 6, 1, 6, 7, 23, 3, 0, 1, 0, 1, 16, 10, 13, 12, 12, 2, 3, 14, 15, 2, 0, 10, 17, 10, 0, 10, 3, 1, 2, 15, 10, 24, 2, 4, 0, 0, 1, 5, 3, 1, 12, 6, 2, 5, 2, 0, 13, 14, 7, 16, 0, 10, 0, 8, 3, 2, 2, 0, 1, 11, 10, 13, 7, 5, 6, 3, 9, 1, 0, 10, 5, 0, 4, 7, 7, 4, 1, 0, 3, 10, 2, 12, 13, 13, 5, 13, 3, 12, 3]

    Das sind lediglich 495 Einträge. Dein Code scheint also in einigen pathologischen Fällen zusätzliche Einträge zu generieren, die gefundenen Zählungen sind aber ansonsten korrekt.

    Ich finde Deine read_group_answers_2 übrigens schwer nachvollziehbar. Hier würden vielleicht ein paar Kommentare helfen, zu verstehen, was Du Dir bei jedem Schritt gedacht hat. Falls es Dir hilft, kannst Du Dich auch gerne von meinem Code inspirieren lassen.

    P.S. Was mir gerade noch auffällt: Dein Code scheint immer dann Fehler zu machen, wenn in der Gruppe zuvor keine einzige Antwort von allen ausgewählt wurde. Vielleicht hilft das ja bei der Suche.

    P.P.S. Nach nochmaligem Nachdenken ist eigentlich klar, was passiert. Tip: Schau Dir noch mal genau die Zeilen 37ff. an und überlege Dir, unter welchen Umständen Dein Code da reinläuft und was dann genau passiert.

    Einmal editiert, zuletzt von Manul (6. Dezember 2020 um 14:33) aus folgendem Grund: Falschen Code-Button erwischt.

  • Hofei: Mir ist die Funktion zu unübersichtlich. Die versucht irgendwie alles auf einmal zu machen, mit sehr generischen Namen, und auch noch einem ``continue``. Der Name `gruppen_antwort` ist auch falsch. Das ist ja nicht die Antwort der Gruppe, sondern die einer einzelnen Person. Und die kann man im Grunde auch sofort in eine Menge umwandeln. Das dürfte `antwort_set_2` sein, wenn ich das richtig sehe, und einfach `antwort` heissen. Während `antwort_set_1` wohl eigentlich `gruppenantwort` heissen sollte damit der Leser versteht was das bedeutet.

    Das `running`-Flag und das ``continue`` müssen da raus. Das ist zu kompliziert. Überleg Dir wie die Gruppenanwort für jede Gruppe initialisiert werden muss. Es ist *nicht* die leere Menge! Man hat da zwei Möglichkeiten: Die erste Zeile von jeder Gruppe mit eigenem Code behandeln — dann muss man `inhalt` zu einem Iterator machen und da an den ensprechenden Stellen im Programmablauf auf einzelne Zeilen rausholen. Oder, zweite, IMHO bessere Möglichkeit, man muss überlegen wie bei dem Wertebereich das neutrale Element bezüglich ``&`` aussehen muss, so dass man das als Startwert für jede Gruppe setzen kann und dann einfach jede Antwort in der Gruppe gleich behandeln kann.

    Noch Hinweise für die erste Teilaufgabe: Schau Dir mal die `list.extend()`-Methode an, dann kannst Du eine ``for``-Schleife einsparen.

    Für die zweite Teilaufgabe: `set()` kennst Du doch schon: ``set(items)`` ist kürzer als ``{item for item in items}``. Und auch bei ``&`` kann man wie bei vielen Operatoren statt ``a = a & b`` auch ``a &= b`` schreiben.

    Konkretes zur `count_answers()`:

    Python
    def count_answers(groups_answers):
        counters = []
        for answers in groups_answers:
            counters.append(len(answers))
        return counters

    Die lässt sich als „list comprehension“ schreiben:

    Python
    def count_answers(groups_answers):
        return [len(answers) for answers in groups_answers]

    Wenn man keine Liste braucht, sondern ein iterierbares Objekt reicht, geht das mit `map()` noch kürzer. Man kann auch gleich das `sum()` von den Aufrufstellen mit in die Funktion ziehen:

    Python
    def count_answers(groups_answers):
        return sum(map(len, groups_answers))

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Tag 6 in BASIC für den C64:

    Spoiler anzeigen

    Und Tag 4 in Python:

    Spoiler anzeigen

    Da nutze ich, dass das `attr`-Modul neben der Möglichkeit Attributwerte zu validieren, auch einen globalen Schalter bietet, um die Validierung zu deaktivieren. Aufgabenteil 1 läuft dann also ohne Validierung und Aufgabenteil 2 mit.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Hallo zusammen.

    Die heutige Aufgabe - habe ich geschafft - wie ihr auch :bravo2::bravo2::bravo2:

    Anbei mein lauffähiger Code

    lauffähiger Code -AoC Tag 6

    Es freut mich, wenn sich jemand meinen Code anschaut, und mir Tipps gibt, was ich besser/ schöner / schlanker machen könnte. Bin auf die Vorschläge gespannt. :daumendreh2:

    Freundliche Grüsse

    Dani

  • Guten Abend

    Ich bin auch gerade fertig geworden :bravo2:. Jetzt muss ich mir erstmal euren Code ansehen wie ihr das heute gelöst habt.

    Tag 6

    Gruss

    Steinardo

    P.s. mir ist kein Continuityfehler

  • dll-live Vorweg: Das liefert bei beiden Aufgabenteilen für meine Eingabedaten einen Wert der um 2 zu klein ist. Der Code zum einlesen hat einen Fehler sofern Du die Eingabedaten nicht um eine Leerzeile ergänzt hast.

    Das ist ziemlich schwer zu lesen. Also ich habe schon beim ersten drüberfliegen gemerkt, dass ich das nicht wirklich lesen will.

    In Klassennamen gehört kein `Class`, in Funktionsnamen gehört kein `func_`, und generell gehören in Namen keine Grunddatentypen.

    Klassen erkennt man an der MixedCase-Schreibweise, und Funktionen- und Methodennamen beschreiben in der Regel die Tätigkeit die sie durchführen. Dadurch kann man sie von eher ”passiven” Werten unterscheiden.

    Bei dem Grundatentypen in Namen ist das Problem das man den Typ im Laufe der Entwicklung mal ändern kann und dann entweder falsche, irreführende Namen im Code hat, oder man muss die überall anpassen. Ausserdem sind die manchmal viel zu einschränkend.

    Die ”Klasse” ist gar keine Klasse. Die hat keine Initialisierung und damit auch keinen Zustand und enthält nur eine ”Methode”, die zwar unsinnigerweise Attribute an Werte bindet, die aber auch nur im jeweiligen Aufruf verwendet, das sind also eigentlich einfach nur lokale Werte.

    Mal angenommen die Klasse würde eine sinnvolle sein, und es würde auch Sinn machen da genau ein Exemplar von zu erstellen, dann ist der Name `neues_zoll_formular` komisch. Warum `neues`? Wenn es eh nur eines gibt? Und Zollformular schreibt man zusammen.

    `datei_einlesen` ist kein guter Name für ein Datei-Objekt. Das ist einfach `datei`. Oder da hier in einer Schleife darüber iteriert wird, würde auch `zeilen` sinnvoll sein.

    Dann wird in der Schleife über die Zeilen iteriert, wobei die Zeile jeweils an den Namen `datei_zeile` gebunden wird. Und die Zeile ohne das letzte Zeichen gleich darauf an den Namen `zeile_datei`. Das schreit ja geradezu danach das man sich bei den Namen mal vertut und den falschen nimmt. Das sollte beides eigentlich `zeile` heissen. Das es aus einer Datei kommt, sieht man am Code und das ist letztlich auch egal wo die Zeile her kommt.

    Ich schrob extra, dass das letzte Zeichen entfernt wird und nicht, dass das Zeilenendezeichen entfernt wird, weil das nicht das selbe ist! Man entfernt nicht einfach so unbesehen das letzte Zeichen, denn das muss gar nicht das Zeilenendezeichen sein. Die letzte Zeile einer Datei sollte zwar damit abgeschlossen sein, muss sie aber nicht. Zeilenendezeichen entfernt man mit der `rstrip()`-Methode.

    `zwischenspeicher` ist recht generisch. Das sind die gesammelten Antworten einer Gruppe.

    Der Datentyp ist unpassend. Eine Zeichenkette immer wieder zu erweitern ist ineffizient weil Zeichenketten unveränderbar sind, und da jedes mal die alten und die neuen Daten in eine neue Zeichenkette kopiert werden müssen. Und diese Daten wachsen jedes mal. Der idiomatische Weg in Python ist es die Teilzeichenketten in einer Liste zu sammeln und am Ende mit der `join()`-Methode zusammenzufügen.

    Dann könnte man das `mit_abstand`-Argument durch den Trenner ersetzt. Also "" für keinen Abstand und " " für ein Leerzeichen zwischen den Antworten der Gruppenmitglieder.

    Der ``if __name__…``-Guard ist ja nicht schlecht, aber Code der dort Variablen definiert, definiert globale Variablen. Das gehört dann noch in eine Funktion.

    `mit_abstand` im Hauptprogramm wird definiert, aber nirgends verwendet.

    Das ``list(gruppe)`` bei der äusseren Schleife bei Aufgabe 1 ist überflüssig. Warum sollte man die Elemente noch mal in eine Liste kopieren wollen, statt gleich darüber zu iterieren?

    Üblicherweise sieht man ja oft zu kurze, nichtsagende Namen, aber es gibt auch das Gegenteil. Namen können auch zu lang sein. Wenn nicht mal zwei ”einfache” Namen und ein Operator in eine Zeile passen, ist was komisch, und Du hast da mehrere solcher Klopper.

    `unterschiedliche_antworten_in_der_gruppe` und `bereits_erhaltene_antworten_der_gruppe` sind auch nicht so gut voneinander zu unterscheiden. Eines enthält eine Liste mit Antworten, das andere eine Zahl. Wie kann man unterscheiden welches, welches ist?

    Wobei das egal ist, denn die Anzahl ist überflüssig. Der Zahlwert ist immer der Wert der Länge der Liste. Ist also überflüssig das noch mal extra mitzuzählen. Man kann einfach nach der Schleife die Länge der Liste abfragen.

    Zwischenstand:

    Spoiler anzeigen

    Aufgabenteil 2 ist mir dann wirklich zu unübersichtlich. Das ist zu viel Code und da wird zu viel gemacht. Ob das Listen kopieren in diesen ganzen Schleifen notwendig ist, sollte man prüfen, und `deepcopy()` braucht man wirklich sehr selten — fast nie. Es ist sicher einfacher wenn Du Dir erst einmal den `set`-Datentyp anschaust, und dessen Operationen, bevor ich versuche mich da durchzuarbeiten.

    Teil 1 wird mit `set()` hier zu:

    Spoiler anzeigen

    Mit `sum()` und einem Generatorausdruck, bekommt man das sogar in einen Ausdruck untergebracht:

    Spoiler anzeigen
    Python
        #
        # Teil 1
        #
        antworten_gesamtanzahl = sum(
            len(set(gruppe)) for gruppe in lade_gruppen(PFAD, "")
        )
        print(
            f"Aufgabe Teil 1: Zusamengezählte Anzahl der unterschiedlichen"
            f" Antworten aller Gruppen: {antworten_gesamtanzahl}"
        )

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Manul Innerhalb der Aufgabe oder zu vergangenen Aufgaben?

    Was mir aufgefallen ist, ist dass das Datenformat keine Personen abbilden kann, die gar keine Frage mit Ja beantwortet haben. Aber das wäre ja kein Continuity-Fehler.

    Edit: Könnte man erklären wenn das Formular eine Frage „Ich habe nichts zu verzollen“ enthält und ansonsten auch eine Liste mit zu verzollenden Waren(kategorien). Man also mindestens ein Kreuz machen muss.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Hallo __blackjack__

    Besten Dank für deine ausführliche Antwort.

    Zitat

    Der Code zum einlesen hat einen Fehler sofern Du die Eingabedaten nicht um eine Leerzeile ergänzt hast.

    => ja, ich habe die Eingabedaten um eine Leerzeile am schluss ergänzt.

    Bezüglich der Namenskonvention (Klasse, Funktion,"normale" Variable) -> Verstanden, wird in ZUkunft umgesetzt.

    Zitat

    Die ”Klasse” ist gar keine Klasse. Die hat keine Initialisierung und damit auch keinen Zustand und enthält nur eine ”Methode”, die zwar unsinnigerweise Attribute an Werte bindet, die aber auch nur im jeweiligen Aufruf verwendet, das sind also eigentlich einfach nur lokale Werte

    Sollte (oder muss) eine Klasse immer eine Initalisierung enthalten?

    In meiner Erinnerung habe ich mal gelesen, das Übergabewerte immer mit dem self Konstruktor an lokale Variablen gebunden werden sollten ist das dem Fall nicht gültig?

    Ok, wieder was (gleich mehrere Sachen) gelernt.

    Zitat

    Der ``if __name__…``-Guard ist ja nicht schlecht, aber Code der dort Variablen definiert, definiert globale Variablen. Das gehört dann noch in eine Funktion.

    Danke - auch in diesem Bereich was gelernt.

    Zitat

    `mit_abstand` im Hauptprogramm wird definiert, aber nirgends verwendet.

    Ja, der ist überfüssig.

    Zitat

    Üblicherweise sieht man ja oft zu kurze, nichtsagende Namen, aber es gibt auch das Gegenteil. Namen können auch zu lang sein. Wenn nicht mal zwei ”einfache” Namen und ein Operator in eine Zeile passen, ist was komisch, und Du hast da mehrere solcher Klopper.

    Versuche in der Zukunft einen Mittelweg zu finden - mal schauen was da raus kommt.

    Zitat

    Aufgabenteil 2 ist mir dann wirklich zu unübersichtlich. Das ist zu viel Code und da wird zu viel gemacht. Ob das Listen kopieren in diesen ganzen Schleifen notwendig ist, sollte man prüfen, und `deepcopy()` braucht man wirklich sehr selten — fast nie. Es ist sicher einfacher wenn Du Dir erst einmal den `set`-Datentyp anschaust, und dessen Operationen, bevor ich versuche mich da durchzuarbeiten.

    ok - Werde mir den 'set' Datentyp und dessen Operationen mal anschauen.

    Nun bin ich deine Antwort durch - meistens kann ich mich nur ernsthaft bedanken:danke_ATDE:, dass du dir die Zeit nimmst und Mühe machst, meinen Code anzuschauen und mir Tipps gibst. Finde das wirklich klasse:!::bravo2:

    Gruss Dani

  • Habe gerade mal geschaut ob es bei mir mehr Zollerklärungen als Passagiere an Tag 5 gegeben hat: Nein. Das kann es also (bei mir) nicht sein. Für weniger lassen sich Erklärungen finden. Beispielsweise falls Leute gar nicht über den Zielflughafen einreisen sondern sich dort nur im zollfreien Bereich für den Transit aufhalten.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Habe gerade mal geschaut ob es bei mir mehr Zollerklärungen als Passagiere an Tag 5 gegeben hat: Nein. Das kann es also (bei mir) nicht sein.

    Das war es allerdings, was ich meinte. In meinen Eingabedaten sind >1700 Zollerklärungen. Ich hatte angenommen, daß die Datensätze alle ähnlich groß wären. War dann wohl ein Irrtum meinerseits. Mich würde trotzdem interessieren, wie es bei den anderen aussieht.

  • Manul Verdammt, da habe ich mich verzählt. Bei mir sind's doch auch mehr Zollerklärungen als überhaupt potentiell Sitze vorhanden sind.

    Der Flug ging ja vom Nordpol — vielleicht fliegen da ja Elfen vom Weihnachtsmann mit. Die sind klein und könnten sich Sitze teilen. ?

    Oh, oder es gibt im Mittelgang Haltestangen/Stehplätze wie im Bus. Quasi ein Air-Bus. ? (Ich muss ins Bett bevor mir noch mehr flacher Unsinn einfällt!)

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • __blackjack__ Über doppelt belegte Sitze und Stehplätze hatte ich auch nachgedacht, auf die Elfen war ich aber nicht gekommen. Möglich wäre natürlich noch, daß manche Passagiere in mehreren Gruppen sind und – warum auch immer – je Gruppe eine unterschiedliche Zollerklärung ausfüllen müssen.

    Die heutige Aufgabe fand ich wieder recht nett.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!