给定长度列表和代表这些长度的字符串,它们匹配吗?


16

给定一个表示长度列表的模式,以及一个表示这些长度的字符串,它们匹配吗?

对于感兴趣的人来说,这等同于验证Nonogram的行或列是否正确。但是,我省略了与非图相关的所有语言,以使那些不熟悉这些谜题的人感到困惑。

输入值

两行数据,由换行符分隔。

  1. 第一行将是一个由空格分隔的整数列表,例如:

    3 6 1 4 6
    

    该行描述的填充模式的大小等于整数列表,并由第二行必须匹配的,未知长度,正长度的空白空间分隔。匹配的字符串的开头和结尾处也可能有空格。

  2. 第二行将是可能与第一行中的模式不匹配的行。它完全由#x_。这条线被保证至少只要在第一行中的整数的总和,再加上不同整数的数目减1,并且可以更长。因此,在这种情况下,第二行保证至少为(3+6+1+4+6) + (5) - 1或24个字符长。这是与第一行中的模式匹配的示例24个字符行:

    ###_######_#_####_######
    

符号的含义:

  • # 这代表一个填充的盒子
  • x 这表示一个标记为“保证为空”的框
  • _ 这表示一个未知/未标记的框。

目标

这个想法是:

  1. 验证第二行可能是符合第一行模式的有效行。
    • ERROR如果未知空格不能用#x匹配第一个,则必须打印明确的错误消息(选择方式由您决定;下面的示例编写,但不必是这5个字符)线。
  2. 打印已完全放置在行中,以空格分隔的整数的零索引索引如果有歧义,请勿打印索引

例子:

Input:                    |  Output:    |  Reason:
--------------------------------------------------------------------------
3 6 1 4 6                 | 0 1 2 3 4   |  This is a complete string that 
###x######x#x####x######  |             |  matches perfectly.
--------------------------------------------------------------------------
1 2 1                     | 0 1 2       |  There is no ambiguity which filled cells 
#____xx___##__x_#         |             |  correspond to which parts of the pattern.
--------------------------------------------------------------------------
1 2 1                     |             |  I don't know whether the filled block is
____#___x                 |             |  part of the 1, 2, or 1, so output nothing.
--------------------------------------------------------------------------
1 2 1                     | ERROR       | The first unknown cell will create a block that
#_#x_#                    |             | matches either 1 1 or 3, but not 1 2.
--------------------------------------------------------------------------
1 2 1                     | 0 2         | Even though we know where all the filled cells
#____#                    |             | must be, only 0 and 2 are actually filled here.
--------------------------------------------------------------------------
1 1 1 1                   |             | There are so many possible ways to do fill this,
__#_______#____           |             | we don't know which indices are actually matched.
--------------------------------------------------------------------------
4 4                       |             | Again, we don't know WHICH 4 is matched here, 
______x####________       |             | so output nothing.
--------------------------------------------------------------------------
4 4                       | 0           | However, here, there's no room for a previous 4,
__x####________           |             | so the displayed 4 must be index 0.
--------------------------------------------------------------------------
3                         | ERROR       | We can't fit a 3 into a space before or after
__x__                     |             | the x, so this is impossible to match.
--------------------------------------------------------------------------
5 1 3                     | 0           | While we can match the 5, we don't know whether
x#####x____#____          |             | the single block matches the 1 or the 3.
--------------------------------------------------------------------------
3 2 3                     | 1           | The two has been completely placed,
____##x##____             |             | even though we don't know which it is.

规则:

您可以编写一个程序或函数,该程序或函数以换行符分隔的字符串或从STDIN(或最接近的替代方案)接收输入,并以空格分隔的String 返回输出或将其打印到STDOUT(或最接近的替代方案)。您可以选择在输出中包含单个尾随换行符。

此外,这不再是滑稽标准的漏洞禁止


1
这是用于解决非图的,对吗?提及非字母词可能会有所帮助,因为这会使解决它们的人立即面临挑战。
xnor

@ jimmy23013编辑作为回应。
durron597

Answers:


5

Perl,134个字节

(包括1个开关)

perl -pe '$p.="([#_]{$_})[x_]+"for@l=split;chop$p,$_=<>;/^[x_]*$p*$(?{$h[$_-1].=$$_ for 1..@l})(?!)/;$_=@h?join$",grep{$h[$_]!~/_/}0..$#l:ERROR'

从STDIN接受两行输入。必须为每个输入重新执行。

想法是首先提取与给定长度匹配的所有可能模式。例如,如果我们有长度1 2和模式#_x_#_,则匹配的模式是(#, _#)(#, #_)。然后,为每个索引连接匹配的模式-例如,结果为list (##, _##_)。现在,打印列表中所有仅包含“#”字符的字符串的索引。

我在这里得到了从Perl中的正则表达式中提取所有可能匹配项的方法。


凉。您可以添加非公开版本和ideone链接吗?
durron597

当然,我在答案的末尾添加了链接。
svsd 2015年

高尔夫球代码段看起来多么可怕的真实例子!至少对我来说。
Arjun

1
@Arjun Golfing倾向于混淆代码。打高尔夫球的代码有其美,但前提是您必须知道该语言的编写语言
。– svsd

1
我添加了一个新示例,因为问题描述中的一个场景仍然模棱两可。幸运的是,在这种情况下,您的程序仍然可以正常工作。
durron597
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.