Code golf: el conjunto de Mandelbrot
code-golf rosetta-stone (15)
C # - 330
277 si suelta la instrucción de uso y elimina los espacios en blanco iniciales y los finales de línea
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));
}
}
}
No se graba la configuración por un plano general, pero es divertido convertirla desde la fuente de muestra de Python y comprimirla más allá de lo legible.
Reglas habituales para el código de golf. Aquí hay una implementación en python como ejemplo
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")
El resultado debería verse así
Se permite el uso de una biblioteca de imágenes. Alternativamente, puede usar el arte ASCII. Este código hace lo mismo
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)
El resultado
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
**************************************** ***************************************
**************************************** ***************************************
**************************************** ***************************************
**************************************** ***************************************
**************************************** ***************************************
**************************************** ***************************************
**************************************** ***************************************
*************************************** **************************************
************************************* ************************************
************************************ ***********************************
*********************************** **********************************
************************************ ***********************************
************************************* ************************************
*********************************** **********************************
******************************** *******************************
**************************** ***************************
***************************** ****************************
**************************** ***************************
************************ * * ***********************
*********************** * * **********************
******************** ******* ******* *******************
**************************** ***************************
****************************** *****************************
***************************** * * * ****************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
Editar :
Reglas para el arte ASCII:
- el tamaño en filas / columnas está parametrizado y el código debe funcionar con cualquier valor válido.
- al menos tres niveles de diferenciación en densidad dependiendo del recuento de iteraciones (por lo que mi prototipo no es compatible)
- orientado horizontalmente (por lo que mi prototipo no es compatible)
- los parámetros críticos son fijos (iteración máxima = 1000, valor de escape x x + y y <= 4.0)
Reglas para el gráfico:
- el tamaño en filas / columnas está parametrizado y el código debe funcionar con cualquier valor válido.
- al menos tres niveles de colores, escala de grises
- orientado horizontalmente (mi prototipo es compatible)
Delphi - 310 249 239 224 caracteres
Versión ASCII. Utiliza 7 niveles para sombreado degradado.
- Se eliminó el
program P;
y{$APPTYPE CONSOLE}
acuerdo con (sugerido por Uwe Raabe); - Inlined 1000 const (sugerido por Uwe Raabe);
- En línea
''8Oo;,. ''
''8Oo;,. ''
variable; - Se cambió la
word
ainteger
para que la variable de bucle pueda ser negativa, y luego se modificó el rango de bucle para I de3..38
a-5..30
para que(I-8)
pueda ser reemplazado porI
(sugerido por Eric Grange) ; - Cambió de
1000
a1e3
(sugerido por Eric Grange) - Se cambió el tipo de
Double
aReal
(sugerido por Luc Neville a través del correo electrónico) - Se eliminaron los corchetes
while((x*x+y*y<=4)and(t<1000))do
->while(x*x+y*y<=4)and(t<1000)do
(sugerido por Luc Neville por correo electrónico) - Se eliminaron los espacios entre los números que fueron seguidos por una palabra clave (de modo que
for j:=-5 to 30 do
conviertefor j:=-5to 30do
(Sugerido por Neville por correo electrónico) - Se cambió el rango de bucle a
for j:=8to 40do
, sefor j:=8to 40do
el signo negativo y se cambió el entero a palabra. Compensó este desplazamiento en la fórmula, cambiandox * x - y * y + i / 16 - 2;
ax * x - y * y + i / 16 - 3
;
Versión ilegible
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.
Código formateado:
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.
Salida:
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
Ensamblador
.COM ejecutable = 140 bytes
Fuente = 652 bytes
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
Haskell (162 personajes)
Una versión de arte ASCII (bastante) directa:
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]]
Salida:
$ ./a.out ......................................... ......................................... ..........................xxxx........... ..........................xxxx........... ....................x..xxxxxxxxxx........ ....................xxxxxxxxxxxxxxxxx.... ..................xxxxxxxxxxxxxxxxxxx.... .................xxxxxxxxxxxxxxxxxxxxx... .......xxxxxxx..xxxxxxxxxxxxxxxxxxxxxx... ......xxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxx... ..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..... ......xxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxx... .......xxxxxxx..xxxxxxxxxxxxxxxxxxxxxx... .................xxxxxxxxxxxxxxxxxxxxx... ..................xxxxxxxxxxxxxxxxxxx.... ....................xxxxxxxxxxxxxxxxx.... ....................x..xxxxxxxxxx........ ..........................xxxx........... ..........................xxxx........... ......................................... .........................................
Versión más legible:
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]]
Haskell (185 caracteres, con todas las características requeridas en la pregunta)
Usar números complejos y en realidad contar el número requerido de iteraciones (a diferencia de la versión "simple" en mi otra respuesta).
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
Las dimensiones de la imagen resultante se leen desde stdin. La salida está "coloreada" según el número de iteraciones requeridas:
$ ./fract 60 30 1111111111111111111111111111111111111111111111111111111111111 1111111111111112222222222222222111111111111111111111111111111 1111111112222222222222222222222222222111111111111111111111111 1111112222222222222222222222222222222222111111111111111111111 1112222222222222222222222222222222222222222111111111111111111 1222222222222222222222333333333322222222222221111111111111111 2222222222222222223333333344443333332222222222211111111111111 2222222222222233333333344458755443333322222222222111111111111 2222222222233333333344445568117544433333222222222211111111111 2222222233333333344445556711111765544333322222222221111111111 2222233333333444445562391112161568786443332222222222111111111 2223333334444455556681111111111111157544333222222222211111111 2333334445617677777911111111111111111854333222222222211111111 3333444456681131231111111111111111111654333322222222221111111 3444555671111111111111111111111111114644333322222222221111111 2569888111111111111111111111111111296544333322222222221111111 3444555671111111111111111111111111114644333322222222221111111 3333444456681131231111111111111111111654333322222222221111111 2333334445617677777911111111111111111854333222222222211111111 2223333334444455556681111111111111157544333222222222211111111 2222233333333444445562391112161568786443332222222222111111111 2222222233333333344445556711111765544333322222222221111111111 2222222222233333333344445568117544433333222222222211111111111 2222222222222233333333344458755443333322222222222111111111111 2222222222222222223333333344443333332222222222211111111111111 1222222222222222222222333333333322222222222221111111111111111 1112222222222222222222222222222222222222222111111111111111111 1111112222222222222222222222222222222222111111111111111111111 1111111112222222222222222222222222222111111111111111111111111 1111111111111112222222222222222111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111
J, salida gráfica en escala de grises con niveles, 170 caracteres.
load''viewmat''
c=:>(<:;|:;0$])((2$>:@+:)$-:%~i:)300
(2.5*|:3 99$i._99)viewmat {:99&<.@;@(({:+4&<@:({.+1&{)@:*:);~(0{c)&+@({.-1&{)@:*:,:(1{c)&+@:+:@({.*1&{))^:99 c
texto alternativo http://i40.tinypic.com/2i7lm0.jpg
J, salida gráfica con niveles, 151 caracteres.
load''viewmat''
c=:>(<:;|:;0$])((2$>:@+:)$-:%~i:)99
viewmat {:99&<.@;@(({:+4&<@:({.+1&{)@:*:);~(0{c)&+@({.-1&{)@:*:,:(1{c)&+@:+:@({.*1&{))^:99 c
Salida:
texto alternativo http://i40.tinypic.com/6ynxap.jpg
J, salida gráfica, 124 caracteres.
load''viewmat''
c=:>(<:;|:)((2$>:@+:)$-:%~i:)200
viewmat 4>:({.+{:)@:*:(5<.>@(({.c)&+@({.-{:)@:*:;({:c)&+@:+:@({.*{:)))^:999 c
Básicamente solo ejecuta "viewmat" en la salida de ASCII.
texto alternativo http://i40.tinypic.com/etv5lf.jpg
J, ASCII, 101 caracteres.
c=:>(<:;|:)((2$>:@+:)$-:%~i:)20
4>:({.+{:)@:*:(5<.>@(({.c)&+@({.-{:)@:*:;({:c)&+@:+:@({.*{:)))^:999 c
Perdió 6 caracteres para parametrizar correctamente el tamaño.
J, ASCII, 95 caracteres.
c=:>(<:;|:)41 41$10%~i:20
4>:({.+{:)@:*:(5<.>@(({.c)&+@({.-{:)@:*:;({:c)&+@:+:@({.*{:)))^:999 c
Todavía no tiene múltiples niveles de escala de grises.
Explicación (actualmente desactualizado, se actualizará más tarde):
i:20
Genere la lista de enteros de -20 a 20.
10%~i:20
Divida a todos por 10 ( %
es dividido, ~
es el orden inverso de los argumentos.
41 41$10%~i:20
Llene esta lista en una matriz 41x41, con envoltura.
(-&1;|:)41 41$`10%~i:20`
Agregue a esta matriz una segunda matriz del mismo tamaño, pero transpuesta. -&1
resta uno de cada elemento ;
es agregar, |:
está transpuesta. Ahora tenemos una matriz 2x41x41, donde la primera matriz 41x41 contiene los valores "x0" de cada coordenada y la segunda contiene los valores "y0".
4<:~({.+{:)@:*:(5<.>@(({.c)&+@:({.-{:)@:*:;({:c)&+@:+:@:({.*{:)))^:1000 ($c)$0
Guau. Vamos a separar esto de la derecha.
($c)$0
Esto crea una segunda matriz de 2x41x41 (el mismo tamaño que c), llena de ceros. Esta va a ser la variable sobre la que estamos iterando; básicamente, la primera matriz contiene los valores "x" y la segunda contiene los valores "y".
^:1000
significa "Repite lo anterior entre paréntesis 1000 veces. Este es nuestro contador de bucle.
(5<.>@(({.c)&+@:({.-{:)@:*:;({:c)&+@:+:@:({.*{:))
Este es el próximo gran pedazo. Básicamente está haciendo una iteración del ciclo. Primero generamos x con (({.c)&+@:({.-{:)@:*:
luego lo unimos a y ({:c)&+@:+:@:({.*{:)
(({.c)&+@:({.-{:)@:*:
Esto genera x (recuerde que está operando en esa matriz de 2x41x41 que representa xey). Primero cuadra *:
cada elemento, luego hace {. - {:
{. - {:
, o x ^ 2 - y ^ 2. {.
selecciona la primera matriz 41x41 y {:
la segunda. @:
une funciones juntas.
Para x ^ 2-y ^ 2, necesitamos agregar x0 - esta es la primera matriz 41x41 de c, así que podemos hacer esto con ({.c)&+
- &
curry {.c
(x0) en +
.
({:c)&+@:+:@:({.*{:)
Generamos y de manera similar. Primero multiplicamos por parejas la entrada x {.
y y {:
matrices, duplica el resultado con +:
y agrega y0 {:c
.
El último paso de esta función es simplemente 5<.>
- desempaquetar la unión de las dos nuevas matrices x e y, y ponerle un límite de 5 - está bien ya que esta función aumenta monótonamente por encima de 4, y saldremos de - limita enteros si no tapamos los valores en cada iteración.
4>:({.+{:)@:*:
El último paso, una vez que hayamos terminado de iterar. Cuadremos las matrices x e y *:
agréguelas juntas {.+{:
, Y cree una matriz booleana que sea verdadera para cada elemento que sea >:
menor que 4.
Salida:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 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
Y una entrada de dc - 152 caracteres
Mi locura habitual en 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
prueba de funcionamiento:
bash-3.2$ dc -f mandel.dc
10 20
000000000000000000000
000000000011111111111
000000001111111111111
000000111111115211111
000000111111555551111
000000555555555551111
000000111111555551111
000000111111115211111
000000001111111111111
000000000011111111111
000000000000000000000
awk - 134 135 caracteres
Arte ASCII, totalmente compatible. Traducción bastante simple de la implementación de referencia de 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=t}printf"%d",log(k)}print""}}
prueba de funcionamiento
$ awk -f mandel.awk
10 10
00000000000
00000000000
00000111000
00001116110
00011166610
00046666611
00011166610
00001116110
00000111000
00000000000
00000000000
y este es un arte VT-100 . Establezca el xterm en caracteres "ilegibles", luego pruebe con un conjunto de 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=t}printf"/x1b[4%dm ",log(k)}print"/x1b[0m"}}
Hubo una solución Perl hace algunos años publicado en perlmonks , dice:
#!/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)}
que es un "explorador de Mandelbrot".
(Gira, se acerca y se aleja, y se desplaza aleatoriamente para examinar regiones del conjunto de Mandelbrot que considere "interesantes", según su creador).
No sigue exactamente las especificaciones nombradas aquí, pero hace una entrada interesante (imho). Tal vez un simple Mandlebrot no sea muy interesante para los dioses perl; .-)
Saludos
rboo
Pitón 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],
Estoy interesado en cómo deshacerse del espacio en blanco en python.
Python 108 (era 122):
for a in range(900):print"/n.x"[(a%30>0)+(abs(reduce(lambda z,c:z*z+c,[a%30*.1-2+1j*(a/30*.1-1.5)]*30))<2)],
Ese último "30" es el recuento de iteraciones, no una de las dimensiones.
La salida se ve así:
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . . . . . . . . x . x x x x x . . . . . . . . . . . . . . . . . . . . . . . . . x x . . . . . . . . . . . . . . . . . . . . . . . . . . . x x . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . x . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ahora vamos a actualizar en base a las reglas actualizadas ...
JavaScript (168/174 caracteres)
Versión de Rhino (168 caracteres):
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(''''))}
Versión de Firebug (174 caracteres):
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(''''))}
Pitón. 98 caracteres.
for _ in range(526):z=0;exec"z=z*z+_%25*.1-2+_/25*.1j-1j;"*50;print[".#"[z.real<4],"/n"][_%25<1],
Imprime algo como esto:
. . . . . . . . . . . . . . . . . . . # . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . # # . . . . .
. . . . . . . . . . . . . . . . . # # . . . . .
. . . . . . . . . . . . . . # . # # # # # . . .
. . . . . . . . . . . . . . # # # # # # # # # .
. . . . . . . . . . . . . # # # # # # # # # # .
. . . . . . . . . . . . . # # # # # # # # # # .
. . . . . . . . # # # . # # # # # # # # # # # .
. . . . . . . # # # # # # # # # # # # # # # # .
# # # # # # # # # # # # # # # # # # # # # # . .
. . . . . . . # # # # # # # # # # # # # # # # .
. . . . . . . . # # # . # # # # # # # # # # # .
. . . . . . . . . . . . . # # # # # # # # # # .
. . . . . . . . . . . . . # # # # # # # # # # .
. . . . . . . . . . . . . . # # # # # # # # # .
. . . . . . . . . . . . . . # . # # # # # . . .
. . . . . . . . . . . . . . . . . # # . . . . .
. . . . . . . . . . . . . . . . . # # . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . # . . . .
Ruby - 139 caracteres ( compatible con 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
o como una sola línea de comando (134 caracteres incluyendo 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>ooo8oooooooooooooooooooooooo.3oooD/,''%%$$$## #######$$$$%%%%%%%%%%%%%&&&&&&'')8,,17ooooooooooooooooooooooooooooooooQ0)''&&%%$$$# $$$$$$%&)(&&&&&&&&&&&&&&&''''''((*18oooooooooooooooooooooooooooooooooooool*((''&%%$$$ $$%%%%&&*2*))((((25*((''''''((()+F>=oooooooooooooooooooooooooooooooooooooooo1.(%%$$$ %%%%%&&''()*,1o47//5o5/?,+***+3oooooooooooooooooooooooooooooooooooooooooo.)(&%%$$$ %%%%&''''''(*+-3ooooooooooom//-.oooooooooooooooooooooooooooooooooooooooooooo9+&%%$$$ &&(*+)))+-?ooooooooooooooooL5ooooooooooooooooooooooooooooooooooooooooooo8)&%%%$$$ ''()*-X=U95ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo*''&&%%%$$$ ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo:.+)(''&&%%%$$$ ''()*-X=U95ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo*''&&%%%$$$ &&(*+)))+-?ooooooooooooooooL5ooooooooooooooooooooooooooooooooooooooooooo8)&%%%$$$ %%%%&''''''(*+-3ooooooooooom//-.oooooooooooooooooooooooooooooooooooooooooooo9+&%%$$$ %%%%%&&''()*,1o47//5o5/?,+***+3oooooooooooooooooooooooooooooooooooooooooo.)(&%%$$$ $$%%%%&&*2*))((((25*((''''''((()+F>=oooooooooooooooooooooooooooooooooooooooo1.(%%$$$ $$$$$$%&)(&&&&&&&&&&&&&&&''''''((*18oooooooooooooooooooooooooooooooooooool*((''&%%$$$ #######$$$$%%%%%%%%%%%%%&&&&&&'')8,,17ooooooooooooooooooooooooooooooooQ0)''&&%%$$$# ###########$$$$$$%%%%%%%%%%&&&&''''(*1>ooo8oooooooooooooooooooooooo.3oooD/,''%%$$$## ###############$$$$$$$$$%%%%%%&&''(+3:0.,++ooE6ooooooooooo?8o1j?8)(((()4/''&%$$$### ##################$$$$$$$$$$$$%%%&''''''''''''''''''())*,6oooooooo.*)((''''&&&&&&&&%$$$##### #####################$$$$$$$$$$$$$$%%%&&&&&''''()-1oooooooo/*(''&&%%%%%%%$$$$$###### #########################$$$$$$$$$$$$$%%%%%&&''929-03ooL.+0:''&%%%%%$$$$$$$######## ############################$$$$$$$$$$$$$%%%%%&''''((*-G,*(''&&%%$$$$$$$$$########"" "###############################$$$$$$$$$$$%%%%&&'')*/))*.o&%$$$$$$$$########""""" """""###############################$$$$$$$$$%%%&''*)''&&%%%$$$$$$$#######""""""""" """""""""#################################$$$$$$$%%%%%$$$$$#########""""""""""""" """"""""""""""""#############################################""""""""""""""""""""
T-SQL ( 421 408 caracteres)
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