days 23 and 24

[?]
Dec 24, 2020, 6:10 PM
IGIPWAHKCTPV4VU3YZPKFFD75YI5NWYS7DLTA4ZF4R7Q7GMBRAQQC

Dependencies

Change contents

  • file addition: 23 (dxwrx-rx-r)
    [1.0]
  • file addition: part2.rs (-xw-x--x--)
    [0.5]
    // The Haskell solution is basically correct, but OOMed my box and I don't feel
    // up to hunting down all the places I need to add strictness annotations.
    fn main() {
    let mut next: [usize; 1000001] = [0; 1000001];
    next[5] = 6;
    next[6] = 2;
    next[2] = 8;
    next[8] = 9;
    next[9] = 3;
    next[3] = 1;
    next[1] = 4;
    next[4] = 7;
    next[7] = 10;
    next[1_000_000] = 5;
    /*
    next[3] = 8;
    next[8] = 9;
    next[9] = 1;
    next[1] = 2;
    next[2] = 5;
    next[5] = 4;
    next[4] = 6;
    next[6] = 7;
    next[7] = 10;
    next[1_000_000] = 3;
    */
    for i in 10..1_000_000 {
    next[i] = i + 1;
    }
    let mut sel = 5;
    for _ in 0..10_000_000 {
    let x1 = next[sel];
    let x2 = next[x1];
    let x3 = next[x2];
    next[sel] = next[x3];
    let mut dst = sel - 1;
    loop {
    if dst < 1 {
    dst = 1_000_000;
    }
    if dst != x1 && dst != x2 && dst != x3 {
    break;
    }
    dst = dst - 1;
    }
    next[x3] = next[dst];
    next[dst] = x1;
    sel = next[sel];
    }
    println!(
    "1 -> {} -> {}; answer is {}",
    next[1],
    next[next[1]],
    next[1] * next[next[1]]
    );
    }
  • file addition: cups.hs (-xw-x--x--)
    [0.5]
    import Control.Arrow
    import Data.List
    import qualified Data.Map as M
    step :: Int -> [Int] -> [Int]
    step _ [] = undefined
    step biggest (x : xs) =
    let numbersDecreasing = cycle $ reverse [1 .. biggest]
    (picked, inPlay) = splitAt 3 xs
    x' = if x == 1 then biggest + 1 else x
    chosen =
    head $
    dropWhile (`elem` picked) $
    dropWhile (>= x') $
    numbersDecreasing
    (prefix, _ : rest) = span (/= chosen) inPlay
    in drop 1 $ cycle $ take 9 $ x : prefix ++ chosen : picked ++ rest
    runN :: Int -> Int -> [Int] -> [Int]
    runN = flip (.) (flip (!!)) . flip (.) . iterate . step
    solveOne :: String -> String
    solveOne =
    concat
    . map show
    . take 8
    . drop 1
    . dropWhile (/= 1)
    . runN 9 100
    . cycle
    . map (read . (: []))
    data Circle = C
    { getCursor :: Int,
    getLargest :: Int,
    getNextMap :: M.Map Int Int
    }
    deriving (Show)
    (!) = (M.!)
    stepC :: Circle -> Circle
    stepC (C cursor largest nexts) =
    let picked = take 3 $ drop 1 $ iterate (nexts !) cursor
    dst = selectTarget cursor picked
    nexts' = M.insert cursor (nexts ! last picked) nexts
    nexts'' = M.insert dst (head picked) nexts'
    nexts''' = M.insert (last picked) (nexts ! dst) nexts''
    in C (nexts''' ! cursor) largest nexts'''
    where
    selectTarget c ineligible =
    let c' = if c == 1 then largest else c - 1
    in if c' `elem` ineligible
    then selectTarget c' ineligible
    else c'
    buildAdjCyclic :: [Int] -> M.Map Int Int
    buildAdjCyclic xs = M.insert (last xs) (head xs) $ M.fromList (zip xs (tail xs))
    buildCircle :: Int -> [Int] -> Circle
    buildCircle max xs =
    let adj = buildAdjCyclic xs
    maxIn = maximum xs
    adj' = foldl' (flip (uncurry M.insert . (id &&& (+ 1)))) adj [maxIn + 1 .. max -1]
    adj'' = if max > maxIn then M.insert max (head xs) adj' else adj'
    adj''' = if max > maxIn then M.insert (last xs) (maxIn + 1) adj'' else adj''
    in C (head xs) max adj'''
    findStars :: [Int] -> Int
    findStars xs =
    let circ = buildCircle 1000000 xs
    C _ _ endState = iterate stepC circ !! 10000000
    in (endState ! 1) * (endState ! (endState ! 1))
  • file addition: 24 (dxwrx-rx-r)
    [1.0]
  • file addition: tiles.hs (-xw-x--x--)
    [0.3512]
    import Data.List hiding (iterate')
    import qualified Data.Map as M
    import Data.Maybe
    import qualified Data.Set as S
    type HexCoord = (Int, Int, Int)
    data HexGrid = H {unH :: M.Map HexCoord Bool}
    ne (x, y, z) = (x + 1, y, z -1)
    nw (x, y, z) = (x, y + 1, z -1)
    se (x, y, z) = (x, y -1, z + 1)
    sw (x, y, z) = (x -1, y, z + 1)
    e (x, y, z) = (x + 1, y -1, z)
    w (x, y, z) = (x -1, y + 1, z)
    flipTile :: Maybe Bool -> Bool
    flipTile = not . fromMaybe False
    followPath :: HexCoord -> String -> HexCoord
    followPath pt [] = pt
    followPath pt ('n' : 'e' : rest) = followPath (ne pt) rest
    followPath pt ('n' : 'w' : rest) = followPath (nw pt) rest
    followPath pt ('s' : 'e' : rest) = followPath (se pt) rest
    followPath pt ('s' : 'w' : rest) = followPath (sw pt) rest
    followPath pt ('e' : rest) = followPath (e pt) rest
    followPath pt ('w' : rest) = followPath (w pt) rest
    followPath _ _ = undefined
    runInstructions :: HexGrid -> [String] -> HexGrid
    runInstructions = foldl' runSingle
    where
    runSingle (H grid) s = H (M.alter (Just . flipTile) (followPath (0, 0, 0) s) grid)
    solveOne :: String -> Int
    solveOne =
    M.foldl' (\acc x -> if x then acc + 1 else acc) 0
    . unH
    . runInstructions (H M.empty)
    . lines
    type Tiles = S.Set HexCoord
    neighbors :: HexCoord -> S.Set HexCoord
    neighbors = S.fromList . flip map [ne, nw, se, sw, e, w] . flip ($)
    member = S.member
    step :: Tiles -> Tiles
    step s =
    let liveAdjacent :: HexCoord -> Tiles -> Int
    liveAdjacent pt s = S.size $ S.intersection s $ neighbors pt
    stillLive :: HexCoord -> Tiles -> Bool
    stillLive pt grid =
    not (liveAdjacent pt grid == 0 || liveAdjacent pt grid > 2)
    becomeLive :: HexCoord -> Tiles -> Bool
    becomeLive pt grid = liveAdjacent pt grid == 2
    pointsToConsider :: S.Set HexCoord
    pointsToConsider = (S.unions $ map neighbors $ S.toList s)
    maybeFlip :: Tiles -> HexCoord -> Tiles
    maybeFlip s' pt = if checkLive pt s then S.insert pt s' else s'
    where
    checkLive = if pt `member` s then stillLive else becomeLive
    in S.foldl maybeFlip S.empty pointsToConsider
    iterate' 0 _ x = x
    iterate' n f x = x `seq` iterate' (n -1) f (f x)
    solveTwo :: String -> Int
    solveTwo =
    S.size
    . iterate' 100 step
    . S.fromList
    . M.keys
    . M.filter id
    . unH
    . runInstructions (H M.empty)
    . lines
  • file addition: small.txt (-xw-x--x--)
    [0.3512]
    sesenwnenenewseeswwswswwnenewsewsw
    neeenesenwnwwswnenewnwwsewnenwseswesw
    seswneswswsenwwnwse
    nwnwneseeswswnenewneswwnewseswneseene
    swweswneswnenwsewnwneneseenw
    eesenwseswswnenwswnwnwsewwnwsene
    sewnenenenesenwsewnenwwwse
    wenwwweseeeweswwwnwwe
    wsweesenenewnwwnwsenewsenwwsesesenwne
    neeswseenwwswnwswswnw
    nenwswwsewswnenenewsenwsenwnesesenew
    enewnwewneswsewnwswenweswnenwsenwsw
    sweneswneswneneenwnewenewwneswswnese
    swwesenesewenwneswnwwneseswwne
    enesenwswwswneneswsenwnewswseenwsese
    wnwnesenesenenwwnenwsewesewsesesew
    nenewswnwewswnenesenwnesewesw
    eneswnwswnwsenenwnwnwwseeswneewsenese
    neswnwewnwnwseenwseesewsenwsweewe
    wseweeenwnesenwwwswnew
  • file addition: input.txt (-xw-x--x--)
    [0.3512]
    swsenwsewneeseseswnwswsesesewswnewsese
    seewwewsenenwwswnwwenewwwwwwnw
    swswswseseswswswseswswswswseswswne
    ewesewseseweswnwneesewesenweneee
    seewneneswenenenenwneswnwnweeswswenene
    neneneneewwsenenenenenwnenenenwnwnesenw
    eseeeeseeeeeesewee
    eeneeneeneneeweneeeeene
    swseswsewseswseswswenwswseseseswswswwnene
    nwnwseswswsweswnwseswsesesw
    eswnenweeseseswenwswneenweseseee
    eswseseeswseeneeswseneseneseeeesee
    nwswseneseseseeswnwseseseseseswswsesese
    eesweeneeeenwnwnewesweeseeee
    wwswwwwwsewwwwwwwnesw
    swswswswnweswswswswsweswswswwswswsesw
    eeneenwseewswsweewseewenwewe
    seseseneseseswsewseseseseseseswsesesenw
    nwenwswnwnwnwnenwnwnenenwne
    enesenwnewneenewneneeseneneenwswne
    nwnwswsenwnwnwsenenwnwswnwnwnenwnwnwnwnwne
    nwnwswswwwnenwenwnwwsenwwnwnwnwesenw
    ewwswnenenesenenwnenwnesesenwseneewwne
    nwwnenenwnwnwnwnwnwnwsenwnewsewnwsww
    swswwwsenwnwswwsweswsweswneswesesw
    nenenenenenewenenenenwneneseneswnenwne
    esweeseeeenwnwseeseeeeseeee
    ewsesenesewswswsewneswswneswswseewsw
    nenweeeswneeeneenwenwseenwneswswne
    swnwnwnwnwnwneneseneneneswnwnese
    senweenwnwseswswswnwnwewnwnwnwneswswne
    nwnwswnwwewwewnwnwnwnwsenwnwnwwnwnw
    nwsenwsenesenewsewwwnwsenenewseww
    eeesenewweneeneweeseswswsesesese
    wneeeenewnenweeseeneneneseseneee
    nwswwswswswswswswswswwwsweseswnwsww
    senwenwnwnwnwnwnwnesewnwnwnwnwwsene
    swwnewwwenesewwswswsewwwwwswnww
    swwwewnewwnwnewnwwswwnwnwwww
    neeneneneneneseswnwneneenenenenenwne
    seseswsewseswnwsesenesesesesweseeseswsw
    nwsenwenwwnwnwnwnwnwnwnwswwswwwenwnenw
    enwnwsenwwwnwwwswewnwwnwnwwnwswese
    wwnwnwnwwwsewsewnwsewnwnww
    wswswwswseswwswwswswwwswwwne
    ewwswwswswwwsesweswwwwwnewwew
    neeseseswswenwwnwsenenenwwneneswwsw
    nenwsenwnwnwsesenenwswneneenweseseesew
    senenenenenenwnenwswneneneneenenwnesene
    wswwnwswswswseswesewswswswnwsw
    wwwewwnwwswswwwnewswswswnewnwse
    seseswseswsenwneseseenwseswsesesesesese
    swseswnwwnwneswseswswnwswseswswseenesw
    nenwswwnwsesewseswseseswseseneeswseswne
    swswseswseseswwnwswseswnwsesenesweswe
    swsenenwneswnwwsewewwnesew
    swsewswsewsewswswswswswswwswnenwwwnw
    swsenwwneswnwnwneswseeswswsenwswenee
    wnenenenenenesenenw
    swseenwseseswsenwneenwwswswsesenweswse
    seseseseseseseswsesesenesesese
    nwswnwnenwsenwsenwnwnwnwnwnwnenwnwnwnwenw
    seneneneseswnwnwneswnwneneseswnwnwnwnwwnw
    nwnweenwnwswnwnwnewenwwswwneseesenw
    nenwnesenweneneneneswwnenenwnwseneneene
    nenwnwnwnwnwnwnwsenwnwnwnwnwnwswsenwnwnw
    nenesenenewnenenenenewnenesenenenenenw
    nenesweenenwnenewnwnesenewneneneeene
    wwswswwsewwwswnwnewenwswwswswwswse
    nenwswnenwneenenewswnewnenenenwnwsesew
    nwwsenwsenwnenwsenwsewewneswnwnewnwne
    nwnenwnwneweswnwnenwewnenenenwneswene
    wwwnwnewwwsewnwewwwnwnwwnwnw
    wswnenenwnwswneneswnweenwnwwnwnwnwnw
    nwweeswneneeneeenwneseeeeswswswe
    seeswseseswnewsewwnwseewneesesesesese
    wnwnwnwnewnwwsweeswwnwwnwswnwnwew
    wswnweenwwswsewnwnenwnwwswwwww
    eneswnewswesesenwneneenenenwwenwne
    swwswwwwnewsewwwwswewswwww
    swsesenwnwsenewseseseseseseseseseewsese
    wnweweenenewnesweseeseeee
    nenwwnwnwnwnwnwsenwswewswne
    nwsesewnwseseswneenewswneesese
    eneeeeweneeeeeesweeewewse
    wseeeseeseeesee
    nwnwnwsenwnwnwnwnenwnwwnwnwswwewww
    nwsenwnenwsenwewswnenwnwnwnwnwnwnwnene
    nwneneseswswswwswwneswseewswswswswsw
    swneneswswswswswswswswswewswwswswswsww
    wneseeseeeeeweeseneeseseesew
    swswswseseseswsesesesesenesw
    neswewseseneswswswswseswswswswwseswswse
    nenenwsweswneeeswnenenenenewnenenee
    swswswswswesewswnwnenwesenewswswswnesw
    eswswnenewewwswwswneeswswseswwsw
    swnwwnwswsesesenewwneeseswseenenwne
    weweswwsenwswenwnwnwenwwnwnwwnww
    eseseseseseeseewsesesenwseseneeswsese
    senwseseesewneesesesesenwsenwseswsesesese
    eneeeneeeeeswsweeeeeeeewse
    seesesenwsesweewswseseneneneswnesewe
    wswnwwseswwnweswwnwnweneeswnwswnenenw
    nesewswwwnesewnewwwsene
    swseswsweseseswneswswsewseswswsww
    eseseeeseswswnwweeneeeesesesene
    seswneeeneewneswesesenwnwwnenewnwsw
    newsenwewnwneeswseswsesesesesewsenwse
    wwwwwwwnewswwwwwnwnwswwew
    swnenwnwnwnwswswnwenenwnenwenenenwnenw
    wwwwewswwweewwsewwwnewnwnw
    nwewwnwnwswwswnwewwwwnwnwwwneswe
    newneswneneneswnwneneesesewneneesww
    nwnwnwneseswnenwnwnwswneeneswnenwnwnwneesw
    nwwswsenwneweenwwenenwwwsenw
    nenwneswswweneswseseeseneneeeneneew
    eseseeseeeeseenenweeseswenweenw
    neswneseesweeswesenwswenweeseeeenw
    wenwseeseneneeeneneneeeweswsene
    neenenenwneneneneneneseneneswnenenene
    nwnwswnewewseswsw
    neswneeswwswseswswsenwswseswsenewesesw
    seseswseeeeeewenweeeeseesee
    wwnwswnwnwenwwswnwnwenwnwnwwnwwnw
    wswneseenwnwesenwwnwnesenwnwneenenwwnw
    newwswswsweswsenwneneswswwswwswswsw
    eswnwsweswswnwswswnwwwswswswesewswswne
    sewswswswswswneswnwesesewneswswswswsese
    newswneswwnwwswwwswwwswwewsewsw
    nwswswneseneswswswwswswwswwswneeswsw
    nwnwsenenenwwswnweesenwwwnenesesenw
    nwneswnwswnwwnenenwnenwnwnenenwenwnenw
    wsenwwnwsenwnwenenwwsewsesesewneww
    eeneeesewseeee
    nwnwnwseswnwnewwwneeseseswswswneeee
    neswswswswswswswswswsesw
    nwwswwneswsewwswwneewsweswswwww
    nwnwsewnwsenwnwwnwnwnwsesenwwwnewnenw
    wsenwseseneenwnenwwenwnwwsenwswneswsw
    wwwswswswswswneswneswswswseswwseswwnesw
    swsesesweseenwwsesesweswswwsenwswswsw
    seeneeesweesese
    swnwseswsenwnwenenwseneswsesesesesesesese
    nwwwnwsewwnenwwenwnw
    wseseesenwseswsesee
    nwnewwnwwwnwwwwswwwnenwesesww
    swswnwswsewwsewnwwseneswswnwswsewsw
    nwnwnwneneswneseswenwnenenenwnwneswnewese
    senenwwnenwwsenwnwnwwnwnwnwnwnwnwnw
    newnwnwnwneswnwwnenesenwnwnwneenenwne
    enwnwnenwnenenewnenwnenese
    nwneewwesesewwwnewsewwwww
    sesenwseseseseseesweswenwseseeseese
    seseseswnweswseseseseseneswswseswseswnwse
    swwsenwseeenesewwwenwsweesesee
    wsewneneeenenenwneneneweeswnenesesee
    enwweewseeneswenwewwenwswesee
    seswneseneswwswseeswswswswneseswswsw
    nenwnenenwsenwnwnwnenwnenenwnwseswnenwnw
    newswwwwwewewswewseewswswswnww
    seeseseeseweenwse
    eswseseenweneswnwseesw
    nwnwnwneenenwsenenenenenwwnwnwneneswnenw
    eeenwneeesweeeneeeeneneswene
    seswswsenesenewseswneswwswswswseswswnw
    eeeswneeneenesenweesenenewneneee
    neseeeswwneweneenwewsweweee
    nwnwneneswnwneenwwnwnwnwnenwne
    seswwsewwwnenenwsenesewwswnewwswnw
    nenenenenewnenesenenw
    nwsenwnenwsenwnenenwnwnwnwnwnwnwnwnenw
    seeesenwswwswwweseene
    nenwnwnenenenwnwneneswneneneneneenenwsw
    swwseswnwnewsesewwswwswwswswnwswnw
    nenwswneneswneneeeseeeneneenenwenee
    nwnenenwseswewswsenenenwnenwnwenwnenww
    swswseseswwnenenweseseswnewswswwsw
    wswswswswwneswswswsweswswswswswsesww
    nwnwwnenenwswnwnwswnwwnenwesewsewnw
    seneswwenwnwswnesewswwwneenwswsee
    nenweneenenenenewnenenesewseneneenenene
    neeswneneeneeneeswneenwenesweene
    eswnenweenwswesweseeeeewewneee
    nwswseswnenwnwnewwnwnwwnwnenwnwnwnwnwnw
    newnenenenenenenenwnenesenenenee
    wseswswswswseswswnwsenesesw
    nwsenenewwnenenenesenenenenenenwnw
    swseswswneswswnwswswseswseswsewswse
    esenenenwnwnwnwnenenewnenwnwnenenewsene
    wnwsenwenwnewnwwnwnwwwnwsewnewwnw
    nwnwnwsenwnwwnwnwnwenwnwewswnwnwnwswnenw
    wwwnwnewwwsewwnewwwsewwww
    nwneneneneswnewnenenenenenenenesene
    nwwwswswnwwseewenewewwwwsesw
    nenweeenewweneeneneeswnwesenee
    sweneswnwsewweneneeenweseneweeene
    neseeswswnwneeeeenwwneenwneesesw
    swswswswseswswswneswswweswswwwweswsw
    newenesewneneeneseeneswnweneenene
    sewneeneneswwwnwneswseseseeseseswse
    swseswneswswseseeswwnwnwswenwswnw
    nwnesesweenweseeenweeweeseene
    swswwneswseswswswseswswswseneswwseswse
    seseneseseeswesweenesesewsenwesesesee
    neeeseneswnenenenweenenenenenew
    swnwnenwnwsenwsenwnwnwsenenenwnwsenesenwse
    swwneseswswnwseswswseseseseesesesesene
    swneswnenenwnenenenenenwneneneewnenwene
    wwswwwnwnwwwwneewwwwnwwwsw
    sesesenesesewseneseewseseseseswseseswse
    swsweswswwneswswswswseswswsw
    nwweswswseneswsenwenwwwnwswswwnewe
    seswswswswnwseswswswswswswswenwswseswsw
    seswswseseseseesesenewsenwsesewnesesw
    neeneneeneneneenesenenenenenenw
    nwnwnwnwsenwnenwnwnwnwnwnwnwnwnwnw
    wseseesenesesesesesesesw
    nwsewnwswwsewnwenwnwsenesenwnwnwnwnese
    nwwneswenenenenenenwnenenenwnwnenesene
    wwwwwseewwwwsewswwswwwswnenw
    swewswswswswwnenwnwswweewswswwsw
    senewenwneswseswnwswnewnewnwee
    nwnwwwwwwenesenwwwnenwenwwwswswne
    nenwnenenesesewnwsene
    neswwswewsweswwwswnwnwwnwwewsw
    wswswswswswwnewswwwwwswww
    seseseseswesenwseewnwswseseseseswsewse
    swswwsewseeenwsweswneswnwwenenww
    wwnwwsenwwnwwwwneewnwswnwnenwwnw
    eseswseneseswswwsewseseeseeswswsesew
    swwswswnwseswnwneneeseswsenwneswswsesw
    sesesweswneswswnwwwswswswswswseswswsw
    seseeeeseewseseeeseseseenenenwswsese
    seneswseseswsenwswnwswswswswswswseswwswsw
    wnwwwwnwwwwnwnwnenwnesewnwsewsew
    wwwwwswnwnwswweenwwwnwwwww
    swesewwswwwnenewwswsewewwwww
    nesenewneneswnenewewneneneene
    seswwswseswseseswswneseseseswsesesenese
    neswswswswswswseswswneswswswsenwsweswswsww
    sesewnewneseseseswswswnwseswsweneswnwne
    nwwnwwwwnwwewnwwwswnwneenw
    wnwwwwwewwswwwswewwwwew
    swswneswswswwswseswseswseswswswseswnwse
    wswsesenwsenwseswseswswseswswswswswesese
    swnenesenenewseswnwswenwnwwnenenenwne
    senenwswneeswneeswwseswwnwwswswswsw
    esesenwseeseseseneweseseeseewnewsew
    wnwwenwwwnwnwnwnwswnwenwnweewnwe
    swewwewwwnwseswswneneswnwnewwnwnw
    sweeeneeneswnenwenene
    nwneseseeenwnwnwweseswewnewneseeswe
    eseeeseeeeeseseeeweweneneese
    swwwswwneswswswswswswswswwenewwwnwse
    nenwnwsenwnwwnesenwnwwnwnesenwnenwswnenw
    neenwnwwenenwnwnewswsenwneene
    swseseseeswswswsesesewswsw
    wewwnwnwewnwwwwwwwnwwwew
    weenwsweseewseseseneseewneeeee
    sesesenwseseseseswsenwneesesesesenwsese
    seeneseseweeeewseneswseeseeee
    newewswswwwswwswswwwswswwseswsw
    nweswnenewenenwswsweeeswneewnwesee
    swwswswewwswwwwnwwswswsw
    nwwnwnwnwnweeswwnwnwnweneseswwww
    wwnwnwswnwsewnwwswnwnesewnwnwnwnwwne
    nwnwnewnenwsewenwwneswnwnenenwneesene
    sewnwwswwnesewwsewnewnewsenenwse
    swnenwnwnwnenwnweneswnwnwnwnesenwnwnenw
    nweeseenwsesewswneenw
    sweeeswseeseseeesenwseseseenwese
    eneeweeeeeeweseeneseeeeeew
    wwswwwwwwwswswwwswweswwe
    wnwsewseseseewswnenwweneeenwsesew
    swwseswswswswnwwwweswswwwnewwsww
    swewwwswwneswswswswswnewwswwswwswse
    swswsweswnwswwwswewwswswswswswswsw
    nwsweseseseseseseeseseeseseneswsesenw
    seswswswswnesenwswswseseseswnwnwewseswsw
    wwwwwnwnwewneswwwsenwwwnewwsw
    nwneseneswwseswswseseseswseneseswswnesesesw
    eeneenwswneenewseeneneenenewswe
    seeenweseeneneneeenenwswwnwswee
    eneeesesweeenewnwneneenenenwene
    swseseseseswewnewsesenwswneseswwseenesw
    wsewwneswswnwwwwwww
    swswswswnwswswsewswwneswweeswswswwswsw
    sesesesesesenenwsesenesewseseseseeseswse
    neneenweeneeeneneenweneneswsweee
    nwswnwnwnwnwnwenwnenwnwswnwwnw
    weeneweswwsenese
    neesenwneseeeeseseeswswnwwesese
    seseseseseeeweeesesewesesese
    sesenwnwsesesenwswsesesesesesese
    neneswnenenewnenenwneneneseneneneneneene
    wneenenwnenwnenenwneneeswnenw
    ewseswwnwsenewenwwnwnesenwsene
    seseseseseswswseseseeseswsesesenwswnenewse
    eneswswewneeeenweeeeeeenenw
    eseeseseeweneseesewseewseesenww
    wswswneswswswswnweenwswsenwwenwwwse
    nwwewewnenwnwenwswnweesenwwswww
    nenenwnwsenenwnwnwnewnwnwnwswnwnwnesenw
    wswseneeswwwnenenenwwsesenenwneesene
    esenwsesesenweeseeseee
    wnwnenenwnwnwnwnwsenwnwnenwnenwnenesene
    eswswnenwneeeeeeeeeeeene
    neneneneswneneneneneneneneseneeenwwne
    enenwnwswswnwewwnwswewnwewswesenw
    newsewwwwwwwwwwnwnwsewenwwnw
    enwwnwwwswswsesenesesesesenwswseene
    wnenwnwnewnewwwnwnwsewwwnwswnwnwsenw
    wnwseseswswseseseswseneswswswsenwswswsw
    eeweeeeeneeeseeesweeenee
    wswwwwewnwwwwswweswsw
    nesenwswsesweswsesesenwsesesew
    neneneeseneseweswnenenwswswnweeee
    eeeeneeeeenweeweeneeswese
    seswswseseseseswswswswnew
    wwnwwwswnwsenewneswswswewewww
    neneeeeeneeswswsweneeeneenwnew
    wnewwswwswenwnenwneewwsew
    neewenwewseeesenwesweeneswswnwse
    swnwnewnwnwnwnwsenwenwnwwwnwnwnwenwnwnw
    enenwwneseenewneeeswnewnwwneswee
    swneewneswneeswnenwseneneneenesew
    neenesenesewneneewwneneneneneewse
    eneewnwenenenwswsewsweeseneswswee
    wwnwwwewnwwwwnenwnwsewnwnwsewnw
    wwwnwseswnwwenwnwnwnwnwnwnwwnwwnw
    nwneseswseswswewwseseneneseseneseswnwsw
    swnwswnwwneenwweswnwnwwnwnwnwwenwnww
    neswsenewweswwswswsweswsw
    swneseeseenesenwswseeeseseesewee
    wseswwwwwnewnwwnwwwnwwwne
    eeneneeeneeeweeeene
    nwneeeeneswenwswsweenwseseneswew
    eswweeeeneeeeeneee
    nwseeseswneseesesesesesesesenwesenesesew
    senenwswsenesenwswswewsenee
    nwnwnwnwwnwwwenewnwnwnwsenwewwsese
    sesesewswneseswnenesesesese
    swswswwswswsweswswsweswswwwsweswnw
    seswweseneeeeseswsewwnwsweswsewnw
    wwwnenwwwsewwsewwnwwewwwww
    eenweeseewwseeseseeswnenewesesee
    eneswsenenenenewneenewneneneneneenene
    seswseseswwnesesenwseseesenwnesesenenew
    neswswswswseswwswswswswnwenwswswneswe
    sewseseswseswseseneenewswswwseseswnwse
    ewwwwnwwswswsewswsewsenwwneswnee
    wneweeneswwseenwswsenwsweenwneneee
    seseseneseneswswnwsewswnw
    wnesweeesweeeswenwenenenweese
    seeeweeneesenewneneeneeneneseenenw
    neswswnwnenwnwwswsenwnwseseenesenenwnesw
    neseswnwwseseneeswwneswswswwsweeswnw
    nwsenenwnesenwnwnwnwnwwneswnwnw
    wwewwwwwew
    wswwwwwwneswewnwswwwwswwnwesw
    seseseseseesesesenwsesesesw
    nwnenenwnwnenenwnwsenenwnwnwswnenenw
    seseseneneneeswnwnwsenwnwnwswswneswew
    wnwnenwnenwseeneswnwnwswnwwsenenw
    seswswswswseswswwswswswe
    nwneeseswsenwesesewsenwswwneseseesw
    seeeeeeenweeeeeesweenwsew
    swnwwseewnwwnwsenwnwnwnwnwwwnwwwwnw
    nwseneeswnwnenwswnwnene
    eneseneeswewwsewnwswnwswneesenese
    wwwwwswwneswwsesw
    seesesesewswnweswsewseseneswneswwsw
    wswwneswswnewswwseenwwswswwswswnwsw
    swswwswnwwswswseeeswwneswswsw
    nwnewewwsesewwwwwwwwswnwww
    nenwewswwwwwwsenwwnwse
    sesewsewseeesesene
    eenenwsweenweeeenwseseenwseseesw
    nwwnwwswswnwewsenwnwnwneeneswwwnwnw
    swnewwswswwnewswwswswseswswsenewww
    nwsenwsenwswsenweneenwsesenweewnwswswe
    seseenwseesewneeeseseseewseese
    eewenwnwswsewsene
    wnwnwsenwnwenenwnwswwwnwnwnwsewnwnwnwnw
    nwnwnwnwnwnwsenwnenwnenwnwnwnwnwwnwse
    nwswseswswswswseswsesweneseneswwsenwsw
    wsewnewnewseewwwwswswswwnwswsw
    wneseswnwwnwseseswneseswwnwwenewswsw
    swnewswwwewwswnwenwsewwwswswnww
    seseseseseseseseswsesesenw
    seseneswseswseswswwsesenesesesenwswsww
    ewnwnwsenenwnwwsewwseswnwwsenenwnw
    neenenenwnwnenwwnenenweneswnwnwnw
    wnwnwnwnwnewwwsewwsenwnwwnwnwnww
    nwneeswweeeeseenweeenweswswswse
    wwwswnwwwwnesewwewnewwwsew
    wwnwnwnwswwwwwwne
    nwnwnwnwnwnwnwnwewnw
    swwwswswswswswsweswnwswsweneweswswswsw
    nwnenwseneswsenwneenwnenenwnenwnwswnenwnw
    esewnwsesenwseeseeseseeseese
    senenwneeneneeneeenwnenenenweswneneswe
    sesweenweeeenesewwseesesesenese
    seseswswsesesesesenwseneswseseesesesese
    sweeseeeneeneenenwnwenesweenw
    nwnwnwwnenwnwnwnwnwesenwswsesenenwww
    wwwwwswnwwnewsew
    nenwnenenenenewsenwwene
    nesesenwnewseswswsewseseenenwsweswwswnw
    wnwsenwwwsenesewswnenwwwseneenwsww
    neswnwnwsenwnwwsesweewnesenwseseenew
    nwnewsewwwwnwnwww
    nwsenwwnwnwnwnwnwnwnenwsenwnwnwnwnwwnw
    eneeneeneeneneneswswnwneenenwnenwneswne
    wswnenenweswnwnenenwesweenenwnw
    wswnwswneswwseseswswwswwwswswnwsesene
    sewseneeseenwnweeesw
    seswnewenesewnewswwswneswswseswwne
    nenwnwnwwswnenenwnwnenenwnwnesenwnwenwnwsw
    wwswswwneswnewwwsewewwswwwswe
    newsweneseneenewnenewenewesenewe
    nenwneneswneneneswswneenenenenenenenenene
    seswnesesesesenwsesesewsesesesenwnwseswse
    sewseesesesesesenesesesenwswnwneseew
    eeeeeeeseswnwenenwsewsweeee
    wnwswsewewwwnwwswwwnwwwenwnew
    nwsweeeeeeeeeesenweseeeeesw
    nwnwwnwenwwnwnwnwnwnenwnwnwenwnwnwswnw
    nwswswswwewswswneseswswswswwswswnesww
    eswseseeweeeseeeneneseesesesee
    neneneeneswneenweneneeenenenenewsene
    wseeweneneweseeneeneneeeseenenene
    neesenwwsenenenewwweeneneweesw
    nesesenwneeneeesenwwswneswnwnwneww
    eesweweneeneeeeneesweeseenwe
    nenwnwnwswneneenenenwnenwnwnwswnesenenenew
    neswnesenwswseswesenwswseswewswsesww
    eseenweeseeeeeeesesesenwswee
    wseseeseseeesesee
    swsewnewwwnesesewwwwnwsewnenewnw
    nenenenenesenenenenewnwnesenenenwnw
    nwswswnewewnenwsewseswwsenenwesenwew
    enwnwnwwnwswwwnww
    eeeseeeesesenewseweeeeesene
    nwnwnewwwnwenwwswwnwwnwseesewse
    weenenenenenenenewnenesweneenesenw
    swenwsesenenwsewswnewsw
    senenwneseswwswnesenwnewnenenenenenenenw
    wwswwwswwnewwsewsw
    enewswwnewwwwwwnewnwseswswwwsw