【Python CheckiO 题解】Text Editor

哈骞仕
2023-12-01

CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,本博客主要记录自己用 Python 在闯关时的做题思路和实现代码,同时也学习学习其他大神写的代码。

CheckiO 官网:https://checkio.org/

我的 CheckiO 主页:https://py.checkio.org/user/TRHX/

CheckiO 题解系列专栏:https://itrhx.blog.csdn.net/category_9536424.html

CheckiO 所有题解源代码:https://github.com/TRHX/Python-CheckiO-Exercise


题目描述

【Text Editor】:在此任务中,您将创建一个支持版本控制系统的文本编辑器原型,该原型将允许保存文本的不同版本并还原其中的任何一个;您的任务是创建2个类:TextSavedText,第一个将处理文本(添加,更改字体等),第二个将控制版本并保存它们。

Text 类应该具有以下方法:

  • write:将(text)添加到当前文本;

  • set_font:设置字体,字体将应用于整个文本,字体显示在文本之前和之后的方括号中: [Arial] ... example ... [Arial],可以多次指定字体,但是只显示最后一个设置的字体;

  • show:返回当前文本和字体(如果已设置了字体);

  • restore:恢复所选版本的文本。

SavedText 类应具有以下方法:

  • save_text:保存当前文本和字体,保存的第一个版本的编号为0,第二个版本的编号为1,依此类推;

  • get_version:此方法与“restore”方法一起使用,用于选择所需的文本版本。

【链接】https://py.checkio.org/mission/text-editor/

【输入】:有关文本和保存副本的信息

【输出】:执行所有命令过后的文本

【前提】:保存的副本不超过10个

【范例】

text = Text()
saver = SavedText()
    
text.write("At the very beginning ")
saver.save_text(text)
text.set_font("Arial")
saver.save_text(text)
text.write("there was nothing.")
text.show() == "[Arial]At the very beginning there was nothing.[Arial]"
    
text.restore(saver.get_version(0))
text.show() == "At the very beginning "

代码实现

import copy


class Text:
    def __init__(self):
        self.text = ''
        self.font = ''

    def write(self, text):
        self.text += text

    def set_font(self, font):
        self.font = font

    def show(self):
        if self.font != '':
            font = '[' + self.font + ']'
        else:
            font = ''
        return '{}{}{}'.format(font, self.text, font)

    def restore(self, text):
        self.text = text.text
        self.font = text.font


class SavedText:
    def __init__(self):
        self.text2 = {}
        self.last_version = 0

    def save_text(self, text):
        self.text2[self.last_version] = copy.copy(text)
        self.last_version += 1

    def get_version(self, version):
        return self.text2[version]


if __name__ == '__main__':
    #These "asserts" using only for self-checking and not necessary for auto-testing

    text = Text()
    saver = SavedText()
    
    text.write("At the very beginning ")
    saver.save_text(text)
    text.set_font("Arial")
    saver.save_text(text)
    text.write("there was nothing.")

    assert text.show() == "[Arial]At the very beginning there was nothing.[Arial]"
    
    text.restore(saver.get_version(0))
    assert text.show() == "At the very beginning "

    print("Coding complete? Let's try tests!")

大神解答

大神解答 NO.1

class Text:
    __init__ = lambda self, text='', font='': vars(self).update(locals())
    write    = lambda self, value: vars(self).update({'text': self.text+value})
    set_font = lambda self, font: vars(self).update({'font': font})
    show     = lambda self: "[{0}]{1}[{0}]".format(self.font, self.text) if self.font else self.text
    restore  = lambda self, item: vars(self).update({'text': item.text, 'font': item.font})

class SavedText:
    __init__    = lambda self: vars(self).update({'history': []})
    save_text   = lambda self, item: vars(self).update({'history': self.history+[Text(item.text, item.font)]})
    get_version = lambda self, version: self.history[version]

大神解答 NO.2

class Text:
    text = font = ''
    
    def write(self, text):
        self.text += text

    def restore(self, old):
        self.text, self.font = old

    def set_font(self, font):
        self.font = f'[{font}]'

    def show(self):
        return f'{self.font}{self.text}{self.font}'

class SavedText(list):
    get_version = list.__getitem__

    def save_text(self, text):
        self.append((text.text, text.font))

大神解答 NO.3

class Text:
    def __init__(self):
        self._storage = []
        self._font = ""

    @property
    def storage(self):
        return self._storage
       
    @property
    def font(self):
        return self._font 

    @font.setter
    def font(self, value):
        self._font = value

    def set_font(self, value):
        self.font = value

    def write(self, text):
        self._storage.append(text)

    def show(self):
        text = "".join(self._storage)
        if self._font:
            return "[{1}]{0}[{1}]".format(text, self._font)
        return text

    def restore(self, version):
        self._storage, self._font = version
        
        
class SavedText:
    def __init__(self):
        self._versions = []
        
    def save_text(self, text):
        self._versions.append((text.storage[:], text.font))         

    def get_version(self, version):
        return self._versions[version]
 类似资料: