Hi Leute,
glaubt mir bitte, dass ich euch mit so etwas nicht belästigen würde, wenn ich nicht seit 3 Stunden davorhängen würde, ohne es zu begreifen.
Versuche Python 3 zu lernen und komme bei dieser Aufgabe einfach nicht weiter. Bitte gebt mir einfach die Lösung, damit es Klick macht. Danke.
Tipp lautet erst xy, dann yz, dann xy. Es ergibt einfach keinen Sinn für mich. Immer fehlt mir was.
Scramble Exercise: Sorting Scramble
Code scramble: make the program sort the three numbers x, y and z into increasing order, so that x has the smallest value, y has the next smallest value, and z has the largest value.
Drag and drop with your mouse to rearrange the lines. Click for a hint.
y = tmp
tmp = max(x, y)
y = tmp
x = min(x, y)
x = min(x, y)
y = min(y, z)
tmp = max(x, y)
tmp = max(y, z)
z = tmp
Anfänger - Übung - Brauche Hilfe
Warum nicht einfach:
Wenn man kein `sort` benutzen darf, warum dann `max` und `min`?
Mal doch mal auf Papier, wie man drei Zahlen durch größer/kleiner-Vergleiche sortieren kann.
Code: Alles auswählen
x, y, z = sorted([x, y, z])
Mal doch mal auf Papier, wie man drei Zahlen durch größer/kleiner-Vergleiche sortieren kann.
@Rage_mode: das Problem ist hier nur, dass man sich solch eine Denkweise erst gar nicht angewöhnen sollte.
Statt `tmp` gibt es in Python Tuple-Zuweisungen. Das hier schreibt niemand:
Statt dessen würde man das schreiben:
Was aber genauso unlesbar ist, weil man es durch ein viel klareres `if` ersetzen könnte:
Statt `tmp` gibt es in Python Tuple-Zuweisungen. Das hier schreibt niemand:
Code: Alles auswählen
tmp = max(y, z)
y = min(y, z)
z = tmp
Code: Alles auswählen
y, z = min(y, z), max(y, z)
Code: Alles auswählen
if y > z: y, z = z, y
- __blackjack__
- User
- Beiträge: 14045
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Wenn man nicht drüber nachdenken möchte, aber trotzdem alle 8 Lösungen finden möchte, lässt man den Rechner einfach alle Varianten durchprobieren.
Sind am Ende ja nur etwas mehr als zwei Millionen.

Code: Alles auswählen
#!/usr/bin/env python3
from itertools import permutations
LINES = '''\
y = tmp
tmp = max(x, y)
y = tmp
x = min(x, y)
x = min(x, y)
y = min(y, z)
tmp = max(x, y)
tmp = max(y, z)
z = tmp
'''.splitlines()
NAMES = list('xyz')
def check_source(source):
for values in permutations(range(3)):
namespace = dict(zip(NAMES, values))
try:
exec(source, namespace)
except NameError:
return False
else:
if any(
namespace[name] != expected
for name, expected in zip(NAMES, range(3))
):
return False
return True
def main():
solutions = list()
sources = ('\n'.join(lines) for lines in permutations(LINES))
solutions = list(filter(check_source, sources))
print(solutions)
print(len(solutions))
if __name__ == '__main__':
main()
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
@__blackjack__: die 8 Lösungen sind in Wirklichkeit ja doch nur eine Lösung, weil drei mal zwei Zeilen identisch sind.
Noch ein paar Zahlen: von den 362880 Varianten sind nur 45360 unterschiedlich, von denen 22680 überhaupt ohne NameError laufen, und 1 die richtige Lösung liefert.
Noch ein paar Zahlen: von den 362880 Varianten sind nur 45360 unterschiedlich, von denen 22680 überhaupt ohne NameError laufen, und 1 die richtige Lösung liefert.
Vielen Dank für eure Antworten Leute. Ihr habt mir bezüglich meines Grundverständnisses schon sehr geholfen.
@_blackjack_ Danke für den interessanten Lösungsansatz es einfach zu automatisieren. Bin leider noch nicht soweit, dass ich vollständig verstehe was du da genau gemacht hast, aber werde das kontinuierlich überprüfen, bis ich es begriffen habe
@ Sirius3 Ja, genau deswegen hab ich auch so ein Problem mit der Aufgabe, hätte es wenn nicht mit 'sort', dann zumindest mit 'if' gelöst xD
@_blackjack_ Danke für den interessanten Lösungsansatz es einfach zu automatisieren. Bin leider noch nicht soweit, dass ich vollständig verstehe was du da genau gemacht hast, aber werde das kontinuierlich überprüfen, bis ich es begriffen habe

@ Sirius3 Ja, genau deswegen hab ich auch so ein Problem mit der Aufgabe, hätte es wenn nicht mit 'sort', dann zumindest mit 'if' gelöst xD
- __blackjack__
- User
- Beiträge: 14045
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Rage_mode: Nach dem \ darf nichts stehen. Auch kein Leerzeichen.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
- __blackjack__
- User
- Beiträge: 14045
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Das Programm so erweitert, dass die Zahlen die Sirius3 bereits genannt hat, ermittelt werden:
Code: Alles auswählen
#!/usr/bin/env python3
from collections import namedtuple
from enum import Enum
from itertools import permutations
from math import factorial
from operator import attrgetter
from more_itertools import map_reduce
LINES = '''\
y = tmp
tmp = max(x, y)
y = tmp
x = min(x, y)
x = min(x, y)
y = min(y, z)
tmp = max(x, y)
tmp = max(y, z)
z = tmp
'''.splitlines()
NAMES = list('xyz')
Category = Enum('Category', 'CORRECT INCORRECT NAME_ERROR')
Result = namedtuple('Result', 'category source')
def check_source(source):
expected_values = range(len(NAMES))
for values in permutations(expected_values):
namespace = dict(zip(NAMES, values))
namespace['__builtins__'] = {'min': min, 'max': max}
try:
exec(source, namespace)
except NameError:
return Result(Category.NAME_ERROR, source)
else:
if any(
namespace[name] != expected
for name, expected in zip(NAMES, expected_values)
):
return Result(Category.INCORRECT, source)
return Result(Category.CORRECT, source)
def main():
sources = set('\n'.join(lines) for lines in permutations(LINES))
print(
f'Checking {len(sources)} unique sources from max. possible'
f' {factorial(len(LINES))}.\n'
)
category2sources = map_reduce(
map(check_source, sources), attrgetter('category'), attrgetter('source')
)
for category in Category:
print(
f'{category.name:>12}:{len(category2sources.get(category, [])):6}'
)
for solution in category2sources.get(Category.CORRECT, []):
print()
print(solution)
if __name__ == '__main__':
main()
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.