给出了一组这样的公式:
bacb
bcab
cbba
abbc
给出一个算法,当每个变量在每个公式中替换"0“或"1”时,可以找到唯一结果的数目。
有(k!)^2
公式,每个公式都有2k-1
变量和k^2
项。用k
来表示你的渐近性。
最快的算法获胜。在领带的情况下,具有较低渐近内存使用率的解将获胜。如果这仍然是一场平局,第一局就赢了。
对于上面的例子,可以通过替换变量获得以下结果:
1110, 0110, 1001, 0100, 1000, 0000, 0010, 1101, 1111, 0001, 1011, 0111
因此,正确的答案是12。其中,1010
不能使用上述公式。
发布于 2015-04-13 03:06:10
Length[Union@@(Fold[Flatten[{StringReplace[#,#2->"0"],StringReplace[#,#2->"1"]}]&,#,Union[Characters[#]]]&/@#)]&
希望我计算的时间复杂度是正确的。输入是诸如{"bacb","bcab","cbba","abbc"}
之类的公式的列表。在我的机器上,每一个测试用例的运行时间都不到30秒,但谁在乎绝对时间呢?
&
使它成为一个纯函数,#
引用第一个参数,#2
表示第二个参数,等等。Length[*..*]
取其中包含的列表的长度。Union@@(*..*)
接受包含的列表并提供它作为Union
的参数,后者返回其任何参数中唯一元素的列表。*..*&/@#
接受一个纯函数并将其映射到公式列表上,这样{a,b,c}
就变成了{f[a],f[b],f[c]}
。注意,在嵌套纯函数中,#n
引用其最内部的参数。Fold[*..*&,#,*..*]
接受累加器函数、起始值和列表,并返回f[f[...[f[starting value,l_1],l_2],...],l_n]
。Union[Characters[#]]
接受当前公式中的所有字符,并获取所有唯一元素,给出变量。Flatten[*..*]
使其参数变平,从而使{{{a},b},{{c,{d}}}}
变为{a,b,c,d}
。{*..*,*..*}
只是使用上面的Flatten
组合这两个结果的一种方法。StringReplace[#,#2->"0/1"]
接受前面的结果,并用0
或1
替换当前变量返回它。https://codegolf.stackexchange.com/questions/48750
复制相似问题