Wie kommt es zu diesen Termin Nummern? Also bis zur 31 hoch
Ansonsten sieht es nach ner guten Möglichkeit aus!
Hilfe bei Python Programm
- __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:
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
- __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:
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
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
- __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:
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