ProgrammieraufgabenHier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.
Eimerproblem
Diskussion: Eimerproblem im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Anzeige
Zitat:
Wieso sollte ich das ausprobieren? Wie soll ich denn in einem 15l oder 13l Eimer 20 reinkriegen?^^
Z.B ...
Edit: foxalem war schneller.
@fox: "versauen" ist recht schwer - ich nehme einfach andere Werte. Eine weitere Aufgabe zu generieren ist eine Sache von paar Sekunden
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
So Aufgabe 2 habe ich raus, schade nur das ich son einfach Denkanstoß brauchte^^
Allerdings muss ich gestehen, dass ich irgendwie eine Aktion vergesse zu zählen, aber ich kriege das Endergebnis raus
Ich hoffe, mein kleiner Python-Solver ist richtig:
eimer.py
Code:
a = 1550
b = 1320
wanted = 2000
m = [[0 for y in range(b+1)] for x in range(a+1)]
solutionPath = None
def backtrack(myA, myB, path=[]):
global solutionPath
if m[myA][myB] == 0 or m[myA][myB] > len(path):
m[myA][myB] = len(path)
else:
return
if solutionPath != None and len(path) >= len(solutionPath):
return
if myA == wanted or myB == wanted or myA + myB == wanted:
if solutionPath == None or len(solutionPath) > len(path):
solutionPath = path
if myA != a:
backtrack(a, myB, path + [0]) # a fuellen
if myB != b:
backtrack(myA, b, path + [1]) # b fuellen
if myA != 0 and myB != b:
nextA = max(0, myA - b + myB)
nextB = myB + myA - nextA
backtrack(nextA, nextB, path + [2]) # a > b
if myB != 0 and myA != a:
nextB = max(0, myB - a + myA)
nextA = myA + myB - nextB
backtrack(nextA, nextB, path + [3]) # b > a
if myA != 0:
backtrack(0, myB, path + [4]) # a leeren
if myB != 0:
backtrack(myA, 0, path + [5]) # b leeren
backtrack(0, 0, [])
desc = ["fuelle(a)", "fuelle(b)", "a >> b", "b >> a", "leere(a)", "leere(b)"]
for i in solutionPath:
print desc[i]
print "\nAnzahl Durchgaenge:", len(solutionPath)
Was ich allerdings in der Beispielaufgabe nicht ganz nachvollziehen kann ist, warum man am Ende b leeren muss (soll). Schließlich befindet sich die gewünschte Menge bereits in Behälter a. Der letzte Schritt ist also meiner Meinung nach überflüssig.
Was ist eigentlich die Lösung für Teilaufgabe 4? Mein Ergebnis dafür ist 64, ich bin mir aber nicht ganz sicher, ob das richtig ist.
Original von Eydeet
Was ich allerdings in der Beispielaufgabe nicht ganz nachvollziehen kann ist, warum man am Ende b leeren muss (soll). Schließlich befindet sich die gewünschte Menge bereits in Behälter a. Der letzte Schritt ist also meiner Meinung nach überflüssig.
Ja, also... ähm. Ich habe einfach nicht daran gedacht . Ist im Prinzip eine Definitionssache - ob man nur in einem Eimer den gewünschten Inhalt haben möchte oder insgesamt in den Eimern sich nur X Liter befinden sollen.
Zitat:
Was ist eigentlich die Lösung für Teilaufgabe 4? Mein Ergebnis dafür ist 64, ich bin mir aber nicht ganz sicher, ob das richtig ist.
65 mit Eimerleeren am Ende . 64 sollte also auch korrekt sein.
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.