fork download
  1. #!/usr/bin/python
  2.  
  3. """
  4. 26 名前:デフォルトの名無しさん[sage] 投稿日:2014/06/15(日) 21:35:27.50 ID:lBQJsMnk
  5. 地球の周りを3つの衛星が回っています
  6. 衛星Aは1時間23分かけて地球一周できます
  7. 衛星Bは3時間9分かけて地球一周できます
  8. 衛星Cは5時間45かけて地球一周できます
  9. 衛星は同じ位置にくると自動的によけてくれるので衝突して故障することはありません。速度も一定に移動します。
  10. 衛星Aは60度の位置、衛星Bは192度の位置、衛星Cは265の位置からスタートする。
  11. 3つの衛星が同じ位置に重なりあうのは何時間後か求めて出力せよ。また、重なりあうまで何周したかそれぞれ出力せよ。
  12. """
  13.  
  14. from fractions import Fraction
  15. from fractions import gcd
  16. lcm = lambda a,b: a*b/gcd(a,b)
  17.  
  18. class Satellite:
  19. def __init__(self, id, period, phase, t=0):
  20. self.name = chr(ord("A")+id)
  21. self.period = Fraction(period)
  22. self.phase = Fraction(phase)
  23. self.t = Fraction(t)
  24. def __str__(self):
  25. return "{0.name}:per={0.period},pha={0.phase},time={0.t}".format(self)
  26.  
  27. def merge(a,b):
  28. # print a,b
  29. # 古い方の時間を進める
  30. if not a.t < b.t:
  31. a, b = b, a
  32. a.phase = (a.phase + (b.t - a.t) * 360 / a.period) % 360
  33. a.t = b.t
  34.  
  35. # 追いつくまでの時間
  36. if not a.period < b.period:
  37. a, b = b, a
  38. delta = ((b.phase - a.phase) % 360) / 360 / (1/a.period - 1/b.period)
  39.  
  40. # 重なるところまで移動
  41. for s in [a, b]:
  42. s.t += delta
  43. s.phase = (s.phase + s.t * 360 / s.period) % 360
  44. # print a, b, delta
  45.  
  46. # 1つの仮想の天体として返す
  47. return Satellite(-1, lcm(a.period, b.period), a.phase, a.t)
  48.  
  49. def f26(sats_inf):
  50. sats = [Satellite(i, s[0]*60+s[1], s[2]) for (i,s) in enumerate(sats_inf)]
  51.  
  52. uni = reduce(merge, sats)
  53. print "t={}(h)\npha={}(degree)".format(float(uni.t/60), float(uni.phase))
  54. print "-"*3
  55. for s in sats:
  56. print "{0.name}:{1}(cyc)".format(s, float(uni.t / s.period))
  57.  
  58. q = [[1,23,60],[3,29,192],[5,45,265]]
  59. #q = [[3,0,60],[6,0,0],]
  60. f26(q)
  61.  
  62.  
  63.  
Success #stdin #stdout 0.13s 12208KB
stdin
Standard input is empty
stdout
t=6.07697765988(h)
pha=338.147145138(degree)
---
A:4.39299589871(cyc)
B:1.744586888(cyc)
C:1.05686567998(cyc)