这是(我认为)复杂性理论中容易出现的问题。
#Consider the language E over the binary alphabet
#consisting of strings representing even non-negative
#integers (with leading zeros allowed).
#I.e. E = {x | x[-1] == '0'}.
#
#Reduce E to the language {'Even'} by implementing
#the function R
def R(x):
#Code
def main():
#test cases
assert(R('10010') in ['Even'])
assert(R('110011') not in ['Even'])
if __name__ == '__main__':
main()
根据Mapping Reduction def:
“语言A映射可缩减为语言B,写为A≤mB,
如果有可计算函数f:Σ* - →Σ*,其中每w,
w∈A⇐⇒f(w)∈B。
函数f称为从A到B的减少。“
可计算的映射函数将是f(n)= 2n(或Python中的x <&lt; y),但在那种情况下,那些断言没有意义,因为每个R(x)应该在{'Even'中} ...
答案 0 :(得分:0)
所以基本上你有E
作为整数的二进制表示,只有偶数。这由最后一位(整数1)表示为0
。所有其他数字代表2的倍数,因此无关紧要。
目标&#34;语言&#34;仅由字符串"Even"
组成。也就是说,每个偶数都必须映射到单词"Even"
。
所以分配实际上是:如果x
表示偶数二进制数,则返回"Even"
,否则返回其他内容。
最直接的方法是检查偶数二进制数的定义:
def R(x): # shortest/fastest option
return 'Even' if x[-1] == 0 else ''
def Rdocs(x):
"""
Map any of {x | x[-1] == '0'} to {'Even'}
Uses the definition {x | x[-1] == '0'}
"""
if x[-1] == '0': # check that x satisfies definition of even binary
return 'Even'
return ''
也可以使用显式映射来完成此操作:
translate = {'0': 'Even', '1': ''}
def Rmap(x, default=''):
"""
Map any of {x | x[-1] == '0'} to {'Even'}
Uses a literal mapping of x[-1]
"""
return translate[x[-1]]
或者,您可以将二进制文件转换为数字。 Python的int
类型也采用二进制文字:
def Rbin(x):
"""
Map any of {x | x[-1] == '0'} to {'Even'}
Uses python builtin to evaluate binary
"""
return '' if int(x, 2) % 2 else 'Even'
我从技术上讲,R(x)
应为<{1}}中的每个x
定义仅,除非您假设每个语言都隐含地包含空字。然而,你的单元测试表明它必须返回一些东西。您可能希望返回{x | x[-1] == '0'}
或'Odd'
而不是空字。