给定一组多米诺骨牌,您的任务是弄清楚哪些多米诺骨牌掉下而哪些不掉。
输入值
采取多米诺骨牌设置的矩形ASCII表示形式。以下字符用于ASCII网格:
(空格):空单元格
|
,-
,/
,\
:多米诺骨牌
多米诺骨牌可以沿8个方向下落,这些方向由以下字母表示(类似于WASD方向):
Q W E
A D
Z X C
一个或多个多米诺骨牌将被这些字母之一替换,以指示该多米诺骨牌一开始就被推了过来。这是一个例子:
D||||/
- /
- -
- -
/|||||
我不希望此挑战变成输入解析的练习,因此允许使用以下任何输入形式:
- 带有网格的字符串(如果有帮助,还可以在其前面加上尺寸)
- 每行包含一个字符串的数组/列表/元组(可选以及宽度和高度整数)
- 一个(嵌套的)数组/列表/元组,每个网格单元具有一个字符串/字符(可选以及宽度和高度变量)
您可以从STDIN读取或接受函数参数,甚至可以将输入存储在变量中。
输出量
以任何有效的输入格式写入STDOUT或返回(或将其保存在变量中)结果网格,以指示哪些多米诺骨牌下降了,哪些没有多米诺骨牌。也就是说,将每个下落的多米诺骨牌替换为,#
并保持每个站立的多米诺骨牌的状态与输入相同。
规则
当然,多米诺骨牌会通过设置传播它们的下落。由于可能存在竞争条件,因此我们假设存在固定的时间步长,并且下降沿每个时间步长传播一个网格单元。
多米诺骨牌通常会像您直觉地期望的那样落伍,但是严格的常识规范却相当冗长。抱歉,希望这些示例对您有所帮助。这是具有所有独特的两图块组合(最多旋转和反射)的要点。请继续阅读以获取严格的规则。
每个多米诺骨牌只能落在两个方向上:
W Q E
A | D - / \
X C Z
每当多米诺骨牌掉落时,它都会在掉落方向上影响细胞。如果该单元格包含可沿相同方向或相差45度的方向落下的多米诺骨牌,则该多米诺骨牌将在下一个时间步中落下。
例子:
D| -> DD (falls in same direction)
D/ -> DC (falls at 45 degrees)
C -> C (falls at 45 degrees)
- X
每当对角线的多米诺骨牌(/
或\
)掉落时,它也会影响到两个单元格,这两个单元格在其掉落方向上同时接触其单元格和该单元格。如果这些单元格包含的多米诺骨牌可能会沿着与原始多米诺骨牌相同的方向掉落,或者在远离其的轴对齐方向上掉落,则该多米诺骨牌会在下一个步骤中这样做。
例子:
C/ -> CC (the cell in the direction of the fall is the one below
the /, so it falls in the same direction)
C| -> CD (falls in the axis-aligned direction away from the C)
C- -> C- (the direction away from the Q is W,
or but neither - nor \ can fall to W)
C\ -> C\
例外:如果一次将多米诺骨牌同时推向两个有效方向(即上述任何规则冲突),它都不会掉落。
例子:
D|A -> D|A (central domino in pushed in both directions)
Z Z (although it's pushed in one direction by two dominoes
D\A -> D\A and in the other by only one, it doesn't fall)
X X (the domino is being pushed from two opposing sides
D-A -> DXA D and A, but neither is valid for that domino. Hence,
there is no conflict and the X can push the domino over)
Z Z (pushed in the same direction by two dominoes, so falls)
\A -> ZA
Z Z Z (once the conflict arises, the affected
\ -> Z -> Z domino is locked in its position and can't
D|A D|A D|A be pushed over by future dominoes)
例子
8 5
D||||/ ######
- / - #
- - --> - #
- - - #
/||||| /|||||
===============================================
17 9
E|/|||/ #######
- - # #
- - # #
- - # #
/|||/|||||||||/ --> ###############
/ - # #
/ - # -
/ - # #
/|||||\ #######
===============================================
19 8
\|/ ###
- - # #
D||||/|\ /|||/ ######## #####
/ - # #
- \- --> - \#
\- \ - #- \ #
D||||\ / \ / ###### / \ #
|\ ||||| |\ #####
==============================================
11 11
-\\\/|\|\-| -\##/|###-|
-|\\||\-|\- -|#####-|\-
|\//\//|-/- |#//\//|#/-
\|//|-|\-\| #####-|##\|
---||/-\//| #-######//|
///|||\---- --> #/#####----
-|/---|-|-\ #|##--|-|-\
--|--\/|/// ####-\/|///
/|//--|//-| ####--|//-|
|/\-|||-/-\ |/\####-/-\
E||\-|\---/ ####-|\---/
如果您认为我犯了一个错误(特别是最后一个错误),请告诉我。
E
(并不是说有区别……)。看起来您可以通过将压痕深度减小到最小来节省大量字符。