7down -- ein kreuzzahlrätsellöser · 2014. 10. 6. · unittests ~/projekte/7down $...

22
7down – ein Kreuzzahlr¨ atsell¨ oser Joachim Breitner, Manuel Holtgrewe, Lucas L¨ urich, Mathias Ziebarth [email protected] 14. M¨ arz 2008 7 down

Upload: others

Post on 13-Sep-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

7down – ein Kreuzzahlratselloser

Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, MathiasZiebarth

[email protected]

14. Marz 2008

7down

Page 2: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

���Aufgabenstellung

�����Werkzeuge

�����Implementierung

��Demonstration

1 Aufgabenstellung

2 Werkzeuge

3 Implementierung

4 Demonstration

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 3: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

⊗��Aufgabenstellung

�����Werkzeuge

�����Implementierung

��Demonstration

7downEin Kreuzzahlenratsel

Regeln:Waagerecht:A Quersumme von L waagerechtC Mal M senkrecht ergibt R waagerechtG Vielfaches des Ruckwerts von C senkrechtH C senkrecht plus Ruckwert von OwaagerechtI Ruckwert von G waagerecht ist Vielfaches JP waagerecht plus Ruckwert von F senkrechtL A senkrecht plus R waagerechtO E senkrecht plus K senkrechtP Vielfaches des Ruckwerts von Q senkrechtR Quadrat von B senkrechtSenkrecht:A Vielfaches von A waagerechtB Quadrat von A waagerechtC L waagerecht ist VielfachesD Die Quersumme von H waagerechtE Der Ruckwert von L waagerecht istVielfaches des RuckwertsF C senkrecht plus der Ruckwert dieser Zahlergibt J senkrechtJ Quadrat von Q senkrechtK PrimzahlM Mal A waagerecht ergibt J senkrecht NDie Quersumme dieser Zahl ist D senkrechtP Der Ruckwert ist eine PrimzahlQ Mal J senkrecht ergibt R waagerecht(Quelle: Die Zeit 2007/35)

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 4: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

�⊗�Aufgabenstellung

�����Werkzeuge

�����Implementierung

��Demonstration

7downFunktionaler Prototyp

data Tightness = TotallyTight | MightConstrain | JustTestable

class Slot a wherechoices :: a → Possibilitiessplitable :: a → BoolsplitPoss :: a → (a,a)

data Function s = Function {tightness :: Tightness,test :: [ s ] → s → Maybe Bool,run :: [ s ] → s → Maybe s}

data Edge i s = Edge {sources :: [ i ],target :: i ,func :: Function s}

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 5: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

��⊗Aufgabenstellung

�����Werkzeuge

�����Implementierung

��Demonstration

7downWochentliche Programmiersitzungen

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 6: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

���Aufgabenstellung

�����Werkzeuge

�����Implementierung

��Demonstration

1 Aufgabenstellung

2 Werkzeuge

3 Implementierung

4 Demonstration

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 7: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

���Aufgabenstellung

⊗����Werkzeuge

�����Implementierung

��Demonstration

7downJetzt aber richtig: In Python

Warum Python?

dynamisch

interpretiert

lesbar

kompakt

Weiter verwendet wurden:

GUI-Toolkit: gtk

Grafikbibliothek: cairo

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 8: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

���Aufgabenstellung

�⊗���Werkzeuge

�����Implementierung

��Demonstration

7downMercurial

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 9: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

���Aufgabenstellung

��⊗��Werkzeuge

�����Implementierung

��Demonstration

7downUnittests

~/ projekte /7down $ ./ tests/runtests.py -v

[...]

apply() on a number which does not have an isDone () Digit. ... ok

Test that UniqueDigitsRule objects are properly converted to ... ok

testIt (test_utils.TestCubeNumbers) ... ok

testIt (test_utils.TestSquareNumbers) ... ok

testDigits (test_utils.TestUtilityFunctions) ... ok

testFactorsOf (test_utils.TestUtilityFunctions) ... ok

testGcd (test_utils.TestUtilityFunctions) ... ok

testGcdList (test_utils.TestUtilityFunctions) ... ok

----------------------------------------------------------------------

Ran 168 tests in 0.157s

OK

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 10: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

���Aufgabenstellung

���⊗�Werkzeuge

�����Implementierung

��Demonstration

7downSystemtest

~/ projekte /7down $ ./ tests/system_test.py

Running all tests within ’~/projekte /7down/tests/examples ’...

OK (0.0378s; simple5.in)

OK (2.9086s; zeit -07 -42.in)

OK (0.0332s; book.in)

OK (0.7910s; prim10mal10mitGleichheit.in)

OK (1.7817s; unsolvable2.in)

OK (0.0447s; pal_u.in)

OK (0.5549s; pyramid.in)

OK (0.0906s; prim10 -test.in)

OK (1.9494s; zeit -07 -38.in)

OK (2.7520s; kzr -test2.in)

OK (1.1250s; kzr.in)

OK (0.0086s; reverseAndZero.in)

OK (2.4786s; prim10mal10.in)

OK (0.0014s; kzr -gi2.in)

OK (0.7250s; zeit -07 -35.in)

OK (0.0012s; kzr -gi.in)

[... 11 Zeilen ausgelassen ...]

OK (1.8311s; prim7mal7.in)

OK (0.0024s; prim -test.in)

OK (0.0092s; simple3.in)

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 11: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

���Aufgabenstellung

����⊗Werkzeuge

�����Implementierung

��Demonstration

7downStatistiken

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 12: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

���Aufgabenstellung

�����Werkzeuge

�����Implementierung

��Demonstration

1 Aufgabenstellung

2 Werkzeuge

3 Implementierung

4 Demonstration

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 13: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

���Aufgabenstellung

�����Werkzeuge

⊗����Implementierung

��Demonstration

7downAbstraktion

Problemubersetzung

Problemstellung Ansicht des Solvers

Ziffern und Zahlen → Mengen (”Zellen“)

feste Werte → einelementige MengenRegeln → schranken Mengen ein

Solver

Cell Rule

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 14: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

���Aufgabenstellung

�����Werkzeuge

⊗����Implementierung

��Demonstration

7downAbstraktion

Problemubersetzung

Problemstellung Ansicht des Solvers

Ziffern und Zahlen → Mengen (”Zellen“)

feste Werte → einelementige MengenRegeln → schranken Mengen ein

Solver

Cell Rule

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 15: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

���Aufgabenstellung

�����Werkzeuge

�⊗���Implementierung

��Demonstration

7downEine Evolution von Solvern

StupidSolverNoch ohne Backtracking

SimpleSolverVollstandig, aber unperformant

OrderedSolverWeiß, welche Regeln uberhaupt sinnvoll sind

StackSolverErmoglicht Interaktion mit der GUI

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 16: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

���Aufgabenstellung

�����Werkzeuge

��⊗��Implementierung

��Demonstration

7downArbeitsweise des Solvers

OffeneRegeln?

Problemgelost?

Rate eine Zelle

Wende eineoffene Regel an

VeranderteZelle leer?

Problem nichtlosbar (Abbruchoder rate weiter)

Markierezugehorige

Regeln als offen

NeinJa Ja

Nein

Ja

Nein

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 17: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

���Aufgabenstellung

�����Werkzeuge

���⊗�Implementierung

��Demonstration

7downKlassenarbeiten

UnaryRule BinaryRule NumberRuleOperatorRule

MultipleOfRulePrimeRuleAddOperator

Rule

Rule

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 18: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

���Aufgabenstellung

�����Werkzeuge

����⊗Implementierung

��Demonstration

7downStolperstein

Das Problem:

~/ projekte /7down $ python -c ’print hash(object ())’-1210219448~/ projekte /7down $ python -c ’print hash(object ())’-1209981880

Unsere Losung:

class Rule(object ):

# Mehr Methoden hier...

def __hash__(self):return hash(self.name)

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 19: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

���Aufgabenstellung

�����Werkzeuge

����⊗Implementierung

��Demonstration

7downStolperstein

Das Problem:

~/ projekte /7down $ python -c ’print hash(object ())’-1210219448~/ projekte /7down $ python -c ’print hash(object ())’-1209981880

Unsere Losung:

class Rule(object ):

# Mehr Methoden hier...

def __hash__(self):return hash(self.name)

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 20: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant

���Aufgabenstellung

�����Werkzeuge

�����Implementierung

��Demonstration

1 Aufgabenstellung

2 Werkzeuge

3 Implementierung

4 Demonstration

7down – ein Kreuzzahlratselloser Joachim Breitner, Manuel Holtgrewe, Lucas Lurich, Mathias Ziebarth

Page 21: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant
Page 22: 7down -- ein Kreuzzahlrätsellöser · 2014. 10. 6. · Unittests ~/projekte/7down $ ./tests/runtests.py -v [...] apply() on a number which does not have an isDone() ... aber unperformant