首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >揭开黑匣子的所有线索

揭开黑匣子的所有线索
EN

Code Golf用户
提问于 2022-03-09 21:15:49
回答 1查看 376关注 0票数 6

黑匣子是一个棋盘游戏,你的任务是揭示所有的线索。

什么是黑匣子

黑匣子是一个隐藏原子的棋盘游戏,你的任务是输入,所有的原子,揭示所有的线索。

I/O

输入

原子可以是任何一个字符,而不是像这样的换行符(用于分隔符)。

代码语言:javascript
运行
复制
O....
...O.
..O..
.....
....O

输出

当代码显示所有线索(见下文)时,上述给定输入的输出可以是:

代码语言:javascript
运行
复制
 HRHH1
H     1
R     H
H     H
2     R
H     H
 H2HRH

代码语言:javascript
运行
复制
[["H", "R", "H", "H", "1"], ["1", "H", "H", "R", "H"], ["H", "R", "H", "2", "H"], ["H", "2", "H", "R", "H"]]

忽略这个数字,这并不意味着什么,这个数字必须是非唯一的,并且必须以>9的弯道工作。

任务

Hit

原子与射线以三种方式相互作用。射线对原子的直接影响就是“命中”。

代码语言:javascript
运行
复制
.........
.........
.O.....O.
.........
.........
...O.....H 1
.........
.......O.

因此,射线1发射到左边的盒子结构中,直接击中一个原子,产生一个由"H“指定的”命中“。击中原子的射线不会从盒子里冒出来。

偏转

射线实际上并没有击中原子,但直接传递到球的一侧,所产生的相互作用称为“偏转”。这种射线/原子相互作用的偏转角是90度。射线2被左边的原子偏转,如图所示,离开了盒子。

代码语言:javascript
运行
复制
    2
.........
.........
.O.....O.
.........
.........2
...O.....
.........
.......O.

ASCII艺术中的

解释:

代码语言:javascript
运行
复制
    2
....^....
....^....
.O..^..O.
....^....
....\<<<<2
...O.....
.........
.......O.

反射

射线与原子相互作用的最后一种类型是由"R“指定的”反射“。这种情况发生在两种情况下。如果一个原子位于网格的边缘,任何光线直接指向它旁边的网格都会引起反射。

代码语言:javascript
运行
复制
.........
.........
.O.....O.
.........
.........
...O.....
.........
.......O.
      RHR
      354

左边的射线3和4都会产生反射,这是由于边缘的原子。射线5会对原子产生影响。

双偏转

导致反射的另一种情况是,两种偏转抵消掉。在左边的网格中,射线6由于与网格中的原子相互作用而产生反射。

代码语言:javascript
运行
复制
   6

   R
.....
..O.O
.....
.....
.....

Detour

不产生撞击或反射的射线被称为“绕行”。这些可能是单个或多个偏转,或错过。一个绕道有一个入口和一个出口位置,而点击和反射只有一个进入位置用于一个命中,一个入口/退出位置用于一个反射。

代码语言:javascript
运行
复制
  8   8  
.........
.........
.O.....O.
.........9
.........
...O.....
.........9
.......O.

当然,当这些行为相互作用时,会产生更复杂的情况。射线8导致两个偏折,射线9也是如此。

有些射线走在扭曲的轨道上,就像左边的射线1。

代码语言:javascript
运行
复制
 .........
 .........
 .O.....O.
 .........
1.........
 ...O.....
 .........
 .......O.
     1

请注意,上面这个由五个挠度组成的复杂集合看起来就像一个单一的偏转,如左边的射线2所示。事情并不总是像在黑匣子里看起来那么简单。

代码语言:javascript
运行
复制
 .........
 .........
 .........
 .....O...
1.........
 .........
 .........
 .........
     1

反射和点击也可能更复杂。光线2被第一个原子偏转,由下两个原子反射,再被原原子偏转,产生反射。

代码语言:javascript
运行
复制
.O...
.....R 2
.....
.O.O.
.....

下面的射线3被第一个原子偏转,然后被第二个原子偏转,然后击中第三个原子,产生一击。

代码语言:javascript
运行
复制
   ...O.
   O....
   .....
3 H.....
   ...O.

ASCII艺术中的

解释:

代码语言:javascript
运行
复制
  8   8  
..v...^..
..\>>>/.
.O.....O.
......../9
........v
...O....v
........\9
.......O.
 
 .........
 .........
 .O.....O.
 ../>>>\..
1>>/...v..
 ...O..v..
 ..../</..
 ....v..O.
     1
 
 .........
 .........
 .........
 .....O...
1>>>>\....
 ....v....
 ....v....
 ....v....
     1

测试用例

代码语言:javascript
运行
复制
O....
...O.
..O..
.....
....O
->
 HRHH1
H     1
R     H
H     H
2     R
H     H
 H2HRH

O
->
 H
H H
 H

OOO
O O
OOO
->
 HHH
H   H
H   H
H   H
 HHH

..O..
O...O
..O..
->
 HRHRH
R     R
H     H
R     R
 HRHRH

...
...
...
->
 123
4   4
5   5
6   6
 123

....
O...
...O
....
->
 H1HH
R    1
H    R
R    H
2    R
 HH2H
```
代码语言:javascript
运行
复制
EN

回答 1

Code Golf用户

发布于 2022-03-10 18:21:37

Python3,935字节:

代码语言:javascript
运行
复制
E=enumerate
S=lambda b,x:(x+1==len(b)or x==0)*[1,-1][x>0]
def F(b,C,v,x,y,q,w,c=0):
 if int==type(b[x][y])and c:b[x][y]=[v,'R'][C==(x,y)];return
 if b[x][y]=='O':b[C[0]][C[1]]='H';return
 T=[]
 for i in[1,-1]:
  X=x+(i*(q==0)+(q!=0)*q);Y=y+(i*(w==0)+(w!=0)*w)
  if X>=0 and Y>=0:
   try:T+=[i]*(b[X][Y]=='O')
   except:1
 T*=b[x+q][y+w]=='.'
 if not c and T:b[C[0]][C[1]]='R';return
 if T:
  Q,W=0,0
  if len(T)==2:Q=q-1*(q!=0)*q;W=w-1*(w!=0)*w
  else:Q=(q==0)*T[0]*-1;W=(w==0)*T[0]*-1
  F(b,C,v,x,y,Q,W,c+1);return
 F(b,C,v,x+q,y+w,q,w,c+1)
def g(b):
 for x,j in E(b):
  for y,k in E(j):
   if k and type(k)==int:F(b,t:=(x,y),b[x][y],*t,S(b,x),S(b[0],y))
 return b
K=lambda b:'\n'.join(''.join(map(str,[[j,' '][y in[0,len(a)-1]]for y,j in E(a)]if i in[0,len(b)-1]else[[' ',j][y in[0,len(a)-1]]for y,j in E(a)]))for i,a in E(b))
f=lambda b,c=0:K(g((A:=[[0]+[(c:=c+1)for _ in b[0]]+[0]])+[[(M:=(c:=c+1))]+i+[M]for i in b]+eval(str(A))))

在网上试试!

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

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

复制
相关文章

相似问题

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