一年只有两场 cf,一场 Goodbye,一场 April Fools Day Contest。

本场总结: Solved 6/9, Ranked 35/6652。题目质量还过得去,不过这次 kit1980 似乎又摸了,梗有点缺乏新意[1],甚至有些向 ctf 靠拢[2]。另外由于逐渐社会,所以全场都用 Python 3 过的题。

[1] April Fools Day 全系列最好的梗,现在想来非 kanban 莫属了

[2] 所以我当初是不是应该去打 ctf 更好啊(但你做出这场的 ctf 题了吗)

A. Is it rated - 2

Solved. 00:00 (+)

传送门

No. 去年出过了,今年不会再上当了!比去年多了个多组输入而已。

后面看了一下,我是第六个通过的提交。反应还不够快?

1
2
3
4
5
6
while True:
try:
input()
print("NO")
except:
break

B. DMCA

Solved. 00:48 (+4)

传送门

本以为谜底会在题目上,没想到在题面里。

In this problem you need to find a root of a number according to this new DMCA law.

实际上跟什么 DMCA 没有啥关系,所谓的root不是指平方根而是指数根。由于样例过于具有迷惑性,所以交了几次无果以后先跳过去了。

当时其实想到了数根这点,但最终忘了具体的定义,写了个求各位数之和没过,也没注意到比平方根多过了一个点。

至于做法,众所周知,数根其实是有规律的,直接模9就行。

1
2
n=int(input())
print((n-1)%9+1)

C. Fibonacci Words

Solved. 00:21 (+)

传送门

斐波那契嘛,就是 F(n)=F(n-1)+F(n-2) 咯。输入全是字母,所以先转成数字序,然后找找模26下的规律就是了。

反正规律是看到了,但 +1 -1 模啥的并没有很明确,随便写了一下,样例过了,皆大欢喜!

1
2
3
4
5
6
7
8
9
10
s=input()
f=lambda x:ord(x)-64
flag=True
for i in range(2,len(s)):
x = f(s[i-1])+f(s[i-2])
while x>26:x-=26
if x-1!=f(s[i]):
flag=False
break
print('YES'if flag else 'NO')

D. Xenolith? Hippodrome?

Unsolved.

传送门

? 死于词汇量(读题量)

据说是答案在题面上,判断是否是Xenodrome

场上 Google 了 Xenolith, Hippodrome, Xenodrome, Hippolith,然而并没看出来哪个词是具有含义的。实际上查 Xenodrome 都是无关信息,更应该去 oeis 查询。

E. Cakewalk

Solved. 01:04 (+)

传送门

拍脑袋贪心,每次找最近的星号。远近使用曼哈顿距离来定义,如果距离相同在上排的优先(自然的遍历顺序)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
n,m=map(int,input().split())
a=[input()for i in range(n)]
l=[]
for i in range(n):
for j in range(m):
if a[i][j]=='*':
l+=[(i,j)]
now=(0,0)
ans=int(now in l)
while True:
mn=99
mnt=now
for i in l:
if i!=now and i[0]>=now[0] and i[1]>=now[1] and mn>sum(i)-sum(now):
mn=sum(i)-sum(now)
mnt=i
if mn==99:
break
now=mnt
ans+=1
print(ans)

F. Math

Solved. 01:18 (+)

传送门

比较明显的盲文,不过找翻译花了一些时间。根据题面,不同的盲文规范还不大一样。

不过中间一模一样的两个图形(底下两个点,上下各两个点)代表的是-x。前后估计是2,所以猜是2-x2x2中间的符号不大一样,根据样例猜可能是上标。然后过了。

1
2
n=int(input())
print(2-n**2)

G. Encoded message

Solved. 01:56 (+)

传送门

又是盲文!这场应该改名叫 Blind People Contest

前期找了很多时间的规律,总感觉这个规律有点若即若离。实际上前面3个0-2和后面2个0-3,和还相等,其实就是对应 2×3 的盲文阵列。

于是对着前一题找的图手打了一个表。样例还很贴心地把所有编码可能重复的字母放在里面,以防混淆(codeforcez 也太刻意了吧)

1
2
3
4
5
a=['10010','11020','20011','21012','11011','21021','22022','12021','00000','12012','10120','11130','20121','21122','11121','21131','22132','12131','11111','12122','10221','11231','12113','20222','21223','11222']
n=int(input())
for i in range(n):
s=input().replace(' ','')
print(chr(97+a.index(s)),end='')

H. L BREAK into program

Unsolved.

传送门

没做。没工具,IDA* 还是什么十六进制阅读器,都没有,更不用说是题解提到的ZX Spectrum emulator

据说通过阅读器可以看出端倪,有一个长得像注释的东西提出有个加号写成减号了,另外有两个数组,对应相加取 ascii 码应该就是答案了。

不过我用 vscode 试了下,没显示内容,就放弃了。

只需要输出答案,这题很 ctf。如果提早准备对应的工具,应该是能做出来的。

I. Mysterious language again, seriously?

Unsolved.

传送门

去年也有一个语言学习题,不过这种都挺花时间的。不过这次没有告诉是什么语言,而是让凭空猜。

结果 seriously 居然是一个语言!场上我还以为要用 custom test 来 hack 出到底是什么语言。。摔,而且 custom test 老是卡住