2010-07-18 17 views

Respuesta

15

He hecho esto antes. La solución más simple que acabé con era un arreglo de las/los valores de clave siguientes:

120:Cap, 218:Aqu, 320:Pis, 420:Ari, 521:Tau, 
621:Gem, 722:Can, 823:Leo, 923:Vir, 1023:Lib 
1122:Sco, 1222:Sag, 1231: Cap 

A continuación, escriba la fecha de nacimiento en el formato mdd, es decir, el número de meses (a partir de 1 de enero) y dos dígitos número del día (01-31). Itere a través de la matriz, y si la fecha es menor o igual que un elemento en la matriz, tiene su signo de estrella.

EDITAR Necesitaba esto así que aquí está este concepto como una función de trabajo

zodiacs = [(120, 'Cap'), (218, 'Aqu'), (320, 'Pis'), (420, 'Ari'), (521, 'Tau'), 
      (621, 'Gem'), (722, 'Can'), (823, 'Leo'), (923, 'Vir'), (1023, 'Lib'), 
      (1122, 'Sco'), (1222, 'Sag'), (1231, 'Cap')] 
def get_zodiac_of_date(date): 
    date_number = int("".join((str(date.date().month), '%02d' % date.date().day))) 
    for z in zodiacs: 
     if date_number <= z[0]: 
      return z[1] 
+2

+1: parece la mejor solución que se puede hacer sin tener que instalar un módulo nuevo. –

+0

¿Una 'matriz' o una' dict'? – Johnsyweb

+0

Usaría un dict para eso. – Daenyth

8

Puede darles más información sobre position of the planets y las estrellas.

import ephem 
>>> u = ephem.Uranus() 
>>> u.compute('1871/3/13') 
>>> print u.ra, u.dec, u.mag 
7:38:06.27 22:04:47.4 5.46 
>>> print ephem.constellation(u) 
('Gem', 'Gemini') 
+3

En un mundo perfecto, usted sería capaz de utilizar la biblioteca para 'ephem' descubre el signo del zodíaco simplemente reemplazando a Urano con el Sol en tu ejemplo. Sin embargo, parece que los signos y las constelaciones [no coinciden exactamente] (http://en.wikipedia.org/wiki/Zodiac#Table_of_dates). También hay una biblioteca de Python específica de astrología llamada [oroboros] (http://pypi.python.org/pypi/oroboros/20080712), pero es probable que sea demasiado. –

+1

'oroboros' usa' ephem'. – fmark

7

Uso bisect es más eficiente que la iteración hasta que encuentre una coincidencia, sino una tabla de consulta para cada día del año es más rápido aún y realmente no tan grande.

from bisect import bisect 
signs = [(1,20,"Cap"), (2,18,"Aqu"), (3,20,"Pis"), (4,20,"Ari"), 
     (5,21,"Tau"), (6,21,"Gem"), (7,22,"Can"), (8,23,"Leo"), 
     (9,23,"Vir"), (10,23,"Lib"), (11,22,"Sco"), (12,22,"Sag"), 
     (12,31,"Cap")] 
def zodiac_sign(m,d): 
    return signs[bisect(signs,(m,d))][2] 

assert zodiac_sign(3,9) == "Pis" 
assert zodiac_sign(6,30) == "Can" 
2
var ZZ=[1231,1222,1122,1023,923,823,722,621,521,420,321,220,121]; 

var ZN=['Capricorn','Sagittarius','Scorpio','Libra','Virgo','Leo','Cancer', 'Gemini','Taurus','Aries','Pisces','Aquarius','Capricorn']; 

var d8=new Date(); 

var m=d8.getMonth()+1; 

var d=d8.getDate(); 

//m=1;d=1 

var mdd=parseInt(''+m+(d<9?'0'+d:d)); 

var i=0;while(ZZ[i]&gt;mdd && i&lt;ZZ.length){i++}--i; 

var RV='Born '+m+'/'+d+' - Star Sign: '+ZN[i];RV 
0

Heres mi algo sin necesidad de utilizar un bucle (JS lógica: el uso de un objeto js)

var zods = { 
      0:{limit:21,vals:["aqu","cap"]}, 
      1:{limit:20,vals:["pis","aqu"]}, 
      2:{limit:21,vals:["ari","pis"]}, 
      3:{limit:21,vals:["tau","ari"]}, 
      4:{limit:21,vals:["gem","tau"]}, 
      5:{limit:21,vals:["can","gem"]}, 
      6:{limit:22,vals:["leo","can"]}, 
      7:{limit:22,vals:["vir","leo"]}, 
      8:{limit:22,vals:["lib","vir"]}, 
      9:{limit:22,vals:["sco","lib"]}, 
      10:{limit:23,vals:["sag","sco"]}, 
      11:{limit:22,vals:["cap","sag"]} 
      }; 

     var dt = new Date(); 
     var zodObj = zods[dt.getMonth()]; 
     return dt.getDate()>=zodObj.limit?zodObj.vals[0]:zodObj.vals[1]; 
Cuestiones relacionadas