drei beliebige Zahlen doppelt

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.
Antworten
Florian Jochum
User
Beiträge: 8
Registriert: Montag 15. Januar 2018, 16:28

Hey Leute nachdem ich mich im Forum angemeldet habe, habe ich nun auch direkt meine erste Frage:
Ich programmiere grade ein Wüefelspiel, und möchte dort überprüfen, ob 3 beliebige Zahlen zwischen 1 und 6 doppelt vorkommen. Als Variablen habe ich die Buchstaben c, d, e, f, g, und h vorgesehen. Als möglichkeiten habe ich if und while zur verfügung. Über eine Rückmeldung eurerseits würde ich mich freuen.

P.S.: Falls das Thema im falschen Bereich ist, bitte ich um Verzeihung, und es möge dann doch verschoben werden
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na dann zeig doch mal was du hast. Hausaufgabenhilfe geben wir, fertige Loesungen werden hier eher ungerne verteilt.
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

Moin,

eine Möglichkeit, wie man das Problem einfach lösen könnte, wäre, die richtige Datenstruktur für das Problem zu wählen. Sechs verschiedene Variablen sind im Gegensatz zu einer einzelnen, die alle sechs Werte umfasst und bestenfalls noch sinnvolle Operationen auf den Werten bereitstellt, doch schon recht unhandlich.
Florian Jochum
User
Beiträge: 8
Registriert: Montag 15. Januar 2018, 16:28

Code: Alles auswählen

c = 1
d = 1
e = 2
f = 2
g = 3
h = 3

if c == d or c == e or c == f or c == g or c == h and d == e or d == f or d == g or d == h and e == f or e == g or e == h:
    j = 1000
else:
    j = 0

print(j)
Das ist das was ich habe. Prinzipiell müste es funktionieren, ändere ich jedoch eine 3 in eine 2, so gibt er trotzdem die 1000 aus, und nicht die 0, welche ausgegeben werden sollen.
Es soll einfach nur überprüfen, ob 3 beliebige zahlen doppelt vorkommen. Mehr muss es nicht können.

P.S.: Ist nur der Auszug. Sonst wären es ca. 120 Zeilen Quellcode
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Florian Jochum: ok, so langsam verstehe ich die Frage. Du hast also nicht drei beliebige Zahlen, sondern sechs und es sollen 3 Paare darin vorkommen. Auch wenn die Bedingung nicht stimmt, merkst Du bestimmt schon selbst, dass das mit sechs Variablen und alles in einer Zeile ziemlich lang wird. Einfacher wird es, wenn Du das Problem in einfache Teilproblem aufteilst, z.B. in einer Liste mit sechs Zahlen jeweils die Häufigkeit jeder Ziffer zählen um dann zu prüfen, ob jede Ziffer genau 0 oder 2 mal vorkommt.
Florian Jochum
User
Beiträge: 8
Registriert: Montag 15. Januar 2018, 16:28

narpfel hat geschrieben:Moin,

eine Möglichkeit, wie man das Problem einfach lösen könnte, wäre, die richtige Datenstruktur für das Problem zu wählen. Sechs verschiedene Variablen sind im Gegensatz zu einer einzelnen, die alle sechs Werte umfasst und bestenfalls noch sinnvolle Operationen auf den Werten bereitstellt, doch schon recht unhandlich.
Ist halt ein Würfelspiel mit 6 Würfeln
Florian Jochum
User
Beiträge: 8
Registriert: Montag 15. Januar 2018, 16:28

Sirius3 hat geschrieben:@Florian Jochum: ok, so langsam verstehe ich die Frage. Du hast also nicht drei beliebige Zahlen, sondern sechs und es sollen 3 Paare darin vorkommen. Auch wenn die Bedingung nicht stimmt, merkst Du bestimmt schon selbst, dass das mit sechs Variablen und alles in einer Zeile ziemlich lang wird. Einfacher wird es, wenn Du das Problem in einfache Teilproblem aufteilst, z.B. in einer Liste mit sechs Zahlen jeweils die Häufigkeit jeder Ziffer zählen um dann zu prüfen, ob jede Ziffer genau 0 oder 2 mal vorkommt.
Problem ist, dass wir in der Schule bis jetzt nur if und while hatten. :cry:
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Florian Jochum: ich wüßte nicht, wie man das nur mit `if` programmieren sollte. Das wären dann 120 if-Bedingungen, wenn ich mich nicht verrechnet habe.
Florian Jochum
User
Beiträge: 8
Registriert: Montag 15. Januar 2018, 16:28

Sirius3 hat geschrieben:@Florian Jochum: ich wüßte nicht, wie man das nur mit `if` programmieren sollte. Das wären dann 120 if-Bedingungen, wenn ich mich nicht verrechnet habe.
Heilige Sch.... Wie würdest du es sonst machen? Vielleicht kannst du es mir erklären, oder ein Tut empfehlen, wo das gut erklärt wird, so das ich das dann für mein Spiel anwenden kann.
:K :K :K
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das hier wäre eine geeignete Datenstruktur: https://docs.python.org/2/library/colle ... er-objects
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Das es 120 if-Bedingungen sind spielt keine Rolle mehr wenn man einfach den Code generiert ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Sirius3 hat geschrieben:@Florian Jochum: ich wüßte nicht, wie man das nur mit `if` programmieren sollte. Das wären dann 120 if-Bedingungen, wenn ich mich nicht verrechnet habe.
Geht deutlich kürzer. Zum Beispiel die Variablen vorher mit einem ausgerolltem Bubblesort sortieren. Dann lässt sich anschließend leicht auf Paare testen. Sind dann 15 Kleiner-Vergleiche zum Sortieren, drei Tests auf Gleichheit für Paare und drei Tests auf Ungleichheit, falls alle Paare unterschiedlich sein sollen. Also "überschaubare" 21 ifs.
Das Leben ist wie ein Tennisball.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Florian Jochum: hattet ihr schon Listen und Dictionaries/Wörterbücher?
In specifications, Murphy's Law supersedes Ohm's.
Florian Jochum
User
Beiträge: 8
Registriert: Montag 15. Januar 2018, 16:28

pillmuncher hat geschrieben:@Florian Jochum: hattet ihr schon Listen und Dictionaries/Wörterbücher?
Nein, hatten wir noch nicht
Florian Jochum
User
Beiträge: 8
Registriert: Montag 15. Januar 2018, 16:28

EyDu hat geschrieben:
Sirius3 hat geschrieben:@Florian Jochum: ich wüßte nicht, wie man das nur mit `if` programmieren sollte. Das wären dann 120 if-Bedingungen, wenn ich mich nicht verrechnet habe.
Geht deutlich kürzer. Zum Beispiel die Variablen vorher mit einem ausgerolltem Bubblesort sortieren. Dann lässt sich anschließend leicht auf Paare testen. Sind dann 15 Kleiner-Vergleiche zum Sortieren, drei Tests auf Gleichheit für Paare und drei Tests auf Ungleichheit, falls alle Paare unterschiedlich sein sollen. Also "überschaubare" 21 ifs.
Was sind diese ausgerollten Bubblesorts?
Und wie funktioieren die?
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist komplizierter, als du es brauchst.

Schau dir die genannten Datenstrukturen an. Da lernst du mehr, auch wenn du mal - Schockschwerenot - 7 Zahlen zu vergleichen hast. Oder 8.
Florian Jochum
User
Beiträge: 8
Registriert: Montag 15. Januar 2018, 16:28

Habe ein bisschen wegen Sortieralgorythmen recharchiert, und habe direkt einen einfachen Algorythmus gefunden, den ich nun in das Spiel implementieren werde.
Hier ist er:

Code: Alles auswählen

c = 6
d = 5
e = 4
f = 4
g = 5
h = 6
# Sortieralgorithmus
def Sortieren(L):
    n = len(L)
    i = 0
    while i < n - 1:
        minpos = i
        m = i + 1
        while m < n:
            if L[m] < L[minpos]:
                minpos = m
            m = m + 1
        h = L[i]
        L[i] = L[minpos]
        L[minpos] = h
        i = i + 1
    return L


L = [c, d, e, f, g, h]
L = Sortieren(L)
if L == [1, 2, 3, 4, 5, 6]:
    print("Ja")
else:
    if L == [1,1,2,2,3,3] or [1,1,2,2,4,4] or [1,1,2,2,5,5] or [1,1,2,2,6,6] or [1,1,3,3,4,4] or [1,1,3,3,5,5] or [1,1,3,3,6,6] or [1,1,4,4,5,5] or [1,1,4,4,6,6]  or [1,1,5,5,6,6] or [2,2,3,3,4,4] or [2,2,3,3,5,5] or [2,2,3,3,6,6] or[2,2,4,4,5,5] or [2,2,4,4,6,6] or [2,2,5,5,6,6] or [3,3,4,4,5,5] or [3,3,4,4,5,5] or [3,3,4,4,6,6] or [3,3,5,5,6,6] or [4,4,5,5,6,6]:
        print("YEAH")
Ist zwar immer noch ziemlich aufwendig, aber nur für die überprüfung. Kann aber das komplette Spiel deutlich kürzen.
Danke für eure Hilfe :D :D
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

L.sort() haette es auch getan.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Florian Jochum: jetzt benutzt Du ja doch schon Listen. Die if-Abfrage ist falsch, da `or` nicht einem umgangssprachlichen "oder" entspricht. Es ist also nicht "L ist entweder A oder B oder C" sondern der Computer interpretiert es als "L ist A, logisch oder verknüpft mit B ist wahr", wobei bei Dir B eine nicht-leere Liste immer wahr ist, so dass sich der Ausdruck zu "immer wahr" verkürzen läßt. Was Du suchst, ist der `in`-Operator:

Code: Alles auswählen

L = sorted([c, d, e, f, g, h])
if L == [1, 2, 3, 4, 5, 6]:
    print("Ja")
elif L in ([1,1,2,2,3,3], [1,1,2,2,4,4], [1,1,2,2,5,5], [1,1,2,2,6,6], [1,1,3,3,4,4], [1,1,3,3,5,5], [1,1,3,3,6,6], [1,1,4,4,5,5], [1,1,4,4,6,6], [1,1,5,5,6,6], [2,2,3,3,4,4], [2,2,3,3,5,5], [2,2,3,3,6,6], [2,2,4,4,5,5], [2,2,4,4,6,6], [2,2,5,5,6,6], [3,3,4,4,5,5], [3,3,4,4,5,5], [3,3,4,4,6,6], [3,3,5,5,6,6], [4,4,5,5,6,6]):
    print("YEAH")
oder eben ganz kurz:

Code: Alles auswählen

L = collections.Counter([c, d, e, f, g, h])
if set(L.values()) == {2}:
    print("YEAH")
Antworten