代码高尔夫:Mandelbrot 套装
Posted
技术标签:
【中文标题】代码高尔夫:Mandelbrot 套装【英文标题】:Code golf: the Mandelbrot set 【发布时间】:2011-02-08 00:25:41 【问题描述】:代码高尔夫的常规规则。这里以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 艺术。这段代码也是这样
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图形规则:
行/列大小已参数化,代码必须使用任何有效值。 至少三级颜色,灰度 水平方向(我的原型是兼容的)【问题讨论】:
Alternatively, you can use ASCII art.
ASCII 艺术?那是 Tele-Tubby 吗?
谢谢。现在我不能再不颤抖地看那张照片了。
【参考方案1】:
几年前就有一个 perl 解决方案 发在perlmonks,内容如下:
#!/usr/bin/perl
$r=25; $c=80;
$xr=6;$yr=3;$xc=-0.5;$dw=$z=-4/
100;local$";while($q=$dr=rand()
/7)$w+=$dw;$_=join$/,map$Y=$_*
$yr/$r;
join"" ,map$ x=$_*$
xr/$c;($ x,$y)= ($xc+$x
*cos($ w)-$Y* sin$w,$yc+
$x*sin ($w)+$Y*cos
$w);$ e=-1;$ a=$b=0
;($a,$b) =($u-$v+$x,2*$a* $b+$y) while(
$ u=$a*$ a)+($v=$b*$b)<4.5 &&++$e <15;if (($e>$
q&&$e< 15)||($e==$q and rand() <$dr)) $q=$e;($d0,$d1) =($x,$
y); chr(+( 32,96,+ 46,45,43,58,73,37 ,36,64
,32)[$ e/1.5] );(-$ c/2)..($c/2)-1; (-$r/2
)..($ r/2)-1;select$", $",$", 0.015; system
$^O=~m ~[wW]in~x?"cls": "clear";print ;$xc=(
$d0+15 *$xc)/16;$yc=($ d1+15*$yc)/ 16;$_*=
1+$z for $xr,$yr;$dw *=-1 if rand
()<0.02; (++$i%110 )||($z*=-1)
这是一个“Mandelbrot explorer”。
(它会旋转、放大和缩小并随机滚动以检查区域 根据 Mandelbrot 的设置,它认为“很有趣”。 它是创造者。)
它不完全遵循此处命名的规范,但 做了一个有趣的条目(恕我直言)。也许一个简单的 Mandlebrot 对于 perl 诸神来说不是很有趣;.-)
问候
啵啵
【讨论】:
... 疯狂的是:它确实有效。只需将其粘贴到文本文件“mandel.pl”中并在 linux 控制台中启动它。创建者 'blokhead' (perlmonks.org/?node_id=137386) 是“Perl Monks”网站的知名贡献者。 另外,将终端/xterm/putty 的大小调整为 80x24 以获得最佳效果【参考方案2】:J,灰度图形输出,170 个字符。
load'viewmat'
c=:>(<:;|:;0$])((2$>:@+:)$-:%~i:)300
(2.5*|:3 99$i._99)viewmat :99&<.@;@((:+4&<@:(.+1&)@:*:);~(0c)&+@(.-1&)@:*:,:(1c)&+@:+:@(.*1&))^:99 c
alt text http://i40.tinypic.com/2i7lm0.jpg
J,带有等级的图形输出,151 个字符。
load'viewmat'
c=:>(<:;|:;0$])((2$>:@+:)$-:%~i:)99
viewmat :99&<.@;@((:+4&<@:(.+1&)@:*:);~(0c)&+@(.-1&)@:*:,:(1c)&+@:+:@(.*1&))^:99 c
输出:
alt text http://i40.tinypic.com/6ynxap.jpg
J,图形输出,124 个字符。
load'viewmat'
c=:>(<:;|:)((2$>:@+:)$-:%~i:)200
viewmat 4>:(.+:)@:*:(5<.>@((.c)&+@(.-:)@:*:;(:c)&+@:+:@(.*:)))^:999 c
基本上只是在 ascii 输出上运行“viewmat”。
alt text http://i40.tinypic.com/etv5lf.jpg
J,ASCII,101 个字符。
c=:>(<:;|:)((2$>:@+:)$-:%~i:)20
4>:(.+:)@:*:(5<.>@((.c)&+@(.-:)@:*:;(:c)&+@:+:@(.*:)))^:999 c
浪费了 6 个字符来正确参数化大小。
J,ASCII,95 个字符。
c=:>(<:;|:)41 41$10%~i:20
4>:(.+:)@:*:(5<.>@((.c)&+@(.-:)@:*:;(:c)&+@:+:@(.*:)))^:999 c
它还没有做多级灰度。
说明(目前已过时,稍后更新):
i:20
生成从 -20 到 20 的整数列表。
10%~i:20
将它们全部除以 10(%
是除数,~
是反转参数顺序。
41 41$10%~i:20
将此列表填充到一个 41x41 数组中,并进行换行。
(-&1;|:)41 41$`10%~i:20`
将第二个大小相同但已转置的数组附加到此数组。 -&1
从每个元素中减去一个,;
是追加,|:
是转置。现在我们有一个 2x41x41 数组,其中第一个 41x41 数组包含每个坐标的“x0”值,第二个包含“y0”值。
4<:~(.+:)@:*:(5<.>@((.c)&+@:(.-:)@:*:;(:c)&+@:+:@:(.*:)))^:1000 ($c)$0
哇。让我们从右边开始分解。
($c)$0
这将创建第二个 2x41x41 数组(大小与 c 相同),用 0 填充。这将是我们要迭代的变量 - 基本上第一个数组包含“x”值,第二个包含“y”值。
^:1000
表示“重复括号中的前一件事 1000 次。这是我们的循环计数器。
(5<.>@((.c)&+@:(.-:)@:*:;(:c)&+@:+:@:(.*:))
这是下一个大块。它基本上是循环的一次迭代。首先我们用((.c)&+@:(.-:)@:*:
生成x,然后将;
加入到y(:c)&+@:+:@:(.*:)
((.c)&+@:(.-:)@:*:
这会生成 x(请记住,它是在表示 x 和 y 的 2x41x41 数组上运行的)。首先它平方*:
每个元素,然后平方. - :
,或x^2 - y^2。 .
选择第一个 41x41 数组,:
选择第二个。 @:
将函数连接在一起。
到 x^2-y^2,我们需要添加 x0 - 这是 c 的第一个 41x41 数组,所以我们可以使用 (.c)&+
- &
curries .c
(x0) 到 +
.
(:c)&+@:+:@:(.*:)
我们以类似的方式生成 y。首先,我们将输入 x .
和 y :
数组成对相乘,将结果与 +:
相乘,然后加上 y0 :c
。
这个函数的最后一步是简单的5<.>
- 取消两个新的 x 和 y 数组的连接,并且上限为 5 - 没关系,因为这个函数在 4 以上单调递增,我们将退出 -如果我们不对每次迭代的值设置上限,则为边界整数。
4>:(.+:)@:*:
最后一步,一旦我们完成迭代。我们将 x 和 y 数组 *:
平方,将它们加在一起 .+:
,然后创建一个布尔数组,该数组对于 >:
小于 4 的每个元素都是正确的。
输出:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
【讨论】:
【参考方案3】:Python 108(原为 122):
对于范围内的 (900):打印"\nx"[(a%30>0)+(abs(reduce(lambda z,c:z*z+c,[a%30*.1-2+1j* (a/30*.1-1.5)]*30))最后的“30”是迭代次数,而不是维度之一。 输出如下:
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . X 。 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xx 。 . . . . . . . . . . . . . . . . . . . . . . . . . . xx 。 . . . . . . . . . . . . . . . . . . . . . . . X 。 x x x x x 。 . . . . . . . . . . . . . . . . . . . . . x x x x x x x x x 。 . . . . . . . . . . . . . . . . . . x x x x x x x x x x 。 . . . . . . . . . . . . . . X 。 . . x x x x x x x x x x 。 . . . . . . . . . . . . . x x x 。 x x x x x x x x x x x x。 . . . . . . . . . . . x x x x x x x x x x x x x x x x。 . . . . . x x x x x x x x x x x x x x x x x x x x x。 . . . . . . . . . . . . . x x x x x x x x x x x x x x x x。 . . . . . . . . . . . . . x x x 。 x x x x x x x x x x x x。 . . . . . . . . . . . . . X 。 . . x x x x x x x x x x 。 . . . . . . . . . . . . . . . . . . x x x x x x x x x x 。 . . . . . . . . . . . . . . . . . . . x x x x x x x x x 。 . . . . . . . . . . . . . . . . . . . X 。 x x x x x 。 . . . . . . . . . . . . . . . . . . . . . . . . xx 。 . . . . . . . . . . . . . . . . . . . . . . . . . . xx 。 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . X 。 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .现在将根据更新后的规则进行更新......
【讨论】:
【参考方案4】:Haskell(185 个字符,包含问题所需的所有功能)
使用复数并实际计算所需的迭代次数(与我其他答案中的“简单”版本不同)。
import Complex
i v=show(length$takeWhile((<=4).magnitude)$take 1000$iterate(\c->c*c+v)v)!!0
r t=[-2,4/read t-2..2]
main=getLine>>=(\[s,t]->mapM_ putStrLn[[i$x:+y|x<-r s]|y<-r t]).words
结果图像的尺寸从标准输入读取。输出根据所需的迭代次数“着色”:
$ ./分数 60 30 111111111111111111111111111111111111111111111111111111111111 111111111111111222222222222222211111111111111111111111111111 111111111222222222222222222222222222211111111111111111111111 111111222222222222222222222222222222222211111111111111111111 111222222222222222222222222222222222222222211111111111111111 122222222222222222222233333333332222222222222111111111111111 222222222222222222333333334444333333222222222221111111111111 2222222222222233333333344445875544333332222222222211111111111 222222222223333333334444556811754443333322222222221111111111 2222222233333333344445556711111765544333322222222221111111111 2222233333333444445562391112161568786443332222222222111111111 2223333334444455556681111111111111157544333222222222211111111 2333334445617677777911111111111111111854333222222222211111111 3333444456681131231111111111111111111654333322222222221111111 3444555671111111111111111111111111114644333322222222221111111 256988811111111111111111111111111296544333322222222221111111 3444555671111111111111111111111111114644333322222222221111111 3333444456681131231111111111111111111654333322222222221111111 2333334445617677777911111111111111111854333222222222211111111 2223333334444455556681111111111111157544333222222222211111111 2222233333333444445562391112161568786443332222222222111111111 2222222233333333344445556711111765544333322222222221111111111 222222222223333333334444556811754443333322222222221111111111 2222222222222233333333344445875544333332222222222211111111111 222222222222222222333333334444333333222222222221111111111111 122222222222222222222233333333332222222222222111111111111111 111222222222222222222222222222222222222222211111111111111111 111111222222222222222222222222222222222211111111111111111111 111111111222222222222222222222222222211111111111111111111111 111111111111111222222222222222211111111111111111111111111111 111111111111111111111111111111111111111111111111111111111111【讨论】:
【参考方案5】:德尔福 - 310 249 239 224 个字符
ASCII 版本。使用 7 级进行渐变着色。
根据(Uwe Raabe 建议)删除了program P;
和 $APPTYPE CONSOLE
;
内联 1000 const(由 Uwe Raabe 建议);
内联'8Oo;,. '
变量;
将word
更改为integer
以便循环变量可以为负数,然后将I的循环范围从3..38
更改为-5..30
以便(I-8)
可以替换为I
(建议埃里克·格兰奇);
将 1000
更改为 1e3
(由 Eric Grange 建议)
将类型 Double
更改为 Real
(由 Luc Neville 通过电子邮件建议)
删除括号 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
,在公式中补偿了这个偏移量;
不可读的版本:
var n,x,y:Real;t,i,j:Word;begin for j:=8to 40do begin for i:=8to 65do begin x:=0;y:=0;t:=0;while(x*x+y*y<=4)and(t<1e3)do begin n:=x*x-y*y+i/16-3;y:=2*x*y+j/12-2;x:=n;inc(t)end;Write('8Oo;,. '[t mod 7+1])end;WriteLn;end;end.
格式化代码:
var
n, x, y: Real;
t, i, j: Word;
begin
for j := 8 to 40 do
begin
for i := 8 to 65 do
begin
x := 0;
y := 0;
t := 0;
while (x * x + y * y <= 4) and (t < 1e3) do
begin
n := x * x - y * y + i / 16 - 3;
y := 2 * x * y + j / 12 - 2;
x := n;
inc(t)
end;
Write('8Oo;,. '[t mod 7 + 1])
end;
WriteLn;
end;
end.
输出:
OOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooo
OOOOOOOOOOOOOOOOooooooooo;;;;;;;;;;;;;;;oooooooooooooooooo
OOOOOOOOOOOOOOOoooooo;;;;;;;;;;;;;;,,,,,;;;;oooooooooooooo
OOOOOOOOOOOOOOooooo;;;;;;;;;;;;;,,,, ; .,,,;;;oooooooooooo
OOOOOOOOOOOOOoooo;;;;;;;;;;;;;,,,,.. O ,,,,;;;oooooooooo
OOOOOOOOOOOOooo;;;;;;;;;;;;;,,,,,...8oo,8..,,,;;;;oooooooo
OOOOOOOOOOOooo;;;;;;;;;;;;,,,,,,.. Oo. ; 8...,,;;;;ooooooo
OOOOOOOOOOOoo;;;;;;;;;;;;,,,,,. 8OO O8 ..,,;;;;oooooo
OOOOOOOOOOoo;;;;;;;;;;;,,,,.. O,oO8oo ,OOoO88,.,;;;;ooooo
OOOOOOOOOOo;;;;;;;;;;,,,.... o. . OOO ,;;;;;oooo
OOOOOOOOOO;;;;;;;;;,,...... o., o .,;;;;;ooo
OOOOOOOOOo;;;;;;,,. o 88O. ;O.,;;;;;ooo
OOOOOOOOO;;;,,,,,.. ,,o;,oOo; o ,,;;;;;oo
OOOOOOOOO;,,,,,... 8o; 8;, .,,;;;;;oo
OOOOOOOOO,,,,,... Oo . 8.,,;;;;;oo
OOOOOOOOO,.,. 88oo o , , .,,;;;;;oo
OOOOOOOO ,8 .,,;;;;;;o
OOOOOOOOO,.,. 88oo o , , .,,;;;;;oo
OOOOOOOOO,,,,,... Oo . 8.,,;;;;;oo
OOOOOOOOO;,,,,,... 8o; 8;, .,,;;;;;oo
OOOOOOOOO;;;,,,,,.. ,,o;,oOo; o ,,;;;;;oo
OOOOOOOOOo;;;;;;,,. o 88O. ;O.,;;;;;ooo
OOOOOOOOOO;;;;;;;;;,,...... o., o .,;;;;;ooo
OOOOOOOOOOo;;;;;;;;;;,,,.... o. . OOO ,;;;;;oooo
OOOOOOOOOOoo;;;;;;;;;;;,,,,.. O,oO8oo ,OOoO88,.,;;;;ooooo
OOOOOOOOOOOoo;;;;;;;;;;;;,,,,,. 8OO O8 ..,,;;;;oooooo
OOOOOOOOOOOooo;;;;;;;;;;;;,,,,,,.. Oo. ; 8...,,;;;;ooooooo
OOOOOOOOOOOOooo;;;;;;;;;;;;;,,,,,...8oo,8..,,,;;;;oooooooo
OOOOOOOOOOOOOoooo;;;;;;;;;;;;;,,,,.. O ,,,,;;;oooooooooo
OOOOOOOOOOOOOOooooo;;;;;;;;;;;;;,,,, ; .,,,;;;oooooooooooo
OOOOOOOOOOOOOOOoooooo;;;;;;;;;;;;;;,,,,,;;;;oooooooooooooo
OOOOOOOOOOOOOOOOooooooooo;;;;;;;;;;;;;;;oooooooooooooooooo
OOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooo
【讨论】:
错误:因为 g 是一个基于 1 的字符串,你最好写成“g[t mod 7 + 1]”。您可以通过内联常量 m 并删除“program Mandel;”来减少总长度。陈述。 APPTYPE 可以在编译器的命令行中设置,所以也可以完全去掉。这一切都产生了 273 个字符。顺便说一句,我喜欢 D2010 中的新 CTRL-D 键... @Uwe:好建议。我已经从代码中删除了编译器指令,并去掉了 m 常量。我还去掉了 g 常量,并将其用作如下文字:'8Oo;,。 '[t mod 7+1],所以可以放弃整个 const 部分。我还删除了正在缓存的临时变量,以便在每次迭代中重新计算它们。以性能为代价节省了几个字符:) 您仍然可以删除“程序”行,因为编译器实际上不需要它。这将为您节省另外 10 个字符。 太棒了,我不知道你可以把这条线去掉。在 IDE 之外重命名文件时使编译器静音的好方法。但是,如果您尝试使用 file/new/unit,它会弄乱您的代码。 您可以通过将 while 更改为“while(xx+yy 【参考方案6】:T-SQL(421 408 个字符)
declare @s varchar(max);
with
x(x)as(select CAST(-2.0 as real)union all select x+.01 from x where x<1),
y(y)as(select CAST(-1.1 as real)union all select y+.02 from y where y<1.1),
g(x,y,u,v,g)as(select x,y,x*0,y*0,0 from x,y union all select x,y,u*u-v*v+x,2*u*v+y,g+1 from g where g<24and u*u+v*v<4),
m(x,y,v)as(select x,y,case when x<-1.99 then char(10)end+substring(' .-''^"+oiexp**##$$$§§%%%@',COUNT(*),1)from g group by x,y)
select @s=@s+v from m order by y,x option(maxrecursion 400)
select @s
Output is here:
【讨论】:
比这还要短:thedailywtf.com/Articles/… 嗯,这就是灵感。 :) Msg 530, Level 16, State 1, Line 2 语句终止。在语句完成之前,最大递归 300 已用完。 我的错——最多 400 应该没问题。请注意,SSMS 默认情况下每列仅显示 256 个字符(并且无法正确显示换行符,因此请使用select cast(@s as xml)
查看结果【参考方案7】:
awk - 134 135 字符
ASCII 艺术,完全兼容。 python参考实现的相当简单的翻译:
for(j=-2;j<=2;j+=4/$2)for(i=-3;i<=1;i+=4/$1)for(x=y=k=0;x*x+y*y<=4&&++k<4^5;)
t=x*x-y*y+i;y=2*x*y+j;x=tprintf"%d",log(k)print""
试运行
$ awk -f mandel.awk
10 10
00000000000
00000000000
00000111000
00001116110
00011166610
00046666611
00011166610
00001116110
00000111000
00000000000
00000000000
这是一门VT-100艺术。将 xterm 设置为“不可读”字符,然后尝试 400x200 设置:
for(j=-2;j<=2;j+=4/$2)for(i=-3;i<=1;i+=4/$1)for(x=y=k=0;x*x+y*y<=4&&++k<1000;)
t=x*x-y*y+i;y=2*x*y+j;x=tprintf"\x1b[4%dm ",log(k)print"\x1b[0m"
【讨论】:
【参考方案8】:Haskell(162 个字符)
一个(相当)直接的 ASCII 艺术版本:
c(x,y)|x*x+y*y<4.0='x'
|True='.'
i v w=c(iterate s(v,w)!!1000)where s(x,y)=(x*x-y*y+v,2*x*y+w)
main=mapM_ putStrLn[[i x y|x<-[-1.5,-1.45..0.5]]|y<-[1,0.9.. -1]]
输出:
$ ./a.out ......................................................... ......................................................... …………………………………………………………………………………………………………………………………………………………………………………… …………………………………………………………………………………………………………………………………………………………………………………… ....................x..xxxxxxxxxxxx........ .....................xxxxxxxxxxxxxxxxxx.... ....xxxxxxxxxxxxxxxxxx.... ........xxxxxxxxxxxxxxxxxxxxx... .......xxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxx... ......xxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxx... ..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...... ......xxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxx... .......xxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxx... ........xxxxxxxxxxxxxxxxxxxxx... ....xxxxxxxxxxxxxxxxxx.... .....................xxxxxxxxxxxxxxxxxx.... ....................x..xxxxxxxxxxxx........ …………………………………………………………………………………………………………………………………………………………………………………… …………………………………………………………………………………………………………………………………………………………………………………… ......................................................... .........................................................更易读的版本:
outchar (x,y)
| x*x + y*y < 4.0 = 'x'
| otherwise = '.'
calc v w = outchar (iterate step (v,w) !! 1000)
where step (x,y) = (x*x - y*y + v, 2*x*y + w)
main = mapM_ putStrLn [[calc x y
| x <- [-1.5, -1.45 .. 0.5]]
| y <- [1, 0.9 .. -1]]
【讨论】:
【参考方案9】:Python 197 162
def m():
for a in range(900):
c=complex(a%30*.1-2,a/30*.1-1.5);z,i=c-c,0
while i<28 and abs(z)<2:z,i=z*z+c,i+1
if a%30==0:print
print ".-+oxawOX "[i/3],
我对你如何摆脱 python 中的空白很感兴趣。
【讨论】:
如果您将 4 个空格转换为单个制表符,原始实际上是 163。 重新空白 - 你没有,这就是为什么它被称为显着 @johnc 查看我的其他(可读性较差)答案。在函数内部使用函数可以将它们全部放在一行上。诀窍是弄清楚要使用哪些功能。例如,通过使输出只有 2 个级别,我能够将 while 循环移动到 reduce() 中。这就是我感兴趣的事情。【参考方案10】:汇编程序
.COM 可执行文件 = 140 字节
源 = 652 字节
mov ax,13h
int 10h
mov bx,200
xor di,di
mov ax,0a000h
mov es,ax
l1:mov bp,320
mov [si],bx
fild w[si]
fisub w[v100]
fidiv w[v50]
l2:mov cx,1000
mov [si],bp
fild w[106h]
fisub w[si]
fidiv w[v80]
fld1
fsubp
fldz
fldz
l3:fld st(1)
fmul st(0)
fld st(1)
fmul st(0)
fld st(0)
fadd st(2)
fcomp d[v4]
fstsw ax
test ah,45h
jz l4
fsubp
fadd st(3)
fxch st(2)
fild w[v2]
fmulp st(1)
fmulp st(1)
fadd st(3)
loop l3
mov al,255
l5:fcompp
fcomp
stosb
dec bp
jnz l2
fcomp
dec bx
jnz l1
mov ah,7
int 21h
mov ax,3
int 10h
ret
l4:mov ax,-10
mul cx
fcompp
jmp l5
v100:dw 100
v50:dw 80
v80:dw 90
v4:dd 4.0
v2:dw 2
【讨论】:
【参考方案11】:JavaScript(168/174 个字符)
Rhino 版本(168 个字符):
m=1000;for(i=0;i<40;i++)l=[];for(j=0;j<80;j++)v=j/80*3-2,w=2-i/40*3,x=y=c=0;while(x*x+y*y<5&&c<m)t=x*x-y*y+v,y=2*x*y+w,x=t,c++;l.push(c==m?' ':'-')print(l.join(''))
Firebug 版本(174 个字符):
m=1000;for(i=0;i<40;i++)l=[];for(j=0;j<80;j++)v=j/80*3-2,w=2-i/40*3,x=y=c=0;while(x*x+y*y<5&&c<m)t=x*x-y*y+v,y=2*x*y+w,x=t,c++;l.push(c==m?' ':'-')console.log(l.join(''))
【讨论】:
【参考方案12】:还有一个 dc 条目 - 152 个字符
dc
我平时的疯狂
Ak?4r/sa4r/sbA00sm[0*]sG_2sj[_3si[0ddsxsysk[lxd*lyd*-li+2lxly**lj+sysx1lxd*lyd*+
4!>G1lk1+dsklm<G*1=L]dsLx0klk1-vvnAklila+dsi1!<I]dsIxAPljlb+dsj2!<J]dsJx
试运行:
bash-3.2$ dc -f mandel.dc
10 20
000000000000000000000
000000000011111111111
000000001111111111111
000000111111115211111
000000111111555551111
000000555555555551111
000000111111555551111
000000111111115211111
000000001111111111111
000000000011111111111
000000000000000000000
【讨论】:
没有什么能像这样与 perl 竞争。呸! ;)【参考方案13】:Ruby - 139 个字符 (Twitter 友好)
b,a=$*;a.to_i.times|l|puts (0..b.to_i).map|n|x=y=i=0;(x,y,i=x*x-y*y+n/38.0-1.5,2*x*y+l/14.0-1,i+1)until(x*x+y*y>4||i>78);(32+i).chr*""
$ ruby mandelbrot.rb 80 32
或作为单个命令行(134 个字符,包括ruby -e
)
ruby -e "32.times|l|puts (0..78).map|n|x=y=i=0;(x,y,i=x*x-y*y+n/38.0-1.5,2*x*y+l/14.0-1,i+1)until(x*x+y*y>4||i>78);(32+i).chr*''"
"###############################$$$$$$$$$$$%%%%&&') */))*.o&%$$$$$$$$########"""""
############################$$$$$$$$$$$$$%%%%%&''( (*-G,*('&&%%$$$$$$$$$########""
#########################$$$$$$$$$$$$%%%%%&&'929-03ooL.+ 0:'&%%%%%$$$$$$$########
####################$$$$$$$$$$$$$%%%&&&&&''()-1oooooooo/*('&& %%%%%%%$$$$$######
##################$$$$$$$$$$$$%%%&'''''''''())*,6oooooooo. *)((''&&&&&&&%$$$#####
###############$$$$$$$$$%%%%%%&&'(+3:0.,++ooE6ooooooooooo?8o1j?8)((( ()4/'&%$$$###
###########$$$$$$%%%%%%%%%%&&&&''(*1>ooo8oooooooooooooooooooooo.3oooD/,'%%$$$##
#######$$$$%%%%%%%%%%%%%&&&&&&')8,,17oooooooooooooooooooooooooooooQ0)'&&%%$$$#
$$$$$$%&)(&&&&&&&&&&&&&&'''((*18ooooooooooooooooooooooooooooooooool*(('&%%$$$
$$%%%%&&*2*))((((25*(('''(()+F>=oooooooooooooooooooooooooooooooooooo1.(%%$$$
%%%%%&&'()*,1o47//5o5/?,+***+3oooooooooooooooooooooooooooooooooooooooooo.)(&%%$$$
%%%%&'''(*+-3oooooooooooooom//-.oooooooooooooooooooooooooooooooooooooooooo9+&%%$$$
&&(*+)))+-?ooooooooooooooooooL5ooooooooooooooooooooooooooooooooooooooooooo8)&%%%$$$
'()*-X=U95ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo:.+)('&&%%%$$$
'()*-X=U95ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
&&(*+)))+-?ooooooooooooooooooL5ooooooooooooooooooooooooooooooooooooooooooo8)&%%%$$$
%%%%&'''(*+-3oooooooooooooom//-.oooooooooooooooooooooooooooooooooooooooooo9+&%%$$$
%%%%%&&'()*,1o47//5o5/?,+***+3oooooooooooooooooooooooooooooooooooooooooo.)(&%%$$$
$$%%%%&&*2*))((((25*(('''(()+F>=oooooooooooooooooooooooooooooooooooo1.(%%$$$
$$$$$$%&)(&&&&&&&&&&&&&&'''((*18ooooooooooooooooooooooooooooooooool*(('&%%$$$
#######$$$$%%%%%%%%%%%%%&&&&&&')8,,17oooooooooooooooooooooooooooooQ0)'&&%%$$$#
###########$$$$$$%%%%%%%%%%&&&&''(*1>ooo8oooooooooooooooooooooo.3oooD/,'%%$$$##
###############$$$$$$$$$%%%%%%&&'(+3:0.,++ooE6ooooooooooo?8o1j?8)((( ()4/'&%$$$###
##################$$$$$$$$$$$$%%%&'''''''''())*,6oooooooo. *)((''&&&&&&&%$$$#####
####################$$$$$$$$$$$$$%%%&&&&&''()-1oooooooo/*('&& %%%%%%%$$$$$######
#########################$$$$$$$$$$$$%%%%%&&'929-03ooL.+ 0:'&%%%%%$$$$$$$########
############################$$$$$$$$$$$$$%%%%%&''( (*-G,*('&&%%$$$$$$$$$########""
"###############################$$$$$$$$$$$%%%%&&') */))*.o&%$$$$$$$$########"""""
"""""###############################$$$$$$$$%%%&' *)'&&%%%$$$$$$$#######"""""""""
"""""""""#################################$$$$$$$% %%%%$$$$$#########""""""""""""""
""""""""""""""""################################# ###########"""""""""""""""""""""
【讨论】:
【参考方案14】:Python。 98 个字符。
for _ in range(526):z=0;exec"z=z*z+_%25*.1-2+_/25*.1j-1j;"*50;print[".#"[z.real<4],"\n"][_%25<1],
打印如下内容:
. . . . . . . . . . . . . . . . . . . # . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . # # . . . . .
. . . . . . . . . . . . . . . . . # # . . . . .
. . . . . . . . . . . . . . # . # # # # # . . .
. . . . . . . . . . . . . . # # # # # # # # # .
. . . . . . . . . . . . . # # # # # # # # # # .
. . . . . . . . . . . . . # # # # # # # # # # .
. . . . . . . . # # # . # # # # # # # # # # # .
. . . . . . . # # # # # # # # # # # # # # # # .
# # # # # # # # # # # # # # # # # # # # # # . .
. . . . . . . # # # # # # # # # # # # # # # # .
. . . . . . . . # # # . # # # # # # # # # # # .
. . . . . . . . . . . . . # # # # # # # # # # .
. . . . . . . . . . . . . # # # # # # # # # # .
. . . . . . . . . . . . . . # # # # # # # # # .
. . . . . . . . . . . . . . # . # # # # # . . .
. . . . . . . . . . . . . . . . . # # . . . . .
. . . . . . . . . . . . . . . . . # # . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . # . . . .
http://codepad.org/rNPrgQ3H
【讨论】:
【参考方案15】:C# - 330
277 如果您删除 using 语句并删除前导空格和行尾
int c,i,j,w=300,h=300,m=50;
using(var b=new Bitmap(w,h))
for(i=0;i<w;i++)
for(j=0;j<h;j++)
double x0=4.0*(i-w/2)/w-1,y0=4.0*(j-h/2)/h,x=0.0,y=0.0;
for(c=0;x*x+y*y<=4.0&&c<m;c++)
var t=x*x-y*y+x0;
y=2.0*x*y+y0;x=t;
int v=c==m?255:c*10%255;
b.SetPixel(i,j,Color.FromArgb(v,v,v));
远未记录设置 - 但从 Python 示例源转换并压缩到无法阅读的范围内很有趣。
【讨论】:
以上是关于代码高尔夫:Mandelbrot 套装的主要内容,如果未能解决你的问题,请参考以下文章
当分辨率高于 320 像素时,Mandelbrot 代码不令人兴奋? [复制]