On 24.12.12 00:58, Stefan Ram wrote:
> "Henrik Mesen" <
H.Me...@yahoo.com> writes:
>> Hat mir jemand einen Tipp wie man hier Vorgehen muss/kann um auf die
Lösung
>> zu kommen?
>
> Mit dem folgenden in zirka 20 Minuten geschriebenem Programm
> wurde eine mögliche Lösung gefunden, aber ich habe noch
> nicht geprüft, ob sie stimmt.
Ich habe auch mal ein kleines Programm geschrieben, das mit Backtracking
alle Möglichkeiten ausprobiert. Die Lösung kommt so schnell, dass ich
davon ausgehe, dass das selbe Verfahren auch mit Papier, Bleistift und
ein wenig Voraussicht funktioniert. Es sind ja nur fünf `echte' Wahlen.
(19 Zahlen, 14 Bedingungen)
Ohne die beiden vorgegebenen Zahlen findet man 48 Lösungen, wobei man
natürlich eine 12fache Symmetrie hat, so dass sich das auf 4 reduziert.
Es folgt Haskell-Code und ganz zum Schluss die Lösung.
Gruß
Carsten
module Hexagon where
newtype SM a r = SM ([a]->[(r, [a])])
instance Monad (SM a) where
(SM f1) >>= g
= SM h
where h s = concatMap k $ f1 s
k (r0, s) = case g r0
of SM g' -> g' s
return x = SM (\s -> [(x,s)])
assure :: Bool -> SM a ()
assure True = return ()
assure False = SM (\s -> [])
get' :: [a] -> [(a,[a])]
get' [] = []
get' (x:xs) = (x,xs) : [(y,x:ys) | (y,ys) <- get' xs]
get :: SM a a
get = SM get'
hexagonC :: SM Int [[Int]]
hexagonC =
do
c3 <- get
a1 <- get
assure $ a1 == 9
b2 <- get
assure $ a1+b2+c3 == 22
e1 <- get
assure $ e1 == 1
d2 <- get
assure $ c3+d2+e1 == 22
b1 <- get
c1 <- get
assure $ a1+b1+c1 == 22
d1 <- get
assure $ c1+d1+e1 == 22
c2 <- get
assure $ c1+c2+c3 == 22
a2 <- get
a3 <- get
assure $ a1+a2+a3 == 22
b3 <- get
assure $ a3+b3+c3 == 22
b4 <- get
c5 <- get
assure $ a3+b4+c5 == 22
c4 <- get
assure $ c3+c4+c5 == 22
e3 <- get
d4 <- get
assure $ c5+d4+e3 == 22
e2 <- get
assure $ e1+e2+e3 == 22
d3 <- get
assure $ c3+d3+e3 == 22
return [[a1,a2,a3],[b1,b2,b3,b4],[c1,c2,c3,c4,c5],
[d1,d2,d3,d4],[e1,e2,e3]]
hexagons :: [[[Int]]]
hexagons = case hexagonC of
SM f -> map fst $ f [1..19]
*Hexagon> :l Hexagon
[1 of 1] Compiling Hexagon ( Hexagon.hs, interpreted )
Ok, modules loaded: Hexagon.
*Hexagon> hexagons
[[[9,5,8],[6,11,12,10],[7,13,2,16,4],[14,19,17,15],[1,18,3]]]