二维码
* * * *
拉格朗日计划
* * * *
二维码

本题的输入是字符画形式的、遵循第一版规范的二维码, 如下例:

#######  vv^^ #######
#     #  vv^^ #     #
# ### # #vv^^ # ### #
# ### #  vv^^ # ### #
# ### #  vv^^ # ### #
#     #  vv^^ #     #
####### # # # #######
        #vv^^
### #####vv^^##   #
vv^^vv ^^vv^^vv^^vv^^
vv^^vv#^^vv^^vv^^vv^^
vv^^vv ^^vv^^vv^^vv^^
vv^^vv#^^vv^^vv^^vv^^
        #vv^^vv^^vv^^
####### #vv^^vv^^vv^^
#     # #vv^^vv^^vv^^
# ### # #vv^^vv^^vv^^
# ### #  vv^^vv^^vv^^
# ### # #vv^^vv^^vv^^
#     # #vv^^vv^^vv^^
####### #vv^^vv^^vv^^

可以看到,图中有10条由^^或vv组成的纵向带状区域,是可以用于保存信息的位置,信息是由#和空格组成的字符。

输入的规则是从右往左依次读取,每两列为一组,^^表示该组应当从下往上逐行读取,vv则表示该组应当从上往下逐行读取,每一行中总是先读入右侧的字符,再读入左侧的字符。

下表展示了这两种读入顺序:

^^ ..    vv 10
^^ 98    vv 32
^^ 76    vv 54
^^ 54    vv 76
^^ 32    vv 98
^^ 10    vv ..

按上述规则读取这些纵向带状区域字符,以最左上角为坐标原点,若当前字符的坐标$(x,y)$满足$x+y$为奇数,则#表示1空格表示0,否则#表示0而空格表示1。

如此可得一串二进制流,其中前21位表示编码和长度信息,之后$17\times 8$可以保存17个字节的信息,如下表
0100  00010001  01001000  01100101  01101100 ...
编码   长度      'H'       'e'       'l'
(4)   (17)      (17个字节的ASC码信息)

打印其中所存储的17个字节的字符信息。

本题难度:



解答

先找出需要读取的区域,用匿名函数x处理方向和提取每个位置的坐标。

容易验证,#和空格与0和1的转换关系可以写作a[i][j]==' '与(i+j)%2作异或。

将每个位置转化为二进制字符后再用标准库将二进制流解码。

最终代码行有四行。

代码长度:265字节 vs. 全站第一:135字节。

import sys
a=sys.argv[1].split('\n')
x=lambda a,b,c,d=-1:[[i,j]for i in range(a,b,d)for j in[c,c-1]]
print(int(''.join(str((a[i][j]==' ')^(i+j)%2)for i,j in x(14,8,20)+x(9,21,18,1)+x(20,8,16)+x(9,21,14,1)+x(20,6,12)+x(5,-1,12)+x(0,6,10,1)),2).to_bytes(17).decode())