题目截图:
解题过程
下载题目给的文本,发现里面刚好有对应20个challenge()函数,应该就是找出20个函数的answer答案flag就出来了。
challenge_1很简单,跟着输入“Hello”就可以了。
challenge_2要我们输入a,b,c,d。a==b and a is b 很容易满足,a和b赋值时可以int类型,tuple类型,即a=b = 0/(1) ; 而c == d and c is not d 需要c 和d 在不同的内存地址,赋值时可以选择float类型,string类型,list类型,dict类型,set类型,即c=d = 0.0/”string"/[1]/{0:1}/{1}。
challenge_3要我们输入a,满足a in a == a 。如果以集合的观点来讲,a 既要当子集,又要当父集,又是本身。这种特点要满足我只想到字符串,弄个字符串“string”进去,的确满足“string” in “string” = “string”。
chanllenge_4要我们输入一个answer,格式是a,b,也就是输入两个数。看了代码,第一感觉首先a,b不为0,然后a无论乘以多少倍都不会变化他的值,b乘以2就变化了他的值。这种思路明显是错的,怎么可能会有这种数,得找新的思路。这里应该是考察引用和对象的知识点,只要a符合可变数据对象(通过引用其元素,改变对象自身),b符合不可变数据对象(不能改变对象本身,只能改变引用的指向)就可以过这段代码。所以只要a为list类型,即a = [1];b为int类型,string类型,即b = 1/“string”。
challenge_5需要找出一个answer来满足list( r ) == list( r ) + answer。输入空列表[],显示错误,不是送分题。那问题肯定是出在reversed()上面,谷歌了一下,发现reversed()返回的是一个迭代器对象,只能进行一次循环遍历,显示一次所包含的值。通俗点就是第一个list( r )是[3,2,1],第二个list( r )是空列表。所以答案出来了,需要键入[3,2,1]作为answer。
什么?max(a,b) != max(b,a)?感觉自己白学了,还有这操作?网上找了一两个小时终于有了进展,max()函数对于集合与其他数据类型不太一样。集合中的大小关系是按照包含来比较的,也就是说集合a和集合b没有包含关系也就是父子集关系的话,就谁在max()函数前面谁就是返回值。即max({0,1},{0,1,2}) = {0,1,2},max({0,1},{1,2}) = {0,1},max({1,2},{0,1}) ={1,2}。哈哈,输入{1,2},{3,4}显示正确。
challenge_7要找出不满足分配律的数据类型,有了上面一题的经验,试一下特殊值和特殊情况。发现两个方法,第一种,括号外的数用整数,括号内的两个用字符串表示。比如,a = 2 , b = “abc”, c = “def”,“abcdefabcdef” != “abcabcdefdef”,成立。第二种,括号外的数用字符串,括号里面一个正数一个负数。比如,a = “string”, b = 2 , c = -1 , “string” != “stringstring”,成立。
challenge_8需要条件就是不满足交换律,妙用一下-1,应该能解决,即a = “string”,b = -1 , c = -1 ,”string“ !="“成立。nice!
challenge_9需要的条件就是type(a ** b) != type(b ** a),没有头绪,先妙用一下-1。把-1,-1和-1,1和1,-1尝试一下,发现居然出来了,-1,1就是一种答案。赶紧谷歌补一下知识。原来1 ^ -1 是float类型,-1 ^ 1是int类型,所以输入一正一负估计就是答案了。
challenge_10,a.count(x)正常是比len(a)小的,顶多相等。这次要求a and a.count(b) > len(a),应该还是赋特殊值。看到count()函数,len()函数选用string类型熟悉点,特殊的字符串很容易想到空字符串,把a = “string”, b = ‘’“输入试试,答案是对的。用pycharm运行一下,发现"string”.count(”") = 7 , 而len(“string”) = 6。原来count()函数的返回值可以比len()函数大1。学到了!
又是max()函数,对于元素为1的字符串数组,例如[‘123’],max([‘123’]) = 123;而max(*[‘123’]) =max(1,2,3) = 3。因此,challenge_11只需要输入元素为1的字符串数组就可以了。
challenge_12要我们找到a,b,满足a比b小并且任意的x,y都要比a,b小。这种任意性问题,可以考虑一个为空一个为非空,这样就只有1个数,很容易找到满足条件的值。尝试 a = “”,b = “1”。满足条件。
challenge_13,b不为0时,a^b = a 。显然, a ^ b != a 。即“-”不可以是减号,那还可以做什么呢?可以作为集合的差。a与b相同非空集合时,满足if条件。a与b不同非空集合时,不满足条件。所以a=b = {0}就可以了。
challenge_14, 深拷贝,和challenge_4考点接近,先确认answer的数据类型,不能是简单的int类型、float类型、string类型,可以用list类型。随便输入2个以上的简单list类型,如[1],[2],[3]…,[1,2],[1,2]…[1,2,3],[2,3,4]… 。
challenge_15,输入item和I,满足item in I and not min(I) <= item <= max(I)。咦!又是不符合常理,在里面又不在最大最小范围里面!min()应该和max()一样,由于max(string)返回的只是string中最大的一个字符,string之间的大小比较是从左到右的顺序看对应位ascii值大小的,那么我们可以选择位数超过1、每一位都相同的字符串来同时给item,I。比如"11",“222”,"3333"等等。答案就出来了。
challenge_16,这个I值格式是我比赛结束后看参考答案出来的。又是要输入item,I,item给了是固定值233,要找I。满足条件item in I and I in I。最好结果就是233 == 233 and 233 in 233 and 233 in 233。也就是I也等于233。但是 in自己 只能用于string和bytes,string 和233就扯不上关系了,想一下怎么把233变成bytes类型,真的可以,因为答案就是b’\xe9’。16 * 14 + 9 的确是233。终于知道原来b’\xnn’是bytes类型了。
challenge_17,又是item和I。这次是item == I[0] and item not in I ,先给I定下数据类型,不能为string要不然and后面条件不满足,list也不行了。只能利用dict的属性了,下标取值是取value值,in not in 是用key集合确认,所以答案差不多出来了,填入格式a,{0:a}就可以了。比如1,{0:1} 2,{0:2}等等。
又和小时候学到的不一样!还好认识计系NAN,随便取1e309以上如1e309,1e310,1e350,1e400等等。答案出来了。
challenge_19,伤脑筋,这也是比赛结束后我才知道的。明明可以isdecimal(),又answer长度小于5,哪怕数据全满足,4个ASCII码相加也就1000多。最后看了答案才知道是用UNICODE这种4个字节范围到65535的,那就说的通了。已知ord(“0”) = 48,我们找满足条件的answer,找4个字符连在一起的。23333+48 * 4 = 23525。因此,找到满足isdecimal()函数的Unicode码相加等于23525就可以了。这是我的结果:‘᭘᭒᧕୦’( ᭘ ; ᭒ ; ᧕ ; ୦ ; )。键入,答案正确。
challenge_20,对数据类型又了解就会找的到满足条件的answer。要我们找7个值为0的数。int类型,float类型,complex类型,bool类型,如0, 0.0, -0.0, False, -0.0-0.0j, -0.0j, 0j。
终于,flag出现了。flag{Y0u_deserve_th1s_fl4g,,the_MASTER_0f_Python_452e53040a}