alte Bwinf-Aufgabe

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Ich bin gerade mal wieder auf den Gedanken gekommen, dass es ja noch den Bwinf gibt. Ich schau ab und zu immer mal da vorbei und nehm auch dran teil, nur ist zur Zeit keiner laufen (erst im Herbst wieder). Deswegen hab ich mir mal eine alte Aufgabe rausgepickt und wollte die mal zur Knobelübung lösen (jaja, ich will nächstes mal auch wieder wenigstens in die 2. Runde weiterkommen). Das hier ist sie: Graf Rüdiger.

Ich hab sie im Prinzip auch schon fertig, aber meine Lösung gefällt mir nicht so toll:

Code: Alles auswählen

def _riegel_n(n):
	if n==1:
		return [1]
	erg=_riegel_n(n-1)
	return erg+[n]+erg

def mache_zu(statelist):
	erg=[]
	for i,state in enumerate(statelist[:-1]):
		if state:
			erg+=_riegel_n(i+1)
	if statelist[-1]:
		erg.append(len(statelist))
	while True:
		for i in xrange(len(erg)-1):
			if erg[i]==erg[i+1]:
				del erg[i:i+2]
				break
		else:
			break
	return erg
#####
zu=False
auf=True
#####
print mache_zu((1,1,1,1,1))
Besonders stören tut mich die while-Schleife in mache_zu, die dazu dient doppelte Züge auszusortieren, damit ein optimiertes Ergebniss rauskommt. Frage: kann man das anders gestalten?

Hier eine kleine Erklärung der Lösung: Nach Regel 1-3 kann ein Rigel N mit der Funktion _riegel_n bewegt werden, wenn alle Rigel mit Nummern niedriger als N-2 zu sind, und zwar auf schöne Rekursive Art und Weise. Da man das nicht erwarten kann, gibt es noch eine zweite Funktion die genau das tut: alle Rigel von unter nach oben schließen. Der letzte Rigel wird, falls offen, mittels Regel 4 geschlossen. Nun können natürlich doppelte Bewegungen stattfinden und die einzige Lösung diese zu entfehrnen, von der ich mir sicher bin das sie geht, steckt in der while-Schleife. Geht das aber nicht noch schöner? Ich hab mir gedacht, ich könnte ja nach bestimmten Mustern suchen, da doppelte Sachen am Anfang auftauchen müssten. Nur liegt hier auch der Hund begraben, denn ich bin nicht sicher ob dem so ist.

Wenn also jemand Zeit für solche Spielereien hat... so möge er mir bitte helfen.

Danke, Milan
Antworten