doukaku291 s = zipWith (\x y -> zipWith max x y) half rot90Half
  where
    ss n      = replicate n ' '
    len       = length s
    width     = len * 3 + 1
    quartar   = [(ss len) ++ s ++ (ss len) ++ " "] ++
                (replicate (len - 1) $ ss width)   ++
                [s ++ (ss len) ++ s ++ " "]        ++
                replicate (len * 2) (ss width)
    half      = zipWith max quartar $ reverse $ map (\x -> reverse x) quartar
    rot90Half = reverse $ take width $ foldr rot (replicate width []) half
      where rot (c:cs) (r:rs) = (c:r):(rot cs rs)

main = mapM_ putStrLn $ doukaku291 "doukaku"