# [R], <s>288</s> <s>281</s> 267 bytes <!-- language-all: lang-r --> _thanks to @cole for -1 byte, reordering the `?` to collapse the 2 into `rep(2,10)`_ function(n){m=matrix(sample(strsplit("EAIONRTLSUDGBCMPFHVW?YKJXQZ","")[[1]],n^2,T,c(12,9,9,8,6,6,6,4,4,4,4,3,rep(2,10),1,1,1,1,1)),n,n) K=(n+1)/2 if(n>8){i=!((col(m)-K)%%3|(row(m)-K)%%3|row(m)%in%c(1,n)|col(m)%in%c(1,n)) m[i]=chartr("A-Z?","a-z!",m[i])} m[K,K]=" " m} [Try it online!][TIO-j7htvwnq] [R]: https://www.r-project.org/ [TIO-j7htvwnq]: https://tio.run/##RY9bS8NAEIXf8yvahcAMTtBNRVpwLfVe4916a4gQQoIL2W3YrFRs@9vjaqzlezpzDjNzTFN09oOm@NCZlTMNGhdKqNQa@Ql1qqoyh9qauiqlBXYyGt9c308uHx6Pzw6Prm5Pz5@eh6/RxcvdlBFjGMc8SUi/hTShDHhIA0ef9n7Z/aNHJq8gJL6DxNcgkiaNXiRAb3HcDj1ZgD7o40KKLkA2K0FhEKHv95ZgZvONaoUvte8uuhXLNrsZoKdimYjsPTXWABsF06F7Ng2@uox@HFy5QERRIliHeWrVzI20ORQwQNfJFajzSrhy3nrOW4P/O803 "R – Try It Online" Returns a matrix. Fairly simple implementation; samples n^2 values with the proper distribution, stores as an `nxn` matrix. `K` is the index of the center. computes the indices of the matrix where the row and column distances from the center are both multiples of 3 and not on the edge (i.e., not `1` or `n`), lowercases those, replaces `?` with `!`, replaces the center with `" "`, and returns the matrix.