扫雷舰是在大多数操作系统上发现的一种逻辑游戏。游戏的目标是确定地雷在网格上的位置,给出指示该地点周围地雷数量的数字。
给定网格大小和一组地雷,为这组地雷生成扫雷网格。
输入:两个整数表示网格大小,一个未定义的整数表示地雷位置。位置将被指定为(列位置,行位置),索引将从第1行开始。
输出:扫雷网。如果街区周围没有地雷,打印一个x。对于每一行,打印一条换行符。请将所有地雷输出为星号*。打印时,不要在行中的值之间留下任何空白。
输入"5 5 1 3 3 5 2 4“
xxxxx
11xxx
*21xx
2*21x
12*1x输入"3 4 3 1 1 4 2 3 3 2":
x2*
13*
2*2
*21最短代码获胜。
发布于 2012-06-26 19:22:50
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]示例:
s@"5 5 1 3 3 5 2 4"
s@"3 4 3 1 1 4 2 3 3 2"输出:

ChessboardDistance计算每个单元格离地雷有多远,其中1对应于“邻接地雷”。1's的Count产生细胞数。然后将地雷(*)插入阵列。
发布于 2012-06-26 17:59:36
Sub m(x,y,ParamArray a())
On Error Resume Next:ReDim b(x,y):For i=0 To (UBound(a)-1) Step 2:c=a(i):d=a(i+1):b(c,d)="*":For e=c-1 To c+1:For f=d-1 To d+1:v=b(e,f):If v<>"*" Then b(e,f)=v+1
Next:Next:Next:For f=1 To y:For e=1 To x:v=b(e,f):s=s & IIf(v<>"",v,"x")
Next:s=s & vbCr:Next:MsgBox s
End Sub用On Error Resume Next跳过错误可以为我节省一些字符,但这仍然不如其他一些答案好。*-/
发布于 2012-06-29 14:20:32
这是Brainfuck解决方案的开始。它应该与缩进和堆栈注释(@表示堆栈指针)相当可读的:
>>,>, |0|x|@y| Pop the first two characters
[>>+<<-]>> |0|x|0|0|@y|
[<<+>+>-]< |0|x|@y|y|0|
[ |0|x|y|@y|
[>>+<<-]< |0|x|@y|0|0|y|
[>>+<<-]< |0|@x|0|0|y|y|
[>>+<<-]>> |0|0|0|@x|y|y|
[<<+>+>-]<< |0|@x|x|0|y|y|
[>>+<<-]> |0|0|@x|x|y|y|
[<< |@0|0|x|x|y|y|
++++++++[>+++++++++++<-]>>>>> |0|88|x|x|@y|y|
[>+<-]< [>+<-]< [>+<-]< [>+<-]< |0|@88|0|x|x|y|y|
[<+>-]>>- |88|0|0|@x_1|x|y|y|
]<< |x x's|@0|0|0|x|y|y|
++++++++++>>> x's|\n|0|0|@x|y|y|
[<+>-]> x's|\n|0|x|0|@y|y|
[<+>-]> x's|\n|0|x|y|0|@y|
[<+>-]<- |x 88s|0|x|@y_1|y|
] |@x 88s|0|x|y|然而,这还远未完成,我开始怀疑我的做法是否最佳。到目前为止,它只考虑前两个输入字符,并打印一个Xs表。例如,"43“会给你:
XXXX
XXXX
XXXX我想看看其他人是否有能力解决布拉福克的这个问题。
https://codegolf.stackexchange.com/questions/6474
复制相似问题