集智专栏
资源加载中,请稍后...
集智专栏

[Python Quiz] 2018.03.18 如何优雅地搓出具有正能量的螺旋丸

Kaiser

直播时间 21:00

1. 页内观看(仅视频)

2. 完整观看(可发弹幕):Python Quiz 002

3. Bilibili直播:负基础学Python



前情提要:


Quiz 25 您配吗?

新的谜题,你还能重获自由吗?身后的影子正在迫近,来不及多想了。

  • 得到一段奇怪的字符串,除了单词还有杂乱的括号,如"(Hello),(((World)))!", "Ass)we(())can(())"
  • 先不论文字意义如何,括号是否正确配对呢?
  • 只有圆括号(),不含其它括号`
练习

完成函数 valid_parentheses(string),判断参数 input_str 中的圆括号数量是否正确(即左括号与右括号数量是否相等),如果正确,返回 True,否则返回 False。

程序说明
Validate Parentheses
示例代码
def valid_parentheses(input_str): # valid_parentheses("hi(hi)(hi") -> False # valid_parentheses("((hei())hei()()hei)") -> True # >>>> show me the code <<<< # >>>> show me the code <<<<
正确答案
def valid_parentheses(input_str): left = 0 for i in input_str: if i == "(": left += 1 if i == ")": left -= 1 if left < 0: return False break return left == 0
程序验证过程
valid_parentheses("hi(hi)(") == False and valid_parentheses("((())()())") == True and valid_parentheses("(c(b(a)))(d)") == True and valid_parentheses("hi(hi))(") == False
提示信息
可以用 for-in 遍历字符串


Quiz 26 您们配吗?

  • 这次的字符更加奇怪了呢:"Change)the(bosee}of {]gym["
  • 共有三类括号:(),{},[]
练习

完成函数 valid_braces(input_str),判断 input_str 中的三种括号 (),{},[] 左右数量是否匹配,如果匹配,返回 True,否则返回 False。

程序说明
Validate Braces
示例代码
def valid_braces(input_str): # valid_braces("())({}}{()][][") -> False # valid_braces("(({{[[]]}}))") -> True # >>>> show me the code <<<< # >>>> show me the code <<<<
正确答案
def valid_braces(input_str): left = ["[", "{", "("] right = {"]":"[", "}":"{", ")":"("} stack = [] try: for i in input_str: if i in left: stack.append(i) if i in right: if stack[-1] == right[i]: stack.pop() else: return False break except IndexError: return False return stack == []
程序验证过程
valid_braces("())({}}{()][][") == False and valid_braces("(({{[[]]}}))") == True and valid_braces("(}") == False
提示信息
要区分不同类型的括号进行数量统计


Quiz 27 螺旋丸·解


远处传来异样的耀眼光芒,会是那个男人吗?

  • 输入奇门遁甲
  • 输出螺旋丸秘笈

33,44,俨然两个方矩阵,再看代码中的例子(在下方练习中),看来是要把矩阵沿着红线,展开成一个列表!

练习

完成函数 snail(input_arr),将二维数组 input_arr 从第一行第一列的元素开始,沿着螺旋将二维数组展开成一个列表并返回。

程序说明
Matrix spiral
示例代码
def snail(input_arr): ''' snail([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) -> [1, 2, 3, 6, 9, 8, 7, 4, 5] ''' # >>>> show me the code <<<< # >>>> show me the code <<<<
正确答案
def snail(input_arr): output_arr = [] while input_arr: output_arr.extend(input_arr.pop(0)) tmp_arr = [] for i in zip(*input_arr): tmp_arr.append(list(i)) input_arr = tmp_arr[::-1] return output_arr
程序验证过程
snail([[1, 2, 3],[4, 5, 6],[7, 8, 9]]) == [1, 2, 3, 6, 9, 8, 7, 4, 5] and snail([[ 1, 2, 3, 4, 5],[ 6, 7, 8, 9, 10],[11, 12, 13, 14, 15],[16, 17, 18, 19, 20],[21, 22, 23, 24, 25]]) == [1, 2, 3, 4, 5, 10, 15, 20, 25, 24, 23, 22, 21, 16, 11, 6, 7, 8, 9, 14, 19, 18, 17, 12, 13]
提示信息
注意,参数是二维的,返回值是一维的


Quiz 28 螺旋丸·搓

这次,你要靠自己的力量象征自由。

  • 输入查克拉能量
  • 输出螺旋丸
练习

螺旋丸形状如下,请完成函数 spiralize(size),用 1 代表实心点,0 代表空心点,输出大小为 size 的螺旋丸。

螺旋丸螺旋丸

预处理代码
def solution(size): if size == 1: return [[1]] spiral = [] # Fill top row with '1's and rest with '0's for i in range(size): spiral.append([1 if i == 0 else 0] * size) # Locations and directions row, col = 0, size-1 hor, ver = 0, 1 # Loop for the length of the spiral's arm for n in range(size-1, 0, -2): # Loop for the number of arms of this length for m in range(min(2, n)): # Loop for each '1' in this arm for i in range(n): row += ver col += hor spiral[row][col] = 1 # Change direction hor, ver = -ver, hor return spiral
示例代码
import numpy as np def spiralize(size): ''' spiralize(5) -> 11111 00001 11101 10001 11111 spiralize(6) -> 111111 000001 111101 100101 100001 111111 ''' # >>>> show me the code <<<< # >>>> show me the code <<<<
正确答案
import numpy as np def spiralize(size): spiral_3 = np.array([[1,1,1], [0,0,1], [1,1,1]]) spiral_4 = np.array([[1,1,1,1], [0,0,0,1], [1,0,0,1], [1,1,1,1]]) if size == 3: return spiral_3 if size == 4: return spiral_4 else: sp_arr = np.zeros((size, size)) sp_arr[0,:] = 1 sp_arr[1:,-1] = 1 sp_arr[-1,-2] = 1 sp_arr[2:,:-2] = spiralize(size-2)[::-1, ::-1] return sp_arr
程序验证过程
for size in range(3, 10): if spiraliz(size) != solution(size): return False break return True
提示信息
注意螺旋的方式和上面的题目有所不同


终于嗅到了自由空气。


向着前方大步远去。

您也许喜欢这些文章

集智专栏

如何用Dropout降低过拟合风险

发表至系列教程
系列第二篇,介绍了什么是“过拟合”以及如何避免。降低过拟合风险的方法有很多,本文以Dropout为例,图解其基本原理,并以Kaggle入门竞赛“手写数字识别”为例,搭建卷积神经网络在线运行,通过对比两种不同的网络架构,体现Dropout的作用。
集智专栏

如何挽救鉴黄师的职业生涯 - Python绘制像素图

发表至趣味项目
艺术从来就不是画家们的专利。在计算机硬件还无法绘制图形的年代,极客们就已经开始考虑使用纯文本——也就是ASCII码来进行绘图,从而实现简单的UI界面,甚至是编写画面精美的RPG游戏。本文将介绍使用Python来将图片转换为多行的ASCII字符串的相关知识,并带您重温那个古老的命令行时代。
集智专栏

[Python入门] 05 元组与数据库

发表至系列教程
Python入门第5篇,介绍新的数据类型:元组(tuple),更重要的是引入了全新的概念:数据库(database)。并将以SQLite3为例,讲解如何通过Python调用SQL语句,从而操作本地数据库。最后使用简单的SQL语句,查询出谁是NBA历史上最强和最弱的球队。

文章评论(3)

新用户374 发表于 1月前回复
num = {} for i in input_str: if i == "(" or i == "[" or i == "{": num[i] += 1 print(num[i]) if i == ")" or i == "]" or i == "}": num[i] -= 1 这样写总是报错,有点搞不清原因
Kaiser集智 站长 发表于 2月前回复
回复:上直播的回看好像只有1小时,超过的部分都看不了
这期应该就是一个小时左右吧,没有很长
HoJanHoi 发表于 2月前回复
上直播的回看好像只有1小时,超过的部分都看不了