首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成扫雷器网格

生成扫雷器网格
EN

Code Golf用户
提问于 2012-06-26 15:54:08
回答 7查看 4.2K关注 0票数 17

扫雷舰是在大多数操作系统上发现的一种逻辑游戏。游戏的目标是确定地雷在网格上的位置,给出指示该地点周围地雷数量的数字。

给定网格大小和一组地雷,为这组地雷生成扫雷网格。

输入:两个整数表示网格大小,一个未定义的整数表示地雷位置。位置将被指定为(列位置,行位置),索引将从第1行开始。

输出:扫雷网。如果街区周围没有地雷,打印一个x。对于每一行,打印一条换行符。请将所有地雷输出为星号*。打印时,不要在行中的值之间留下任何空白。

测试用例:

输入"5 5 1 3 3 5 2 4“

代码语言:javascript
复制
xxxxx
11xxx
*21xx
2*21x
12*1x

输入"3 4 3 1 1 4 2 3 3 2":

代码语言:javascript
复制
x2*
13*
2*2
*21

最短代码获胜。

EN

回答 7

Code Golf用户

发布于 2012-06-26 19:22:50

Mathematica-247 chars

代码语言:javascript
复制
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]

示例:

代码语言:javascript
复制
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产生细胞数。然后将地雷(*)插入阵列。

票数 2
EN

Code Golf用户

发布于 2012-06-26 17:59:36

VBA - 298 chars

代码语言:javascript
复制
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跳过错误可以为我节省一些字符,但这仍然不如其他一些答案好。*-/

票数 1
EN

Code Golf用户

发布于 2012-06-29 14:20:32

这是Brainfuck解决方案的开始。它应该与缩进和堆栈注释(@表示堆栈指针)相当可读的:

代码语言:javascript
复制
>>,>,  |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“会给你:

代码语言:javascript
复制
XXXX
XXXX
XXXX

我想看看其他人是否有能力解决布拉福克的这个问题。

票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/6474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档