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)
プログラムを1行ずつビルドします。
- ハッシュから始めます。
- コマンドに新しい行
i
を追加し、2つの隣接する文字の間にハッシュします。print i
i - 1
- 現在のプログラムの「iバージョン」(i番目の文字ごと)にコマンドが含まれていない
print i
(位置合わせ不良による)か、n
-versionでn in range(1, 17)
例外がスローされている間に、前の行に別のハッシュを追加します。
実際に、今朝手動で見つけたよりも短いプログラムを返しました。(したがって、上記のソリューションを更新しました。)さらに、このパターンに続く短い実装はないと確信しています。しかし、あなたは決して知らない!
ゴルフバージョン-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に使用できます。