我是 python 的新手,我对它生成分形图像的能力非常感兴趣。我自己写了一些简单的,但我刚刚发现了一个 Mandelbrot 分形的脚本......它以你想要的分辨率生成美丽的全彩色图像......但代码被混淆看起来像 Mandelbrot 的 ASCII 艺术....真的很酷,但是如果您想轻松阅读它就很愚蠢。它包含我还没有在 python 中学到的函数,所以如果有人可以缩进脚本使其看起来像普通的 python 脚本,那就太好了。 脚本:
_ = (
255,
lambda
V ,B,c
:c and Y(V*V+B,B, c
-1)if(abs(V)<6)else
( 2+c-4*abs(V)**-0.4)/i
) ;v, x=7200,4800;C=range(v*x
);import struct;P=struct.pack;M,\
j ='<QIIHHHH',open('M.bmp','wb').write
for X in j('BM'+P(M,v*x*3+26,26,12,v,x,1,24))or C:
i ,Y=_;j(P('BBB',*(lambda T:(T*80+T**9
*i-950*T **99,T*70-880*T**18+701*
T **9 ,T*i**(1-T**45*2)))(sum(
[ Y(0,(A%3/3.+X%v+(X/v+
A/3/3.-x/2)/1j)*2.5
/x -2.7,i)**2 for \
A in C
[:9]])
/9)
) )
正如我所说,艺术很酷,但读起来太难了!如果有人能做到这一点,我将不胜感激。
最佳答案
注意:这并不是一个明确的答案,而是一个逐步去混淆的努力。如果您可以提供一个额外的步骤来使事情更清楚,那么如果您可以将其添加到这个答案中就太好了。
好的,让我们从给代码适当的换行符和缩进开始:
_ = (255,
lambda V, B, c: c and Y(V*V + B, B, c-1) if(abs(V) < 6) else (2 + c - 4 * abs(V)**-0.4)/i)
v, x = 7200, 4800
C = range(v*x)
import struct
P=struct.pack
M, j = '<QIIHHHH', open('M.bmp','wb').write
for X in j('BM' + P(M, v*x*3+26, 26, 12, v, x, 1, 24)) or C:
i, Y = _
j(
P('BBB',
*(lambda T: (T * 80 + T**9 * i - 950 * T**99, T*70 - 880* T**18 + 701* T**9, T* i**(1-T**45*2)))(
sum([Y(0, (A%3/3. + X%v + (X/v + A/3/3. - x/2)/1j) * 2.5/x - 2.7, i)**2 for A in C[:9]]) / 9
)
)
)
好一点,但仍然令人困惑。例如,将 P
定义为 struct.pack
的别名,以及所有这些两个声明合而为一的行。如果我们摆脱它们,并将 lambda 定义移到循环之外,我们会得到:
import struct
i = 255
Y = lambda V, B, c: c and Y(V*V + B, B, c-1) if(abs(V) < 6) else (2 + c - 4 * abs(V)**-0.4)/i
v = 7200
x = 4800
C = range(v*x)
M = '<QIIHHHH'
color = lambda T: (T * 80 + T**9 * i - 950 * T**99, T*70 - 880* T**18 + 701 * T**9, T * i**(1-T**45*2))
f = open('M.bmp','wb')
for X in f.write('BM' + struct.pack(M, v*x*3+26, 26, 12, v, x, 1, 24)) or C:
f.write(
struct.pack('BBB',
*color(sum([Y(0, (A%3/3. + X%v + (X/v + A/3/3. - x/2)/1j) * 2.5/x - 2.7, i)**2 for A in C[:9]]) / 9))
)
现在事情开始变得有点清晰了。循环为每个像素写入颜色值,lambda 返回一个三元组,代表每个像素的蓝色、绿色和红色值。
import struct
i = 255
Y = lambda V, B, c: c and Y(V*V + B, B, c-1) if abs(V) < 6 else (
(2 + c - 4 * abs(V)**-0.4)/i)
v = 7200
x = 4800
C = range(v*x)
M = '<QIIHHHH'
color = lambda T: (T * 80 + T**9 * i - 950 * T**99,
T*70 - 880* T**18 + 701 * T**9,
T * i**(1-T**45*2))
f = open('M.bmp', 'wb')
for X in f.write('BM' + struct.pack(M, v*x*3+26, 26, 12, v, x, 1, 24)) or C:
f.write(struct.pack('BBB',
*color(sum(
[Y(0, (A%3/3. + X%v + (X/v + A/3/3. - x/2)/1j) * 2.5/x - 2.7, i)**2
for A in C[:9]]) / 9))
)
根据您的评论,the asterisk (the star, *) unpacks a list into an argument list .
几个小时后,这是 Mandelbrot set 生成的将近 100 MB 的图像:
关于python - 混淆的 mandlebrot 函数 - 有人可以对其进行反混淆吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25123727/