Created
December 27, 2020 20:02
-
-
Save Zorgatone/7f00954030973d58334e2a1bfd1547c3 to your computer and use it in GitHub Desktop.
Planets in Elixir
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
defmodule Planet do | |
defstruct [:x, :y] | |
def gen_planet(x, y) do | |
xr = rem x, 7 | |
yr = rem y, 11 | |
if x > 4 and y > 8 and xr > 3 and xr < 6 and rem(yr, xr) === 1 do | |
%Planet{x: x, y: y} | |
else | |
nil | |
end | |
end | |
end | |
defmodule Octree do | |
defmodule Cube do | |
defstruct [:size, :cx, :cy, :children] | |
end | |
defmodule Children do | |
defstruct [:tr, :tl, :br, :bl] | |
end | |
def empty?(%Octree.Cube{children: children}) do | |
empty? children | |
end | |
def empty?(%Octree.Children{tr: tr, tl: tl, br: br, bl: bl}) do | |
tr === nil and tl === nil and br === nil and bl === nil | |
end | |
end | |
defmodule Generate do | |
def gen(cube = %Octree.Cube{size: size, cx: cx, cy: cy}) when size === 1 do | |
children = %Octree.Children{ | |
tr: Planet.gen_planet(cx, cy), | |
tl: Planet.gen_planet(cx - 1, cy), | |
br: Planet.gen_planet(cx, cy - 1), | |
bl: Planet.gen_planet(cx - 1, cy - 1) | |
} | |
if Octree.empty? children do | |
nil | |
else | |
Map.put( | |
cube, | |
:children, | |
children | |
) | |
end | |
end | |
def gen(%Octree.Cube{size: size, cx: cx, cy: cy}) when size > 1 do | |
half_size = div size, 2 | |
cube = %Octree.Cube{ | |
size: size, | |
cx: cx, | |
cy: cy, | |
children: %Octree.Children{ | |
tr: Generate.gen(%Octree.Cube{size: half_size, cx: cx + half_size, cy: cy + half_size}), | |
tl: Generate.gen(%Octree.Cube{size: half_size, cx: cx - half_size, cy: cy + half_size}), | |
br: Generate.gen(%Octree.Cube{size: half_size, cx: cx + half_size, cy: cy - half_size}), | |
bl: Generate.gen(%Octree.Cube{size: half_size, cx: cx - half_size, cy: cy - half_size}) | |
} | |
} | |
if Octree.empty? cube do | |
nil | |
else | |
cube | |
end | |
end | |
def gen(_) do | |
raise ArgumentError, "Invalid cube!" | |
end | |
end | |
defmodule Main do | |
def main do | |
planets = Generate.gen(%Octree.Cube{size: 32, cx: 0, cy: 0}) | |
IO.inspect planets | |
end | |
end | |
Main.main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment