代码之家  ›  专栏  ›  技术社区  ›  user225312

C++和Python中的预定义文本替换

  •  3
  • user225312  · 技术社区  · 14 年前

    7 回复  |  直到 14 年前
        1
  •  1
  •   Steve Jessop    14 年前

    没有简单的优化结构-对于任何给定的固定映射,可能会有对精确映射的恶魔般的位旋转优化,在不同的架构和不同的输入上是好是坏。地图/字典应该一直都很好,代码也很简单。

    因为这是一个学习练习,您需要尝试不同的可能性:对于文本->morse,您可以使用数组而不是地图/字典。也许令人惊讶的是,这在C++中是很难做到的,而且是完全可移植的。以下假设所有大写字母 char 值大于 A ,本标准不保证:

    std::string encode['Z'-'A'];
    encode['A' - 'A'] = ".-";
    encode['B' - 'A'] = "-...";
    // etc.
    encode['Z' - 'A'] = "--..";
    

    如果您愿意假设您的代码只会在基本字符集包含连续运行的字母的机器上运行(ASCII是这样,但EBCDIC不是这样),您可以稍微整理一下:

    std::string encode[26] = {".-", "-...", /* etc */ "--.."};
    

    c

    morse = encode[c - 'A'];
    

    Python版本可以假设ASCII(我认为),您必须使用 ord .

    要处理除大写字母以外的任何字符,您需要一个更大的数组(为每个可能的字符值包含一个条目),或者需要多个带有边界检查、标点符号的特殊大小写代码等的数组。

        2
  •  3
  •   Nick T twasbrillig    14 年前
    from collections import defaultdict
    
    morsecode = [('a','._'), ('b','_...'), ('c','_._.')]
    codedict = defaultdict(lambda:' ')
    for k,v in morsecode:
        codedict[k] = v
    
    tomorse = lambda x: ' '.join([codedict[chr] for chr in x])
    
    print tomorse('bab cab')
    

    给予:

    _... ._ _...   _._. ._ _...
    
        3
  •  2
  •   Joschua    14 年前

    str.translate :

    m = {ord('S'): '---', ord('O'): '...'}
    print('S O S'.translate(m))
    

    --- ... ---
    
        4
  •  2
  •   llasram    14 年前

    在Python中,字符串是不可变的,因此可能(取决于您对输出所做的操作)需要创建一个包含所有简单替换结果的列表。比如:

    MORSE = {'A': '.-', ...}
    
    def morsify(data):
        return [MORSE[c] for c in data if c in MORSE]
    

    如果你想支持不同国家版本的摩尔斯电码等,你就需要相应地变得更喜欢。

        5
  •  2
  •   stonemetal    14 年前

    在Python方面,string类的translate函数是一个不错的选择。在C++方面,我将使用一个STD::map来保持字符映射。然后我可能会使用std::for\ each进行查找和交换。

        6
  •  1
  •   Wayne Werner    14 年前

    这个 first hit Google .

    根据文本的数量,“foo”。replace('f','..-.')。replace('o','--')可以工作。

    除非您要翻译成千上万行的文本,否则您可能不会注意到所使用的任何方法有太大的差异—尽管您可以轻松地使用timeit模块来测试每个不同的方法。

        7
  •  0
  •   bluish dmajkic    12 年前

    Python(需要字符串):

    def m(t):
     m=0xBFAFA7AEA1A0B0B8BCBE121A021D11120C41888A642082668040876584434267868D626021618163898B8C
     r=[]
     for c in t.upper():
      val=int((m/(256**(90-ord(c))))%256)
      r.append("".join([str((val>>y)&1) for y in range(val/32-1,-1,-1)]))
     return " ".join(r)