# Haskell, <s>102 bytes</s> 100 bytes Saved 2 bytes, thanks to [flawr][1]. c s=unlines$f(\m->f(m#))where f=(<$>[1..s]);m#n|or((==)<$>[n,m]<*>[1,s])||n==m||n==s-m+1='*'|1>0=' ' **Ungolfed version:** cross :: Int -> String cross s = unlines $ map line [1..s] where line m = map (pos m) [1..s] pos m n | n == m = '*' | n == s - m + 1 = '*' | elem m [1, s] = '*' | elem n [1, s] = '*' | otherwise = ' ' I'm sure this can still be improved, but this is what I've come up with for now. [1]: http://codegolf.stackexchange.com/users/24877/flawr "flawr"