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
题目描述
【Bird Language】:斯蒂芬(Stephan)的一个朋友恰巧是个小机器鸟。最近,他正试图教它如何讲基本语言。今天,这只鸟说出了它的第一个词:“ hieeelalaooo”。这听起来很像“hello”,但元音太多。斯蒂芬(Stephan)向尼古拉(Nikola)求助,他帮助检查了鸟是如何改变单词的。利用他们发现的信息,帮助他们制作翻译模块。
鸟通过两个规则转换单词:(元音字母:aeiouy)
- 在每个辅音字母之后,小鸟都会附加一个随机的元音字母(l⇒la 或 le);
- 在每个元音字母之后,小鸟都会附加两个相同的字母(a⇒aaa)。
给您一个鸟类学的短语,它是由几个空格隔开的单词(每对单词由一个空格隔开)。鸟不知道如何标点短语,只说字母。所有单词均以小写形式给出。您应该将此短语从鸟语翻译成更容易理解的东西。
【链接】:https://py.checkio.org/mission/bird-language/
【输入】:一个小鸟说的短语(字符串)
【输出】:翻译过后的正确短语(字符串)
【前提】:re.match("\A([a-z]+\ ?)+(?<!\ )\Z", phrase);A phrase always has the translation.
【范例】:
translate("hieeelalaooo") == "hello"
translate("hoooowe yyyooouuu duoooiiine") == "how you doin"
translate("aaa bo cy da eee fe") == "a b c d e f"
translate("sooooso aaaaaaaaa") == "sos aaa"
解题思路
简单来说,我们要解决的问题就是,将原来的字符串,去掉辅音字母后面的的一个元音字母,去掉元音字母后面的两个相同的字母, 我们可以设置一个新列表,循环访问原字符串中的每一个元素;
当遇到一个元音字母时,就忽略该字母后两个元素;
当遇到一个辅音字母时,就忽略该字母后一个元素;
当遇到空格时,就忽略掉该空格。
代码实现
VOWELS = "aeiouy"def translate(phrase):new_list = []i = 0while i < len(phrase):new_list.append(phrase[i])if phrase[i] in VOWELS:i += 3elif phrase[i] == ' ':i += 1else:i += 2return ''.join(new_list)if __name__ == '__main__':print("Example:")print(translate("hieeelalaooo"))# These "asserts" using only for self-checking and not necessary for auto-testingassert translate("hieeelalaooo") == "hello", "Hi!"assert translate("hoooowe yyyooouuu duoooiiine") == "how you doin", "Joey?"assert translate("aaa bo cy da eee fe") == "a b c d e f", "Alphabet"assert translate("sooooso aaaaaaaaa") == "sos aaa", "Mayday, mayday"print("Coding complete? Click 'Check' to review your tests and earn cool rewards!")
大神解答
大神解答 NO.1
from re import subdef translate(phrase):prune = lambda exp, phr: sub(exp.format('aeiouy'), r'\1', phr)return prune(r'([{0}])\1\1', prune(r'([^ {0}])[{0}]', phrase))
大神解答 NO.2
import redef translate(text):text = re.sub('(?P<c>[bcdfghjklmnpqrstvwxz])[aeiouy]', '\g<c>', text)text = re.sub('(?P<v>[aeiouy]){3}', '\g<v>', text)return text
大神解答 NO.3
translate=lambda s:s and s[0]+translate(s[1+(s[0]!=' ')+(s[0]in'aeiouy'):])