Generating Minesweeper grids
GolfScript 122 98 94 93 91 88 87 85 82 81 80 71
~]2/(\:m;~\:w*,{[.w%)\w/)]:^m\?)42{m{^*~-.*@@-.*+3<},,72or 48+}if}%w/n*
Online demos:
Test Case 1: link
Test Case 2: link
J, 124 116 112 101 87 86 85 84 83 82 79 76 75 72 68 characters
'0x'charsub|:1":3 3(+/@,+9*4&{@,);._3[1(}.x)}0$~2+>{.x=._2<\".1!:1[1
Found what I was looking for - a way to get rid of the spaces (1":
) - and finally I'm competitive. Now I just need to figure out the empty set of mines problem.
Takes input from the keyboard.
Edit
New version makes use of a side effect of 1":
- numbers larger than 9 are replaced by *
.
Mathematica - 247 chars
s[q_] :=
Module[{d, r},
d = ToExpression@Partition[Cases[Characters@q, Except@" "], 2];
r = Rest@d;
StringJoin @@@
ReplacePart[
Table[ToString@
Count[ChessboardDistance[{i, j}, #] & /@ Reverse /@ r, 1], {i,d[[1, 2]]},
{j, d[[1, 1]]}] /. {"0" -> "x"}, # -> "*" & /@ Reverse /@ r] // TableForm]
Examples:
s@"5 5 1 3 3 5 2 4"
s@"3 4 3 1 1 4 2 3 3 2"
Output:
ChessboardDistance
computes how far each cell is from a mine, where 1 corresponds to "next to a mine". The Count
of 1's yields the cell's number. Then mines (*) are inserted into array.