Hilfe bei Python Programm

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Paulus145
User
Beiträge: 11
Registriert: Samstag 23. Oktober 2021, 12:10

Wie kommt es zu diesen Termin Nummern? Also bis zur 31 hoch 😅

Ansonsten sieht es nach ner guten Möglichkeit aus!
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Paulus145: Der Beispieldatensatz 5 hat 50 Mitglieder und 80 Termine. Hast Du Dir die noch nicht angeschaut/heruntergeladen?

Mein(e) Progamm(e) geben den Index + 1 aus, weil Menschen ja in der Regel bei Termin 1 anfangen und nicht bei Termin 0. Macht das Beispiel mit den originalen Bedingungen für einen „allseits beliebten“ Termin ja auch so.

Programme, Mehrzahl, weil ich das jetzt auch mal in BASIC auf meinem C64 umgesetzt habe. Hier der Testlauf aller Beispieldatensätze wo in der Zeile vor dem jeweiligen Ergebnis die Anzahmen der Mitglieder und Termine ausgegeben sind, und in der Zeile danach die Laufzeit in der Form HHMMSS. Das grösste Beispiel hat also, inklusive Datei einlesen (auf dem C64 notorisch langsam) fast 6 Minuten gebraucht:

Code: Alles auswählen

RUN
EINGABEDATENSATZ 0-5? 0
 6  7
AN TERMIN 6 SIND 2 WECHSEL.
000004

READY.
RUN
EINGABEDATENSATZ 0-5? 1
 5  5
AN TERMIN 2 SIND 1 WECHSEL.
000002

READY.
RUN
EINGABEDATENSATZ 0-5? 2
 8  10
AN TERMIN 4 SIND 0 WECHSEL.
000007

READY.
RUN
EINGABEDATENSATZ 0-5? 3
 14  20
AN TERMIN 18 SIND 7 WECHSEL.
000026

READY.
RUN
EINGABEDATENSATZ 0-5? 4
 26  40
AN TERMIN 22 SIND 14 WECHSEL.
000134

READY.
RUN
EINGABEDATENSATZ 0-5? 5
 50  80
AN TERMIN 31 SIND 34 WECHSEL.
000556

READY.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Paulus145
User
Beiträge: 11
Registriert: Samstag 23. Oktober 2021, 12:10

Habe eine Lösung mithilfe des Lehrers mit numpy und argv gefunden... trotzdem vielen Dank für die ganze Hilfe, konnte ich auch mit einbauen... riesen Dankeschön!
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Hast Du denn die gleichen Ergebnisse?

Das CBM BASIC-Programm sieht so aus:

Code: Alles auswählen

   10 INPUT"EINGABEDATENSATZ 0-5";F$:TI$="000000":GOSUB 500
  100 REM CALCULATE HOW MANY DATES HAVE
  110 REM A BETTER RANKING THAN EACH
  120 REM POSSIBLE RANKING FOR EACH MEMBER
  130 DIM H%(N,3)
  140 FOR I=1 TO N:FOR J=1 TO M:K=T%(I,J)+1:H%(I,K)=H%(I,K)+1:NEXT:NEXT
  150 FOR I=1 TO N:FOR J=0 TO 2:H%(I,J+1)=H%(I,J)+H%(I,J+1):NEXT:NEXT
  200 REM CALCULATE SWAP COUNTS FOR DATES
  210 DIM SC%(M)
  220 FOR I=1 TO N:FOR J=1 TO M:IF H%(I,T%(I,J))>0 THEN SC%(J)=SC%(J)+1
  230 NEXT:NEXT
  300 REM FIND SMALLEST SWAP COUNT AND DATE
  310 SC=SC%(1):D=1
  320 FOR I=1 TO M:IF SC%(I)<SC THEN SC=SC%(I):D=I
  330 NEXT:PRINT"AN TERMIN";D;"SIND";SC;"WECHSEL.":PRINT TI$:END
  500 REM LOAD PREFERENCE TABLE
  510 OPEN 1,8,2,"J2 INPUT "+F$+",S,R"
  520 GOSUB 600:N=X:GOSUB 600:M=X:DIM T%(N,M):PRINT N;M
  530 FOR I=1 TO N:FOR J=1 TO M:GOSUB 600:T%(I,J)=X:NEXT:NEXT:CLOSE 1:RETURN
  600 GET#1,C$:IF C$<"0" AND C$>"9" THEN 600
  610 X=0
  620 X=X*10+VAL(C$)
  630 GET#1,C$:IF C$<"0" OR C$>"9" THEN RETURN
  640 GOTO 620
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Paulus145
User
Beiträge: 11
Registriert: Samstag 23. Oktober 2021, 12:10

Habe für das letzte Beispiel als besten Termin Nr. 31 mit 34 Veränderten Beiträgen. Es wurde erst der beste Termin berechnet und dann die Anzahl an Wechsel der Bewertungen, kann gut sein, dass es mit einer anderen Reihenfolge etwas anders ausfällt :)
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das Ergebnis hatte ich doch auch für das Beispiel.

Hier ist mein Python-Programm ohne externe Abhängigkeiten und ohne die Optimierung aus dem BASIC-Programm:

Code: Alles auswählen

#!/usr/bin/env python3


def get_date_count(preference_table):
    return len(preference_table[0]) if preference_table else 0


def parse_lines(lines):
    rows = (list(map(int, line.split())) for line in lines)

    (member_count, date_count), *preference_table = rows

    if len(preference_table) != member_count or not all(
        len(row) == date_count for row in preference_table
    ):
        raise ValueError("mismatch between counts and table size")

    return preference_table


def has_swap(ratings, date_index):
    current_rating = ratings[date_index]
    return any(rating < current_rating for rating in ratings)


def calculate_swap_count(preference_table, date_index):
    return sum(has_swap(ratings, date_index) for ratings in preference_table)


def calculate_swap_counts(preference_table):
    return [
        calculate_swap_count(preference_table, date_index)
        for date_index in range(get_date_count(preference_table))
    ]


def get_result(swap_counts):
    return min(
        (swap_count, date_number)
        for date_number, swap_count in enumerate(swap_counts, 1)
    )


def main():
    for i in range(6):
        with open(f"praeferenzen{i}.txt", encoding="ascii") as lines:
            preference_table = parse_lines(lines)

        swap_counts = calculate_swap_counts(preference_table)
        swap_count, date_number = get_result(swap_counts)
        print(
            f"{i}: An Termin Nr. {date_number}"
            f" war{'' if swap_count == 1 else 'en'} {swap_count} Wechsel"
            f" notwendig."
        )


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten