Skip to content

Mandelbrot set 🌀

Tip

Solution to the following problem:

Result Set

Regardless of the database, the result set should be a single cell with a value looking something like:

                       ••
                       ••
                      •••
                   ••••••••• •
                  •••••••••••
                  ••••••••••••
                 ••••••••••••••
           •••  ••••••••••••••
           •••• ••••••••••••••
          ••••••••••••••••••••
•••••••••••••••••••••••••••••
          ••••••••••••••••••••
           •••• ••••••••••••••
           •••  ••••••••••••••
                 ••••••••••••••
                  ••••••••••••
                  •••••••••••
                   ••••••••• •
                      •••
                       ••
                       ••
Expand for the DDL
solution(mandelbrot_set) as (
    select concat_ws(e'\n',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                       ••                          ',
        '                       ••                          ',
        '                      •••                          ',
        '                   ••••••••• •                     ',
        '                  •••••••••••                      ',
        '                  ••••••••••••                     ',
        '                 ••••••••••••••                    ',
        '           •••  ••••••••••••••                     ',
        '           •••• ••••••••••••••                     ',
        '          ••••••••••••••••••••                     ',
        '•••••••••••••••••••••••••••••                      ',
        '          ••••••••••••••••••••                     ',
        '           •••• ••••••••••••••                     ',
        '           •••  ••••••••••••••                     ',
        '                 ••••••••••••••                    ',
        '                  ••••••••••••                     ',
        '                  •••••••••••                      ',
        '                   ••••••••• •                     ',
        '                      •••                          ',
        '                       ••                          ',
        '                       ••                          ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   ',
        '                                                   '
    )
)

Success

If you want to see a more interesting solution which "colours" the points based on how quickly they diverge, you can find it at:

Solution

Some SQL solutions per database are provided below.

DuckDB

with recursive

axis as (
    select generate_series / 100 as i
    from generate_series(-200, 200, 8)
),

grid as (
    select x.i as x, y.i as y,
    from axis as x, axis as y
),

apply_calculation as (
        /* define the set of complex points (c = (x, y), z = (a, b)) */
        select
            x,
            y,
            000.0000 as a,
            000.0000 as b,
            0 as i,
        from grid
    union all
        /* apply the mandelbrot set formula */
        select
            x,
            y,
            a^2 - b^2 + x,
            2 * a * b + y,
            i + 1,
        from apply_calculation
        where 1=1
            and (abs(a), abs(b)) <= (2, 2)
            and i < 100
),

mandelbrot_set as (
    select
        grid.x,
        grid.y,
        if(apply_calculation.i is not null, '•', ' ') as in_set
    from grid
        left join apply_calculation
            on  grid.x = apply_calculation.x
            and grid.y = apply_calculation.y
            and apply_calculation.i = 100
)

select string_agg(x_rows, e'\n' order by y) as mandelbrot_set
from (
    select
        y,
        string_agg(in_set, '' order by x) as x_rows
    from mandelbrot_set
    group by y
)