codeforces April fool contest 2018
提示:这篇文章的主题是code-golf(即写出尽可能短的代码),使用的语言是Python 2/3。这篇文章含有cf April Fool contest 2018的剧透。
(除草。。还没更完,看心情更。。
B. A Map of the Cat
python3好像不用flush,所以用了python3。第一发107B,只排到了第四
i=0;exec("print(i);i+=1;x=input()\nif x!='no':print('grumpy'if x[-2:]in'lenuseay'else'normal');quit()\n"*7)
好像换了个写法之后少了3B,但还是第四>_>
i=0; while 1: print(i);i+=1;x=input()[-2:] if x!='no':print(['normal','grumpy'][x in'lenuseay']);break
发现了一个全新的写法:[print(i)or input()==xxx for i in range(6)],只有87B了。。怎么还是第四?前何怪?
print(['normal','grumpy'][any([print(i)or input()[-2:]in'lenuseay'for i in range(6)])])
接着又砍了两个字节(lenuseay中的ay)。。
print(['normal','grumpy'][any([print(i)or input()[-2:]in'lenuse'for i in range(6)])])
发现排到第三了。。就把第四打开看了一下。。
卧槽他怎么只询问了9啊。。?!
好像是因为数据中9回答no的都是normal。。
行吧行吧。。
print(9);print(['normal','grumpy'][input()[-2:]in'lenuseay'])
轻松第一啊?
upd. 学了个小trick。。把['normal','grumpy'][x]换成了'ngorrummaply'[x::2],短了2B。。
print(9);print('ngorrummaply'[input()[-2:]in'lenuseay'::2])
C. Ravioli Sort
显然判断初始数列中相邻数的差是不是不超过$1$即可
n=input();l=map(int,raw_input().split());print["YES","NO"][any([1 for i in range(n-1)if abs(l[i]-l[i+1])>1])]
110B居然能拿python第一,全cf第二?(注:提交的版本是110B,上面版本是109B
学了zip,但是max不接受空列表,所以下面的代码在$n=1$时gg了
input();l=map(int,raw_input().split());print["YES","NO"][max([abs(x-y)for x,y in zip(l[1:],l[:-1])])>1]
但不需要$n$还是可以省一个字节
input();l=map(int,raw_input().split());print["YES","NO"][any([1 for x,y in zip(l[1:],l[:-1])if abs(x-y)>1])]
好像zip不需要两个list的长度相同
input();l=map(int,raw_input().split());print["YES","NO"][any([1 for x,y in zip(l,l[1:])if abs(x-y)>1])]
好像可以把abs(x-y)<=1改写成x-2<y<x+2,然后用all来缩代码。。?不超过100B了呢
input();l=map(int,raw_input().split());print["NO","YES"][all([x-2<y<x+2 for x,y in zip(l,l[1:])])]
98B还是第二。。第一的Ruby只要85B,缩不动了。。(Python读入就很操蛋吧
upd. 学了trick之后继续缩代码。。由于NO是假值,YES是真值,导致只能缩掉1B。。不爽
input();l=map(int,raw_input().split());print"NYOE S"[all([x-2<y<x+2 for x,y in zip(l,l[1:])])::2]
然后把2 for改成2for又干掉1B。。
input();l=map(int,raw_input().split());print"NYOE S"[all([x-2<y<x+2for x,y in zip(l,l[1:])])::2]
新的trick,又干掉1B
input();l=map(int,raw_input().split());print"YES"*all([x-2<y<x+2for x,y in zip(l,l[1:])])or"NO"
E. Cheese Board
答案是所有蛋糕能soft/hard相间地放在$n\times n$棋盘上的最小$n$。。(先坑着
F. 2 + 2 != 4
看了题解。。是把每个数(第一个除外)前面的符号也算进去,然后根据ASCII码,+算$-5$,-算$-3$。比如说+233就是加上$(-5)\cdot 10^3+2\cdot 10^2+3\cdot 10+3$。。
由于python有eval函数,所以这个题变成了纯粹的字符串处理。设s为输入,首先eval(s)获得所有数字的贡献,然后把s换成另一个串并eval得到所有符号的贡献。这个串是这样构造的:把所有数字变成0,把加号变成-5,把减号变成+3。比如说1+23-456会变成0-500+3000,eval后就是加号和减号的贡献。
cf支持正则表达式(re),所以写得比较方便。(cf貌似不支持numpy?
写代码的时候要注意,如果直接s.replace("-","+3").replace("+","-5")会把减号导出的新的+3变成-53,所以需要多缓冲一步。这样写需要112B。(我用的python3
import re s=input() print(eval(s)+eval(re.sub("\d","0",s).replace("-","*3").replace("+","-5").replace("*","+")))
然后好像rank1了。。?
感觉三个replace很不优雅,于是痛苦地去学了python正则表达式,用一个sub完成了任务,并且缩短了。。。。。两个字节
import re s=input() print(eval(s)+eval(re.sub("-|\+|\d",lambda m:["0",["+3","-5"][m[0]=="+"]][m[0]in"+-"],s)))
好像可以用上面讲的trick把不优美的["0",["+3","-5"][m[0]=="+"]][m[0]in"+-"]换成更短的"+-035"[2-"+--".count(m[0])::3]
import re;s=input();print(eval(s)+eval(re.sub("-|\+|\d",lambda m:"+-035"[2-"+--".count(m[0])::3],s)))
把eval(a)+eval(b)改成eval(a+"+"+b)好像又省了2B。。缩进100B了。。
import re;s=input();print(eval(s+"+"+re.sub("-|\+|\d",lambda m:"+-035"[2-"+--".count(m[0])::3],s)))
G. Puzzling Language
坑着
E和G有点做不动。。看心情更咯