codeforces April fool contest 2018

r_64 posted @ 2018年12月29日 14:34 in 未分类 , 722 阅读

提示:这篇文章的主题是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还是第二crying。。第一的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+3000eval后就是加号和减号的贡献。

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有点做不动。。看心情更咯


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter