- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的问题是,我应该用什么算法来实现一个功能translate
根据以下 Python 示例工作:
>>> translate('aa', 'a')
[('S', -1)]
>>> translate('a', 'aa')
[('R', 0, 'x'), ('S', 1), ('W', 0, 'x')]
>>> translate('abc', bca')
[('R', 0, 'x'), ('R', 1, 'y'), ('R', 2, 'z'),
('W', 2, 'x'), ('W', 0, 'y'), ('W', 1, 'z')]
>>> translate('abc', 'cabc')
[('R', 2, 'x'), ('S', 1), ('W', 0, 'x')]
>>> translate('ab', 'bab')
[('R', 1, 'x'), ('S', 1), ('W', 0, 'x')]
>>> translate('abc', 'bcabc')
[('R', 1, 'x'), ('R', 2, 'y'), ('S', 2), ('W', 0, 'x'), ('W', 1, 'y')]
这是与生成最佳代码相关的问题的概括在我拥有的编译器中。该算法是我所追求的,所以解决方案不一定必须在 Python 中。在“现实”中变量(上面的'x'
, 'y'
and 'z'
)是机器寄存器和字符串索引堆栈位置。
从示例中可以看出,该算法是关于转换使用最少的从一个字符序列到另一个字符序列的字符串步骤数。需要注意的是只有三种可能可供选择的操作:
?
个字符。例如 ('S', 2)
-- 将字符串移动两个索引权利。?
字符则执行。例如('R', 4, 'q')
-- 读取索引 4 处的字符并将其存储在变量 q
.('W', 1, 'q')
-- 将字符写入字符串中索引 0 处的变量 q
。这是实现这些操作的简单 Python 代码和一个从 ab
到 bab
的转换示例手动执行:
def shift(str, n): return str[-n:] if n < 0 else '?'*n + str
def read(str, n): assert not '?' in str; return str[n]
def write(str, n, ch): return str[:n] + ch + str[n:]
S = 'ab'
x = read(S, 1)
S = shift(S, 1)
S = write(S, 0, x)
这一系列步骤将对应于解决方案[('R', 1, 'x'), ('S', 1), ('W', 0, 'x')]
。
我觉得这个问题和 av 之间有一些相似之处levenshtein 编辑距离,但我无法弄清楚。 你也可以为我编写翻译
算法?
如果这个问题描述不够清楚,我会添加更多示例但我希望如此。
最佳答案
首先,我想我修复了您的 Python 代码。这是一个可以运行一系列步骤并给出结果的类。您的示例在结果中留下了 ?
,我认为这是不应该发生的。
这是SequenceRunner
class SequenceRunner:
def __init__(self):
self.INSTRUCTIONS = {
'R': self.read,
'S': self.shift,
'W': self.write
}
def set(self, S):
self.S = S[::-1]
def shift(self, n):
self.S = self.S[-n:] if n < 0 else '?'*n + self.S
def read(self, n, v):
assert not '?' in self.S; return self.S[n]
def write(self, n, v):
v = getattr(self, v)
self.S = self.S[:n] + v + self.S[n+1:]
def run(self, program):
for line in program:
func = self.INSTRUCTIONS[line[0]]
args = line[1:]
result = func(*args)
if result:
setattr(self, args[-1], result)
def get(self):
return self.S[::-1]
下面是使用方法
c = SequenceRunner()
program = [('R', 1, 'x'), ('S', 1), ('W', 0, 'x')]
c.set('ab')
c.run(program)
print c.get()
问题以便我更好地理解:您是否需要一种算法来推断从一个字符串到另一个字符串所需的(最少的)步骤?
关于python - 使用尽可能少的步骤转换序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27636207/
我知道在 KDB 中,如果您有一个列表,例如... l:`apples`oranges`pears` 您可以像下面这样进行 N 次随机选择: 9?l 但是如何尽可能均匀地选择列表中的每个项目? 最佳答
我真的厌倦了它。我有一个高级 Web 应用程序依赖于大量 Javascript 库(jQuery、jQueryUI、OpenLayers、highcharts、EJSChart 等等)。不用说,Int
我是一名优秀的程序员,十分优秀!