代码高尔夫:Mandelbrot 集
代码高尔夫的通常规则。以下是 python 中的实现作为示例
from PIL import Image
im = Image.new("RGB", (300,300))
for i in xrange(300):
print "i = ",i
for j in xrange(300):
x0 = float( 4.0*float(i-150)/300.0 -1.0)
y0 = float( 4.0*float(j-150)/300.0 +0.0)
x=0.0
y=0.0
iteration = 0
max_iteration = 1000
while (x*x + y*y <= 4.0 and iteration < max_iteration):
xtemp = x*x - y*y + x0
y = 2.0*x*y+y0
x = xtemp
iteration += 1
if iteration == max_iteration:
value = 255
else:
value = iteration*10 % 255
print value
im.putpixel( (i,j), (value, value, value))
im.save("image.png", "PNG")
结果应如下所示
允许使用图像库。或者,您可以使用 ASCII art。此代码执行相同的
for i in xrange(40):
line = []
for j in xrange(80):
x0 = float( 4.0*float(i-20)/40.0 -1.0)
y0 = float( 4.0*float(j-40)/80.0 +0.0)
x=0.0
y=0.0
iteration = 0
max_iteration = 1000
while (x*x + y*y <= 4.0 and iteration < max_iteration):
xtemp = x*x - y*y + x0
y = 2.0*x*y+y0
x = xtemp
iteration += 1
if iteration == max_iteration:
line.append(" ")
else:
line.append("*")
print "".join(line)
结果
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
**************************************** ***************************************
**************************************** ***************************************
**************************************** ***************************************
**************************************** ***************************************
**************************************** ***************************************
**************************************** ***************************************
**************************************** ***************************************
*************************************** **************************************
************************************* ************************************
************************************ ***********************************
*********************************** **********************************
************************************ ***********************************
************************************* ************************************
*********************************** **********************************
******************************** *******************************
**************************** ***************************
***************************** ****************************
**************************** ***************************
************************ * * ***********************
*********************** * * **********************
******************** ******* ******* *******************
**************************** ***************************
****************************** *****************************
***************************** * * * ****************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
编辑:
ASCII 艺术规则:
- 行/列大小已参数化,并且代码必须适用于任何有效值。
- 密度至少有三个级别的差异,具体取决于迭代计数(因此我的原型不符合要求)
- 水平方向(因此我的原型不符合要求)
- 关键参数是固定的(最大迭代= 1000,失控值xx + yy <= 4.0)
图形规则:
- 行/列大小已参数化,并且代码必须适用于任何有效值。
- 至少三级颜色,
- 水平方向的灰度(我的原型是兼容的)
Usual rules for the code golf. Here is an implementation in python as an example
from PIL import Image
im = Image.new("RGB", (300,300))
for i in xrange(300):
print "i = ",i
for j in xrange(300):
x0 = float( 4.0*float(i-150)/300.0 -1.0)
y0 = float( 4.0*float(j-150)/300.0 +0.0)
x=0.0
y=0.0
iteration = 0
max_iteration = 1000
while (x*x + y*y <= 4.0 and iteration < max_iteration):
xtemp = x*x - y*y + x0
y = 2.0*x*y+y0
x = xtemp
iteration += 1
if iteration == max_iteration:
value = 255
else:
value = iteration*10 % 255
print value
im.putpixel( (i,j), (value, value, value))
im.save("image.png", "PNG")
The result should look like this
Use of an image library is allowed. Alternatively, you can use ASCII art. This code does the same
for i in xrange(40):
line = []
for j in xrange(80):
x0 = float( 4.0*float(i-20)/40.0 -1.0)
y0 = float( 4.0*float(j-40)/80.0 +0.0)
x=0.0
y=0.0
iteration = 0
max_iteration = 1000
while (x*x + y*y <= 4.0 and iteration < max_iteration):
xtemp = x*x - y*y + x0
y = 2.0*x*y+y0
x = xtemp
iteration += 1
if iteration == max_iteration:
line.append(" ")
else:
line.append("*")
print "".join(line)
The result
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
**************************************** ***************************************
**************************************** ***************************************
**************************************** ***************************************
**************************************** ***************************************
**************************************** ***************************************
**************************************** ***************************************
**************************************** ***************************************
*************************************** **************************************
************************************* ************************************
************************************ ***********************************
*********************************** **********************************
************************************ ***********************************
************************************* ************************************
*********************************** **********************************
******************************** *******************************
**************************** ***************************
***************************** ****************************
**************************** ***************************
************************ * * ***********************
*********************** * * **********************
******************** ******* ******* *******************
**************************** ***************************
****************************** *****************************
***************************** * * * ****************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
Edit:
Rules for the ASCII art:
- size in rows/columns is parametrized and the code must work with any valid value.
- at least three level of differentiation in density depending on the iteration count (so my prototype up there is not compliant)
- oriented horizontally (so my prototype up there is not compliant)
- critical parameters are fixed (max iteration = 1000, runaway value xx + yy <= 4.0)
Rules for the graphic:
- size in rows/columns is parametrized and the code must work with any valid value.
- at least three level of colors, gray scale
- oriented horizontally (my prototype is compliant)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(15)
几年前就已经有了 Perl 解决方案
张贴在 perlmonks 中,它写道:
这是一个“Mandelbrot 浏览器”。
(它可以旋转、放大和缩小,并随机滚动以检查区域
曼德尔布罗特集的它认为“有趣”。
它的创建者。)
它并不完全遵循此处指定的规范,但是
做了一个有趣的条目(恕我直言)。也许是一个简单的
对于 Perl 诸神来说,Mandlebrot 并不是很有趣;.-)
问候
rboo
There was a perl solution already some years ago
posted in perlmonks, it reads:
which is a "Mandelbrot explorer".
(It rotates, zooms in & out, and scrolls randomly to examine regions
of the Mandelbrot set it deems "interesting.", according to
it's creator.)
It doesn't exactly follow the specs named here but
makes an interesting entry (imho). Maybe a simple
Mandlebrot is not very interesting for the perl gods ;.-)
Regards
rboo
J,带级别的灰度图形输出,170 个字符。
alt text http://i40.tinypic.com/2i7lm0.jpg
J,带级别的图形输出,151 个字符。
输出:
替代文本 http://i40.tinypic.com/6ynxap.jpg
J,图形输出,124 个字符。
基本上只是在 ascii 输出上运行“viewmat”。
替代文本 http://i40.tinypic.com/etv5lf.jpg
J,ASCII,101 个字符。
浪费了 6 个字符来正确参数化大小。
J,ASCII,95 个字符。
它还不能实现多级灰度。
说明(目前已过时,稍后更新):
生成从-20到20的整数列表。
将它们全部除以10(
%
是除法,~
是倒数将此列表填充到 41x41 数组中,并
在该数组中附加相同大小的第二个数组,但
-&1
从每个元素中减去 1。 ; 是追加,|:
是转置。现在我们有一个 2x41x41 数组,其中第一个 41x41 数组包含每个坐标的“x0”值,第二个包含“y0”值。哇,让我们从右边分解它,
这将创建第二个 2x41x41 数组(与 c 大小相同),这将是我们要迭代的变量 - 基本上第一个数组包含“x”。 ” 值,第二个包含“y”值。
^:1000
表示“重复括号中的前一操作1000 次。这是我们的循环计数器。这是下一个大块。循环的迭代。首先我们用
(({.c)&+@:({.-{:)@:*:
生成 x,然后将;
连接到 y({:c)&+@:+:@:({.*{:)
这会生成 x (记住它是在代表 x 和 y 的 2x41x41 数组上进行操作)。 : 每个元素,然后
{ - {:
或 x^2 - y^2. 选择第一个 41x41 数组,{:
第二个@:
将函数连接在一起。对于 x^2-y^2,我们需要添加 x0 - 这是 c 的第一个 41x41 数组,因此我们可以这样做。 with
({.c)&+
-&
将{.c
(x0) 柯式化为+
。我们以类似的方式生成 y。首先,我们将输入 x
{.
和 y{:
数组成对相乘,用+:
将结果加倍。 ,并添加 y0{:c
。该函数的最后一步就是
5<.>
- 拆箱两个新的 x 和 y 数组的连接,并封顶。在 5 处 - 没关系,因为这个函数在 4 以上单调递增,如果我们不限制每次迭代的值,我们将得到越界整数。最后一步,一旦我们完成迭代。我们对 x 和 y 数组
*:
求平方,将它们加在一起 {.+{:
,并创建一个对于> 的每个元素都为 true 的布尔数组:
小于 4。输出:
J, greyscale graphical output with levels, 170 characters.
alt text http://i40.tinypic.com/2i7lm0.jpg
J, graphical output with levels, 151 characters.
Output:
alt text http://i40.tinypic.com/6ynxap.jpg
J, graphical output, 124 characters.
Basically just runs "viewmat" on the ascii output.
alt text http://i40.tinypic.com/etv5lf.jpg
J, ASCII, 101 characters.
Wasted 6 characters to properly parametrize the size.
J, ASCII, 95 characters.
It doesn't do multiple levels of greyscale yet.
Explanation (currently out of date, will update later):
Generate the list of integers from -20 to 20.
Divide them all by 10 (
%
is divide,~
is invert order of arguments.Fill this list into a 41x41 array, with wrapping.
Append to this array a second array of the same size, but transposed.
-&1
subtracts one from each element,;
is append,|:
is transpose. Now we have a 2x41x41 array, where the first 41x41 array contains the "x0" values of each coordinate and the second contains the "y0" values.Wow. Let's break this up from the right.
This creates a second 2x41x41 array (the same size as c), filled with 0s. This is going to be the variable we're iterating on - basically the first array contains the "x" values and the second contains the "y" values.
^:1000
means "Repeat the previous thing in parentheses 1000 times. This is our loop counter.This is the next big chunk. It's basically doing one iteration of the loop. First we generate x with
(({.c)&+@:({.-{:)@:*:
, then join;
it to y({:c)&+@:+:@:({.*{:)
This generates x (remember it's operating on that 2x41x41 array representing x and y). First it squares
*:
each element, then does{. - {:
, or x^2 - y^2.{.
selects the first 41x41 array and{:
the second.@:
joins functions together.To x^2-y^2, we need to add x0 - this is the first 41x41 array of c so we can do this with
({.c)&+
-&
curries{.c
(x0) into+
.We generate y in a similar fashion. First we pairwise multiply the input x
{.
and y{:
arrays, double the result with+:
, and add y0{:c
.The last step of this function is simply
5<.>
- unboxing the join of the two new x and y arrays, and capping at 5 - it's ok since this function is monotonically increasing above 4, and we'll get out-of-bounds integers if we don't cap the values on each iteration.The last step, once we've finished iterating. We square the x and y arrays
*:
, add them together{.+{:
, and make a boolean array that's true for every element that's>:
less than 4.Output:
Python 108(原为 122):
最后一个“30”是迭代计数,而不是维度之一。
输出如下:
现在将根据更新的规则进行更新......
Python 108 (was 122):
That last "30" is the iteration count, not one of the dimensions.
Output looks thus:
Now going to update based on the updated rules....
Haskell(185个字符,具有问题中所需的所有功能)
使用复数并实际计算所需的迭代次数(与我其他答案中的“简单”版本不同)。
生成图像的尺寸是从标准输入读取的。输出根据所需的迭代次数进行“着色”:
Haskell (185 chars, with all the features required in the question)
Using complex numbers and actually counting the required number of iterations (unlike the "simple" version in my other answer).
The dimensions of the resulting image are read from stdin. The output is "colored" according to the number of required iterations:
Delphi -
310249239224 个字符ASCII 版本。使用 7 个级别进行渐变着色。
program P;
和{$APPTYPE CONSOLE}
;'8Oo;,。 '
变量;word
更改为integer
,以便循环变量可以为负数,然后将 I 的循环范围从3..38
更改为-5..30
,以便(I-8)
可以替换为I
(由 Eric Grange 建议);1000
更改为1e3
(由 Eric Grange 建议)Double
更改为Real
(由 Luc Neville 通过 e 建议) -mail)while((x*x+y*y<=4)and(t<1000))do
-->while(x*x+y*y<=4)and(t<1000)do
(Luc Neville 通过电子邮件建议)for j:=-5 to 30 do
变为for j:=-5to 30do
(Neville 通过电子邮件建议)for j: =8to 40do
,删除负号,并将整数更改回单词 通过更改 x * x - y * y + i / 16 - 2; 来补偿公式中的此偏移量。到x * x - y * y + i / 16 - 3
;不可读版本:
格式化代码:
输出:
Delphi -
310249239224 charsASCII version. Uses 7 levels for gradient shading.
program P;
and{$APPTYPE CONSOLE}
according to (suggested by Uwe Raabe);'8Oo;,. '
variable;word
tointeger
so that the loop variable can be negative, and then changed the loop range for I from3..38
to-5..30
so that(I-8)
could be replaced byI
(suggested by Eric Grange);1000
to1e3
(suggested by Eric Grange)Double
toReal
(suggested by Luc Neville via e-mail)while((x*x+y*y<=4)and(t<1000))do
-->while(x*x+y*y<=4)and(t<1000)do
(suggested by Luc Neville via e-mail)for j:=-5 to 30 do
becomesfor j:=-5to 30do
(Suggested by Neville via e-mail)for j:=8to 40do
, removing the negative sign, and changed integer back to word. Compensated this offset in the formula, by changingx * x - y * y + i / 16 - 2;
tox * x - y * y + i / 16 - 3
;Unreadable version:
Formatted code:
Output:
T-SQL(
421408 个字符)输出在这里:
T-SQL (
421408 characters)Output is here:
awk - 134
135字符ASCII 艺术,完全兼容。 python 参考实现的相当简单的翻译:
测试运行
,这是一个 VT-100 艺术。将 xterm 设置为“不可读”字符,然后尝试 400x200 设置:
awk - 134
135charsASCII art, fully compliant. Fairly straightforward translation of the python reference implementation:
test run
and this is a VT-100 art. Set the xterm to "unreadable" characters, then try a 400x200 set:
Haskell(162 个字符)
一个(相当)直接的 ASCII 艺术版本:
输出:
更可读的版本:
Haskell (162 characters)
A (fairly) straight forward ASCII art version:
Output:
More readable version:
Python
197162我对如何消除 python 中的空白感兴趣。
Python
197162I'm interested in how you get rid of the white space in python.
汇编器
.COM 可执行文件 = 140 字节
源 = 652 字节
Assembler
.COM Executable = 140 bytes
Source = 652 bytes
JavaScript(168/174 个字符)
Rhino 版本(168 个字符):
Firebug 版本(174 个字符):
JavaScript (168/174 characters)
Rhino version (168 characters):
Firebug version (174 characters):
还有一个 dc 条目 - 152 个字符
我在
dc
测试运行中通常的疯狂:
And a dc entry - 152 chars
My usual madness in
dc
test run:
Ruby - 139 个字符(Twitter 友好)
$ ruby mandelbrot.rb 80 32
或作为单个命令行(134 个字符,包括
红宝石-e
)Ruby - 139 chars (Twitter-friendly)
$ ruby mandelbrot.rb 80 32
or as a single command line (134 chars including
ruby -e
)Python。 98 个字符。
打印如下内容:
http://codepad.org/rNPrgQ3H
Python. 98 chars.
Prints something like this:
http://codepad.org/rNPrgQ3H
C# - 330
277 如果您删除 using 语句并删除前导空格和行结尾
长远来看不会记录设置 - 但从 Python 示例源转换并压缩到超出可读范围很有趣。
C# - 330
277 if you drop the using statement and remove the leading whitespace and line endings
Not record setting by a long shot - but fun to convert from the Python sample source and compress down beyond readable.