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
drei beliebige Zahlen doppelt
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.
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.
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)
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
@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.
Ist halt ein Würfelspiel mit 6 Würfelnnarpfel 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.
Problem ist, dass wir in der Schule bis jetzt nur if und while hatten.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.
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.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.
:K :K :K
Das hier wäre eine geeignete Datenstruktur: https://docs.python.org/2/library/colle ... er-objects
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.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.
Das Leben ist wie ein Tennisball.
- pillmuncher
- User
- Beiträge: 1488
- 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.
Nein, hatten wir noch nichtpillmuncher hat geschrieben:@Florian Jochum: hattet ihr schon Listen und Dictionaries/Wörterbücher?
Was sind diese ausgerollten Bubblesorts?EyDu hat geschrieben: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.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.
Und wie funktioieren die?
Habe ein bisschen wegen Sortieralgorythmen recharchiert, und habe direkt einen einfachen Algorythmus gefunden, den ich nun in das Spiel implementieren werde.
Hier ist er:
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
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")
Danke für eure Hilfe
@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:
oder eben ganz kurz:
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")
Code: Alles auswählen
L = collections.Counter([c, d, e, f, g, h])
if set(L.values()) == {2}:
print("YEAH")