CodeWars-Dubstep

skrillex

今天来聊聊电音(●'◡'●),你最喜欢的DJ是哪位呢?
Breakn' A Sweat -Skrillex / The Doors

一.题目

Polycarpus works as a DJ in the best Berland nightclub, and he often uses dubstep music in his performance. Recently, he has decided to take a couple of old songs and make dubstep remixes from them.

Let's assume that a song consists of some number of words. To make the dubstep remix of this song, Polycarpus inserts a certain number of words "WUB" before the first word of the song (the number may be zero), after the last word (the number may be zero), and between words (at least one between any pair of neighbouring words), and then the boy glues together all the words, including "WUB", in one string and plays the song at the club.

For example, a song with words "I AM X" can transform into a dubstep remix as "WUBWUBIWUBAMWUBWUBX" and cannot transform into "WUBWUBIAMWUBX".

Recently, Jonny has heard Polycarpus's new dubstep track, but since he isn't into modern music, he decided to find out what was the initial song that Polycarpus remixed. Help Jonny restore the original song.

Input
The input consists of a single non-empty string, consisting only of uppercase English letters, the string's length doesn't exceed 200 characters

Output
Return the words of the initial song that Polycarpus used to make a dubsteb remix. Separate the words with a space.

Examples

song_decoder("WUBWEWUBAREWUBWUBTHEWUBCHAMPIONSWUBMYWUBFRIENDWUB")
# =>  WE ARE THE CHAMPIONS MY FRIEND

一些英语单词:
1.dubstep music
电音分支之一

2.he isn't into modern music
他不喜欢现代音乐,
这是比较口语化的表达。

3.initial song 、original song
inital / original adj. 初始的、原始的
这里都是指‘原曲’,被混音前的曲子。

翻译起来的话:

Polycarpus在一家夜店担任DJ,并且他经常在他的表演中使用dubstep music。最近,他已经使用几首旧曲子编成一首新的混音。

假定,这首混音由一系列的单词组成。为了制作这首混音,Polycarpus插入了一定数量的单词‘WUB’,可以在第一个单词之前插入‘WUB’或者不插入,可以在最后一个单词之后插入也可以不插入,但是在单词与单词之间,至少要插入一个‘WUB’,然后这个男孩就将这些所有的单词包括‘WUB’整合在一起(没有空格间隔),形成一个字符串然后播放这首曲子。

举个栗子,‘I AM X’这句话可以混音变成‘WUBWUBIWUBAMWUBWUBX’,但是不可以变成‘WUBWUBIAMWUBX’(单词与单词之间至少要有一个‘WUB’,I和AM中间没有所以不能这样混音)

最近,Jonny听过了Polycarpus新的混音,但因为他对现代音乐不感兴趣,所以他决定找出原曲是什么。请帮帮他。

输入
输入一个非空的字符串,只有大写字母组成,这个字符串不会超过200个字符。

输出
返回原曲的单词,用空格间隔。

初始代码

song_decoder

举个栗子

Test.assert_equals(song_decoder("AWUBBWUBC"), "A B C","WUB should be replaced by 1 space")
Test.assert_equals(song_decoder("AWUBWUBWUBBWUBWUBWUBC"), "A B C","multiples WUB should be replaced by only 1 space")
Test.assert_equals(song_decoder("WUBAWUBBWUBCWUB"), "A B C","heading or trailing spaces should be removed")

二.思路和代码

思路

先来看看函数的大概的框架

输入 : 一个字符串
内部操作:对字符串进行操作,具体是删除和整合。
输入 : 一个字符串

接着我们来看看具体怎么操作,
读完题目之后,想到一个概念——正则表达式。
正则表达式又称为规则表达式(regular expression)
我对正则表达式的理解是:匹配合乎规则的字符或字符串

以本题为例,要将‘WUB’去掉,用空格代替。
但是WUB有可能连续出现,如果使用字符串的replace()函数,以"AWUBWUBWUBBWUBWUBWUBC"为例,就会变成字符串‘A···B···C’(每个·代表一个空格),A与B,B与C之间间隔3个空格,而题目要我们只能间隔一个空格。(PS:在这里当然也有别的处理方法,不过我们先讲正则)。
如果我们要设定规则的话,那规则就是WUB至少出现一次。

正则的写法就是(WUB)+。

代码

import re
def song_decoder(song):
    song = re.sub(r'(WUB)+'," ",song)
    song = song.strip()
    return song

代码解析

导入模块 re (正则表达式)
利用模块内的sub()函数
第一个参数是要匹配的正则表达式,第二个参数是要被替换成什么,第三个参数就是要进行匹配的字符串。
这里关键是要理解正则表达式的意思,(WUB)+代表WUB出现至少一次或多次的字符串,具体实例是
WUB
WUBWUB
WUBWUBWUB
WUBWUBWUBWUB等等
将这些字符串替换成空格(一个空格)。
然后song.strip()去掉两端空格就好了

三.最优代码解

Best Practices.png

排名第一个答案用到了一个转换的想法。字符串列表互相转换

song原本是字符串

song.replace('WUB',' ')
replace()将字符串内WUB的字符替换为空格

song.replace('WUB',' ').split()
replace()将字符串内WUB的字符替换为空格,然后.split() 用空格将字符串分割变成列表(对的没有错,字符串使用split()方法后,就变为了列表)

" ".join(song.replace('WUB', ' ').split())
replace()将字符串内WUB的字符替换为空格,然后.split() 用空格将字符串分割变成列表,然后" ".join再将这个列表变为字符串,原本列表之间用空格连接。

字符串列表的相互转换,使用的就是两个方法

还是以"AWUBWUBWUBBWUBWUBWUBC"为例,replace()方法之后,字符串变成‘A···B···C’(每个·代表一个空格)
接着
str.split() ——> list (字符串变成了列表)
['A','B','C']
' '.join(list) ——> str (列表变成了字符串)
'A·B·C'

spilt()函数:里面可以填参数,默认是字符串以空格作为间隔符,去掉间隔符,将字符串分割成不同元素。
‘ ’.join(list)函数:将列表里面的元素连接起来,冒号内填入作为连接的字符。本题用的是空格作为连接的字符。

四.总结

1.正则表达式
本题想考察的应该是正则表达式,找出字符串中要替换字符的规律,用正则表达式进行操作。关键是要字符的规律是什么?正则表达式可以应用在非常多的场合,判断是不是中国的手机号,判断是不是邮箱等等。用数字、字母和符号就能向计算机将规律表达出来。

2.字符串和列表的相互转换
str ————> list 用split()
list ————> str 用 ‘ ’.join
多多应用,熟练对象的互相转换。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 前言 最先接触编程的知识是在大学里面,大学里面学了一些基础的知识,c语言,java语言,单片机的汇编语言等;大学毕...
    oceanfive阅读 2,988评论 0 7
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,108评论 0 10
  • 正则表达式到底是什么东西?字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等...
    狮子挽歌阅读 2,104评论 0 9
  • 9.19--9.23 第7章 正则表达式 正则表达式是一个拆分字符串并查询相关信息的过程。 推荐练习网站: js ...
    如201608阅读 955评论 0 4
  • 生活向你张大了可怕的嘴巴 你选择不顾尊严冲向富甲一方 你蜷缩着身体接受所有的审视 低下头颅展现生活的游戏 背后是你...
    人之初呀阅读 100评论 0 0