Skip to content

Instantly share code, notes, and snippets.

@DomNomNom
Last active April 10, 2016 11:17
Show Gist options
  • Select an option

  • Save DomNomNom/0a541709febe0d2c52e76d7cb3d26599 to your computer and use it in GitHub Desktop.

Select an option

Save DomNomNom/0a541709febe0d2c52e76d7cb3d26599 to your computer and use it in GitHub Desktop.
Programming puzzle: Average direction on a circle
def enforce0to360range(angle):
"""Converts the given angle (degrees) into the range [0 360).
>>> enforce0to360range(30)
30.0
>>> enforce0to360range(180)
180.0
>>> enforce0to360range(360)
0.0
>>> enforce0to360range(390.0)
30.0
>>> enforce0to360range(9001)
1.0
>>> enforce0to360range(-30)
330.0
>>> enforce0to360range(-390)
330.0
>>> enforce0to360range(-9000.5)
359.5
"""
return angle % 360.0 # yay, sensible modulo definition in the language
def enforce180to180range(angle):
"""Converts the given angle (degrees) into the range (-180 180].
>>> enforce180to180range(30)
30.0
>>> enforce180to180range(180.0)
180.0
>>> enforce180to180range(-180)
180.0
>>> enforce180to180range(360)
0.0
>>> enforce180to180range(390.0)
30.0
>>> enforce180to180range(9001)
1.0
>>> enforce180to180range(-30)
-30.0
>>> enforce180to180range(-390)
-30.0
>>> enforce180to180range(-9000.5)
-0.5
"""
return -enforce0to360range(180.0-angle) + 180.0
def circularAverage(angles):
""" Returns the angle that is in the central position around a circle.
Angles are specified in degrees.
>>> enforce0to360range(circularAverage([0, 0, 90]))
30.0
>>> enforce0to360range(circularAverage([60, 60, 330]))
30.0
>>> enforce0to360range(circularAverage([90, 180, 270]))
180.0
>>> abs(enforce180to180range(circularAverage([0, 0, 180]))) # 2/3 towards 0
60.0
>>> abs(enforce180to180range(circularAverage([90, 270]) + 90))
90.0
"""
return 30 # left as an exercise to the reader
if __name__ == '__main__':
import doctest
doctest.testmod()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment