【Python CheckiO 题解】Bird Language

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

题目描述

【Bird Language】:斯蒂芬(Stephan)的一个朋友恰巧是个小机器鸟。最近,他正试图教它如何讲基本语言。今天,这只鸟说出了它的第一个词:“ hieeelalaooo”。这听起来很像“hello”,但元音太多。斯蒂芬(Stephan)向尼古拉(Nikola)求助,他帮助检查了鸟是如何改变单词的。利用他们发现的信息,帮助他们制作翻译模块。

鸟通过两个规则转换单词:(元音字母:aeiouy)

  • 在每个辅音字母之后,小鸟都会附加一个随机的元音字母(l⇒la 或 le);
  • 在每个元音字母之后,小鸟都会附加两个相同的字母(a⇒aaa)。

给您一个鸟类学的短语,它是由几个空格隔开的单词(每对单词由一个空格隔开)。鸟不知道如何标点短语,只说字母。所有单词均以小写形式给出。您应该将此短语从鸟语翻译成更容易理解的东西。

【输入】:一个小鸟说的短语(字符串)

【输出】:翻译过后的正确短语(字符串)

【前提】: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 = 0
    while i < len(phrase):
        new_list.append(phrase[i])
        if phrase[i] in VOWELS:
            i += 3
        elif phrase[i] == ' ':
            i += 1
        else:
            i += 2
    return ''.join(new_list)

if __name__ == '__main__':
    print("Example:")
    print(translate("hieeelalaooo"))

    #These "asserts" using only for self-checking and not necessary for auto-testing
    assert 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 sub

def 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 re

def 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'):])
发布了115 篇原创文章 · 获赞 348 · 访问量 37万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览