Please don’t rely on this Gitea instance being around forever. If any of your build scripts use my (kageru’s) projects hosted here, check my Github or IEW on Github for encoding projects. If you can’t find what you’re looking for there, tell me to migrate it.

further improvements

master
Arranun 3 years ago
parent 9e3aeb2d92
commit aec425b1e0

@ -10,9 +10,9 @@ main = do
mapIn <- lines <$> getContents
let connections = concat $ [(getConnections mapIn a b) | a <-"@abcdefghijklmnop", b <- "@abcdefghijklmnop", a /= b]
let state = State ['@'] 0 '@'
let result = part1 [state] connections
let result = part1 [state] [] connections 999
mapM putStrLn(map show connections)
mapM putStrLn(map show result)
putStrLn(show result)
data Connection =Connection { key1 :: Char,
key2 :: Char,
@ -32,20 +32,30 @@ data State = State { elements :: [Char],
} deriving (Show,Eq)
part1 :: [State] -> [Connection] -> [State]
part1 states conns
|length (filter(\(State elm _ _) -> (length elm) >= 17) (Trace.traceShowId((states)))) >= 1 =
states
part1 :: [State] -> [State] -> [Connection] -> Int -> Int
part1 states deadStates conns minimum
|length finished > 3 =
min
|otherwise = do
let choose = chooseNext states
let newStates = runState choose conns
let nextStates = newStates:(states)
part1 nextStates conns
chooseNext :: [State] -> State
chooseNext states = do
let possible = filter(\(State elm len pos) -> (length elm) < 17) states
last ( sortBy sortElm possible )
let choose = chooseNext (filtered)(min)
let newStates = runState (choose) deadStates conns min
if (newStates) == choose
then do
let newDeadStates = newStates:deadStates
part1 states newDeadStates conns min
else do
let nextStates = newStates:(states)
part1 nextStates deadStates conns min
where finished = (filter(\(State elm _ _) -> (length elm) >= 17) (states))
min = if length finished > 0
then List.minimum (map(\(State _ l _) -> l) finished)
else minimum
filtered = states \\ deadStates
chooseNext :: [State] -> Int -> State
chooseNext states min = do
let possible' = filter(\(State elm len pos) -> (length elm) < 17) states
let possible = filter(\(State elm len pos) -> len < min) possible'
last ( sortBy sortElm (possible))
sortLen :: State -> State -> Ordering
@ -62,8 +72,8 @@ sortElm (State e1 l1 _) (State e2 l2 _)
| l1 < l2 = LT
| otherwise = EQ
runState :: State -> [Connection] -> State
runState (State elm len pos) conns
runState :: State -> [State] -> [Connection] -> Int -> State
runState (State elm len pos) deadStates conns min
| length possible == 0 = (State elm len pos)
| length possible == 1 = do
let c = head possible
@ -72,15 +82,19 @@ runState (State elm len pos) conns
let choose = head (sortBy sortConn possible)
-- let newStates = map(\c -> stepState (State elm len pos) c) possible
stepState (State elm len pos) choose
where possible'' = filter(\(Connection k1 k2 l b) -> length ( b \\ notBlocked) == 0 )possible'''
possible = filter(\(Connection k1 k2 l b) -> notElem k2 elm) possible''
possible''' = filter(\(Connection k1 k2 l b) -> k1 == pos) conns
notBlocked = concat $ map(\x -> (toUpper x):[x]) elm
where possible''' = filter(\(Connection k1 k2 l b) -> length ( b \\ notBlocked) == 0 )possible''''
possible'' = filter(\(Connection _ _ l _) -> len + l < min) possible'''
possible' = filter(\(Connection k1 k2 l b) -> notElem k2 (deadPath)) possible''
possible = filter(\(Connection k1 k2 l b) -> notElem k2 elm) possible'
possible'''' = filter(\(Connection k1 k2 l b) -> k1 == pos) conns
notBlocked = concat $ map(\x -> (toUpper x):[x]) elm
dead = filter(\(State el _ _) -> (tail el) == elm) deadStates
deadPath = map(\(State el _ _) -> head el) dead
sortConn :: Connection -> Connection -> Ordering
sortConn (Connection _ _ l1 _) (Connection _ _ l2 _)
| l1 < l2 = LT
| l1 > l2 = LT
| l1 > l2 = GT
| l1 == l2 = EQ
stepState :: State -> Connection -> State

Loading…
Cancel
Save