【Python CheckiO 题解】Bird Language


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 = 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'):])
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT.BOB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值