Let it snow()

Let it snow()

juliasnow

The code could definitely be golfed…

function snow(io = stdout)
    h, w = displaysize(io)
    iob = IOBuffer()
    ioc = IOContext(IOContext(iob, io), :displaysize=>(h,w))
    print(io, repeat("\n", h), "\e[", h, "A\e[1G") # new lines and move back up
    air = ones(Int, w, h)
    flakes = [" ", "*", "❄︎", "❅", "❆"]
    scsin(t) = ((sin(t) / 2) + 0.5) * (0.1 / 3)
    likelihood(t) = scsin(t) + scsin(t * 1.00001) + scsin(t * 0.9999)
    try
        while true
            for x in 1:w, y in h:-1:1
                air[x,y] = if y == 1 # new flakes
                    rand() < likelihood(time()) ? rand(2:length(flakes)) : 1
                elseif y == h # accumulate bottom
                    ((rand() < 0.95 && air[x,y] > 1) || (air[x, y-1] > 1 && rand() < 0.2)) ? 2 : 1
                elseif all(>(1), air[x, y:end]) # melt pile sometimes
                    rand() < 0.95 ? 2 : 1
                elseif (air[x, y-1] > 1 && all(>(1), air[x, (y+1):end])) # if flake coming and piled up below
                    rand() < 0.1 ? 2 : 1
                else # fall downwards otherwise
                    air[x, y-1]
                end
            end
            print(ioc, "\e[", h, "A\e[1G") # move back to start
            print.((ioc,), flakes[air])
            print(ioc, "\e[", h, "A\e[1G") # move back to start
            Base.banner(ioc)
            printstyled(ioc, "julia> ", color = :green, bold = true)
            println(ioc, "snow()")
            print(io, String(take!(iob)))
            sleep(1/8)
        end
    catch e
        isa(e,InterruptException) || rethrow()
    end
    nothing
end
84 Likes

❄︎❅❆ options? :rofl:

12 Likes

This is awesome! Please share it on Twitter and Tag the Julia account. I also want to set my REPL up to show this in the background when I am running code :grinning_face_with_smiling_eyes:

12 Likes

@ianshmean: https://twitter.com/JuliaLanguage/status/1470423267576008704?s=20

4 Likes

This could be a perfect Easter Egg for Julia 1.8…

EDIT: By the way, does Julia have any ?

1 Like

julia --lisp might count.

4 Likes

The first snowflakes * were falling vertically on my REPL.

However, the last ones *, ❄︎, ❅, ❆ seem to fall with strong side winds…

Aren’t the JuliaMono fonts mono-flake?

2 Likes

Might be that your terminal app is struggling with the adverse weather conditions - it looks good in my MacOS Terminal.

4 Likes

If you want to control the wind, change the width of the terminal window after starting it.
It’s a bug feature

7 Likes