Als startpunt voor een getallenpuzzel krijg je een tabel met gehele getallen. De tabel telt $$M$$ rijen en $$N$$ kolommen. De puzzel wordt als "opgelost" beschouwd, als elke kolom dezelfde somwaarde heeft. Om dit te realiseren, mag je enkel binnen een rij van de tabel, elementen cylisch permuteren.

Klasse SomPuzzel

Schrijf een klasse SomPuzzel, met volgende methoden:

Voorbeeld

p = SomPuzzel([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
str(p)				# '[[1, 2, 3], [4, 5, 6], [7, 8, 9]]'
p.fout()			# 4.242640687119285
p << (1, 2)
str(p)				# '[[1, 2, 3], [6, 4, 5], [7, 8, 9]]'
p.fout()			# 2.449489742783178
p << (2, 1)
str(p)				# '[[1, 2, 3], [6, 4, 5], [8, 9, 7]]'
p.fout()			# 0.0

Klasse SomPuzzelRandom

Deze klasse erft over van de klasse SomPuzzel, en beschikt bijkomend over: Let erop dan je de generatie van randomgetallen precies uitvoert zoals aangegeven (en ook geen extra randomgetallen genereert), anders is controle via Dodona van dit onderdeel niet mogelijk. Voor de eerste 2 testcases op Dodona is de random seed gelijk aan 200.

Voorbeeld

p = SomPuzzelRandom([[4, 9], [3, 6], [8, 2], [2, 3], [1, 8], [8, 10], [6, 4], [3, 9], [6, 2]], 100)
str(p)		# '[[4, 9], [3, 6], [8, 2], [2, 3], [1, 8], [8, 10], [6, 4], [3, 9], [6, 2]]'
p.solve()	# [(0, 1), (3, 1)]
str(p)		# '[[9, 4], [3, 6], [8, 2], [3, 2], [1, 8], [8, 10], [6, 4], [3, 9], [6, 2]]'

Klasse SomPuzzelGulzig

Ook deze klasse erft over van de klasse SomPuzzel. Ze definieert bijkomend:

Voorbeeld

p = SomPuzzelGulzig([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
str(p)			# '[[1, 2, 3], [4, 5, 6], [7, 8, 9]]'
p.beste_zet()	# (0, 1)
str(p)			# '[[1, 2, 3], [4, 5, 6], [7, 8, 9]]'
p.solve()		# [(0, 1), (1, 2), (0, 0)]
str(p)			# '[[2, 3, 1], [6, 4, 5], [7, 8, 9]]'