Skip to content

Instantly share code, notes, and snippets.

@jmettraux
Created August 1, 2011 00:57
Show Gist options
  • Save jmettraux/1117409 to your computer and use it in GitHub Desktop.
Save jmettraux/1117409 to your computer and use it in GitHub Desktop.
# public enum Planet {
# MERCURY (3.303e+23, 2.4397e6),
# VENUS (4.869e+24, 6.0518e6),
# EARTH (5.976e+24, 6.37814e6),
# MARS (6.421e+23, 3.3972e6),
# JUPITER (1.9e+27, 7.1492e7),
# SATURN (5.688e+26, 6.0268e7),
# URANUS (8.686e+25, 2.5559e7),
# NEPTUNE (1.024e+26, 2.4746e7);
#
# private final double mass; // in kilograms
# private final double radius; // in meters
# Planet(double mass, double radius) {
# this.mass = mass;
# this.radius = radius;
# }
# private double mass() { return mass; }
# private double radius() { return radius; }
#
# // universal gravitational constant (m3 kg-1 s-2)
# public static final double G = 6.67300E-11;
#
# double surfaceGravity() {
# return G * mass / (radius * radius);
# }
# double surfaceWeight(double otherMass) {
# return otherMass * surfaceGravity();
# }
# public static void main(String[] args) {
# if (args.length != 1) {
# System.err.println("Usage: java Planet <earth_weight>");
# System.exit(-1);
# }
# double earthWeight = Double.parseDouble(args[0]);
# double mass = earthWeight/EARTH.surfaceGravity();
# for (Planet p : Planet.values())
# System.out.printf("Your weight on %s is %f%n",
# p, p.surfaceWeight(mass));
# }
# }
class Planet
G = 6.67300E-11;
attr_reader :name, :mass, :radius
def initialize(name, mass, radius)
@name = name
@mass = mass
@radius = radius
(@@planets ||= []) << self
end
def surface_gravity
G * @mass / (@radius * @radius);
end
def surface_weight(other_mass)
other_mass * surface_gravity
end
def self.all
@@planets
end
def self.each(&block)
@@planets.each(&block)
end
def self.[](name)
@@planets.find { |pl| pl.name == name }
end
end
Planet.new('Mercury', 3.303e+23, 2.4397e6)
Planet.new('Venus', 4.869e+24, 6.0518e6)
Planet.new('Earth', 5.976e+24, 6.37814e6)
Planet.new('Mars', 6.421e+23, 3.3972e6)
Planet.new('Jupiter', 1.9e+27, 7.1492e7)
Planet.new('Saturn', 5.688e+26, 6.0268e7)
Planet.new('Uranus', 8.686e+25, 2.5559e7)
Planet.new('Neptune', 1.024e+26, 2.4746e7)
if ARGV.length < 1
STDERR.puts("Usage: ruby planet.rb <earth_weight>")
end
earth_weight = ARGV[0].to_f
mass = earth_weight / Planet['Earth'].surface_gravity
Planet.each do |planet|
puts "your weight on #{planet.name} is #{planet.surface_weight(mass)}"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment