Python- 1201 1137(生成器:241 218)-哈希万岁!
战略:
我试图从每一行开始以与所需输出一样多的哈希值开始n
。然后所有其他版本将完全跳过此行。
但是,主要困难是要添加正确数量的哈希,以便下一次运行将准确地到达下一行的开头。此外,可能会干扰其他版本,例如版本16跳到print
第5行的命令中,依此类推。因此,这是很多试验和错误,再加上用于快速测试的帮助脚本。
统计:
- 字元:
1201 1137
- 哈希值:
1066 1002(88.1%)
- 非哈希:135(11.9%)
码:
#
print 1#####
#p#r#i#n#t# #2######################
##p##r##i##n##t## ##3###
###p###r###i###n###t### ###4
####p####r####i####n####t#### ####5#########
#####p#####r#####i#####n#####t##### #####6##########
######p######r######i######n######t###### ######7###########
#######p#######r#######i#######n#######t####### #######8###
########p########r########i########n########t######## ########9##
#########p#########r#########i#########n#########t######### #########1#########0##
##########p##########r##########i##########n##########t########## ##########1##########1##
###########p###########r###########i###########n###########t########### ###########1###########2##
############p############r############i############n############t############ ############1############3##
#############p#############r#############i#############n#############t############# #############1#############4##
##############p##############r##############i##############n##############t############## ##############1##############5##
###############p###############r###############i###############n###############t############### ###############1###############6
测试脚本:
with open('printn.py', 'r') as f:
c = f.read()
for n in range(1, 17):
print "n =", n, "yields",
exec c[::n]
输出:
n = 1 yields 1
n = 2 yields 2
n = 3 yields 3
n = 4 yields 4
n = 5 yields 5
n = 6 yields 6
n = 7 yields 7
n = 8 yields 8
n = 9 yields 9
n = 10 yields 10
n = 11 yields 11
n = 12 yields 12
n = 13 yields 13
n = 14 yields 14
n = 15 yields 15
n = 16 yields 16
更新:生成脚本!
我考虑过我的解决方案,必须要有一种算法来生成它的模式。所以我们开始:
lines = ['#']
for i in range(1, 17):
lines.append(('#' * (i - 1)).join('\nprint ' + `i`))
fail = True
while fail:
while ''.join(lines)[::i].find('print ' + `i`) < 0:
lines[i] = '#' + lines[i]
fail = False
for n in range(1, 17):
try:
exec ''.join(lines)[::n]
except:
lines[i] = '#' + lines[i]
fail = True
break
print ''.join(lines)
它逐行构建程序:
- 从哈希开始。
i
用print i
命令添加新行,并i - 1
在每两个相邻字符之间添加哈希。
- 当前程序的“ i版本”(每个i字符)不包含命令
print i
(由于未对齐)或任何n
带有n in range(1, 17)
异常的-version,请在上一行添加另一个哈希。
实际上,它返回的程序比今天早上手动找到的程序要短。(因此,我在上面更新了我的解决方案。)此外,我很确定在这种模式下不会有更短的实现。但是你永远不知道!
Golfed版本- 241 218:
h='#';L=[h];I=range(1,17);J=''.join
for i in I:
p='print '+`i`;L+=[(h*(i-1)).join('\n'+p)]
while 1:
while J(L)[::i].find(p)<0:L[i]=h+L[i]
try:
for n in I:exec J(L)[::n]
break
except:L[i]=h+L[i]
print J(L)
请注意,可能会有一个较短的生成器,例如,通过对每个行的所需连续哈希数进行硬编码来实现。但这是由他们自己计算的,可以用于任何N> 16的情况。