Python :: Aufgabe #312
3 Lösungen
Ermittlung der Anzahl fairer Würfel
Fortgeschrittener - Python
von hollst
- 03.02.2021 um 13:01 Uhr
Zwei Würfel A und B nennt man fair, wenn im statistischen Mittel Würfel A gegenüber B genauso oft gewinnt wie umgekehrt. Das ist bei den normalen Spielwürfeln, deren sechs Spielflächen jeweils mit den Zahlen von 1 bis 6 belegt sind, in der Regel der Fall, wenn kein Würfel gezinkt ist (sei hier vorausgesetzt).
Wir nehmen jetzt den Fall an, dass die insgesamt zwölf Spielflächen der zwei Würfel nicht zweimal mit jeweils von 1 bis 6, sondern jeweils mit sechs unterschiedlichen Zahlen aus dem Intervall von 1 bis 12 belegt sind. D. h. hat man sich bei Würfel A für sechs verschiedenen Zahlen aus 1 ... 12 entschieden, so wird B mit den verbleibenden sechs Zahlen belegt. Damit gibt es sehr viele Fälle, bei denen keine zwei faire Würfel entstehen würden, bspw. wenn Würfel A mit 1 ... 6 und Würfel B mit 7 ... 12 belegt wären. In diesem Beispiel gewänne Würfel B immer gegen Würfel A. Würde man allerdings Würfel A mit 1, 2, 3, 10, 11, 12 und Würfel B mit 4 ... 9 belegen, so hätte man wieder ein faires Würfelpaar. Neben der gerade genannten zwei Flächenbelegungen gibt es allerdings weitere, die ebenfalls fair sind.
Die Programmieraufgabe bestehe darin, mittels Simulation alle Flächenbelegungen für zwei Würfel mit den Zahlen von 1 bis 12 zu ermitteln, bei denen die Würfel fair sind.
Wir nehmen jetzt den Fall an, dass die insgesamt zwölf Spielflächen der zwei Würfel nicht zweimal mit jeweils von 1 bis 6, sondern jeweils mit sechs unterschiedlichen Zahlen aus dem Intervall von 1 bis 12 belegt sind. D. h. hat man sich bei Würfel A für sechs verschiedenen Zahlen aus 1 ... 12 entschieden, so wird B mit den verbleibenden sechs Zahlen belegt. Damit gibt es sehr viele Fälle, bei denen keine zwei faire Würfel entstehen würden, bspw. wenn Würfel A mit 1 ... 6 und Würfel B mit 7 ... 12 belegt wären. In diesem Beispiel gewänne Würfel B immer gegen Würfel A. Würde man allerdings Würfel A mit 1, 2, 3, 10, 11, 12 und Würfel B mit 4 ... 9 belegen, so hätte man wieder ein faires Würfelpaar. Neben der gerade genannten zwei Flächenbelegungen gibt es allerdings weitere, die ebenfalls fair sind.
Die Programmieraufgabe bestehe darin, mittels Simulation alle Flächenbelegungen für zwei Würfel mit den Zahlen von 1 bis 12 zu ermitteln, bei denen die Würfel fair sind.
Lösungen:
#faire Würfel
ergebnisse = []
paare = {}
#a,b,c,d,e,f stehen für die einzelnen Seiten eines Würfels, alle möglichen Kombinationen werden der Reihe nach durchlaufen
for a in range(1,8):
for b in range(2,9):
if b <= a:
continue
else:
for c in range(3,10):
if c <= b:
continue
else:
for d in range(4,11):
if d <= c:
continue
else:
for e in range(5,12):
if e <= d:
continue
else:
for f in range(6,13):
if f <= e:
continue
else:
if a + b + c + d + e + f == 39: #für einen fairen Würfel muss die Summe der Seiten 39 ergeben
ergebnisse.append((a,b,c,d,e,f))
#die zuvor errechneten Würfel werden Paarweise zugeordnet und ausgegeben
for i in range(0,29):
eintrag = ergebnisse[i]
paare[str(eintrag)] = str(ergebnisse[-1])
ergebnisse.pop()
print('Würfel 1:', eintrag, 'Würfel 2:', paare[str(eintrag)])
# Die Summe der Würfelseiten ist 78. ALso muss auf jedem Würfel als Summe der Seiten 39 herauskommen.
from itertools import permutations
wuerfel1 = []
# liste von 1 bis 12
liste = []
for i in range(1, 13):
liste.append(i)
# 6-elementige Permutatationen mit Summe 39
for i in list(permutations(liste, 6)):
if sum(i) == 39:
if sorted(i) not in wuerfel1:
wuerfel1.append(sorted(i))
print(wuerfel1)
print("Es gibt", len(wuerfel1), "Möglichkeiten für den 1. Würfel")
print("Unterscheidet man nicht zwischen 1. Würfel und 2. Würfel, halbiert sich die Anzahl auf",
int(len(wuerfel1) / 2), "Möglichkeiten")
"""
#312: Ermittlung der Anzahl fairer Würfel
Die Programmieraufgabe bestehe darin, mittels Simulation alle Flächenbelegungen für zwei Würfel
mit den Zahlen von 1 bis 12 zu ermitteln, bei denen die Würfel fair sind.
"""
from itertools import combinations
def fnd_combi(inp):
combis = list(combinations(inp, 6))
for i in combis:
if sum(i) == 39 and (list(i)[0]) < (list(set(inp) - set(i))[0]):
print(list(i), list(set(inp) - set(i)))
def main():
fnd_combi([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
if __name__ == '__main__':
main()
