Escriba un programa que tome una fecha de nacimiento (mes y día del mes) como entrada y haga salir el signo, elemento y calidad correspondientes del zodiaco occidental . Para los propósitos de este desafío, estos se definen exactamente como en la tabla en la página de Wikipedia vinculada:
Sign           Date Range                    Element    Quality
Aries          March 21 to April 19          Fire       Cardinal
Taurus         April 20 to May 20            Earth      Fixed
Gemini         May 21 to June 21             Air        Mutable
Cancer         June 22 to July 22            Water      Cardinal
Leo            July 23 to August 22          Fire       Fixed
Virgo          August 23 to September 22     Earth      Mutable
Libra          September 23 to October 23    Air        Cardinal
Scorpio        October 24 to November 20     Water      Fixed
Sagittarius    November 21 to December 22    Fire       Mutable
Capricorn      December 23 to January 20     Earth      Cardinal
Aquarius       January 21 to February 21     Air        Fixed
Pisces         February 22 to March 20       Water      Mutable
Reglas
- El signo, el elemento y la calidad se calcularán a partir de la fecha de entrada exactamente de acuerdo con la tabla de wikipedia.
- Estoy dando algo de libertad sobre el formato de fecha de entrada (ver la sección de Entrada a continuación). Debe indicar claramente en su respuesta qué formato está utilizando.
- Si se proporciona una fecha no válida (fecha no analizable, o mes o día del mes fuera de rango), el programa se cerrará con el mensaje Invalid date.
- El programa debe manejar correctamente los años bisiestos. es decir, si el 29 de febrero es la entrada, la salida debe ser correctamente Pisces, Water, Mutable.
- Las bibliotecas de fechas / API de su idioma están permitidas, pero cualquier API que calcule específicamente los signos del zodiaco está prohibida.
- "Lagunas" estándar que ya no son divertidas
- Este es el código de golf , por lo que gana la respuesta más corta en bytes.
Entrada
- El programa puede leer la fecha de entrada de STDIN, línea de comandos, variables de entorno o cualquier método que sea conveniente para el idioma que elija.
- Este no es principalmente un ejercicio de análisis de fechas, por lo que la cadena de entrada puede proporcionarse en el formato que elija, siempre que consista solo en componentes de mes y día del mes y no en otros valores (como año u hora) . Por ejemplo, Jul 24o24th of Julyo7/24o24/07o cualquier formato que sea conveniente. Si se ingresa una entrada que no coincide con su elección de formato de entrada, seInvalid datedebe arrojar el error.
Salida
- El programa saldrá a STDOUT, cuadro de diálogo o cualquier método de visualización que sea conveniente para el idioma que elija.
- El formato de salida será el signo, el elemento y la calidad separados por una coma y un espacio: Sign, Element, Quality
Ejemplos
Input                 Output
1/1                   Capricorn, Earth, Cardinal
2/29                  Pisces, Water, Mutable
7/24                  Leo, Fire, Fixed
13/1                  Invalid date
2/31                  Invalid date
-1/-1                 Invalid date
1st of Golfember      Invalid date
                    
                        code-golf
                                kolmogorov-complexity
                                date
                                
                    
                    
                        Trauma digital
fuente
                
                fuente

Jan 21 -> 21. Ej .Feb 5 -> 36) Un formato de entrada válido?Respuestas:
JavaScript, 285 bytes
(Mi primera respuesta aquí después de estar al acecho aquí por un tiempo)
El primero
prompt()es el mes en forma numérica y el segundoprompt()es el día del mes (ignore el texto de la solicitud). Los ceros iniciales son opcionales para ambos. La salida se muestra conalert(). (Gracias a bitpwner, Snack, edc65 y core1024 por ayudar a acortar el código).Pruébelo más arriba usando fragmentos de pila o en http://jsfiddle.net/8vq89/5/ .
Código con espacios en blanco y comentarios para explicar las partes confusas agregadas:
fuente
'Cardinal0Fixed0Mutable'.split(0)y'Earth0Air0Water0Fire'.split(0),['Cardinal','Fixed','Mutable']y['Earth','Air','Water','Fire']es un poco más corto.z='Air9Water9Fire9Earth9Fixed9Mutable9Cardinal9Aquarius9Pisces9Aries9Taurus9Gemini9Cancer9Leo9Virgo9Libra9Scorpio9Sagittarius9Capricorn'.split(9); [m,d]=prompt().split(/\D/); alert([m-->0&m<12&d>0&d<(32-'020101001010'[m])?z[(m+=(18-~'121012333413'[m]<d)+11)%12+7]+', '+z[m%4]+', '+z[m%3+4]:'Invalid date']). Eche un vistazo a la división individualInvalid left-hand side in assignmenterror cuando intento ejecutar eso, probablemente tenga que ver con el avisop=prompt().split(/\D/),m=p[0],d=p[1]debería funcionar (pero mucho más)'...ScorpioSagittarius'.match(/[A-Z][a-z]+/g)lugar de'...Scorpio0Sagittarius'.split(0)C 353
352Editar error y error tipográfico, 1 char más
Antes de preguntar: sí, incluso sin #include es válido y funciona el estándar C.
Formato de entrada: dos números, primer mes, luego día.
Prueba
fuente
Ivalid;-)Perl 287 (286 + 1 para la
-pbandera)La entrada es de STDIN y la salida va a STDOUT. Aquí están las pruebas de OP:
fuente
Python,
447387 caracteresToma la entrada como MM / DD, siempre debe tener dos dígitos.
fuente
[20,21,20,19,20,21,22,22,22,23,20,22][a%12]->19+int('121012333413'[a%12])y[32,30,32,31,32,31,32,32,31,32,31,32][a]->30+int('202121221212'[a])Javascript,
403396 bytesOtro enfoque. Creo que puedo jugar más al golf, pero más tarde.
Ingrese el mes en el primer aviso, la fecha en el segundo aviso.
fuente
PHP - 294 bytes (sin etiquetas php *)
* Como lo hizo la otra entrada de php
Entrada:
Month Daycomo enteros, no se requiere cero inicial.Ej:
php starsign.php <<< "2 29"para el 29 de febrero.Golfizado (no copie esto directamente, ver más abajo):
Hexdump del archivo php:
Para generar el archivo golfed, ejecute el siguiente script php (genera a
starsign.php):Versión completamente sin golf:
fuente
short_open_tag = Onpara que funcione. Funciona para esta respuesta, pero la otra respuesta de PHP todavía tiene errores. +1 para este.Python 3 - 332 bytes
Toma datos como argumentos separados (es decir
1 1)Una división para todas las cuerdas
La indexación de bytes en py3 da el ord
or Ees una forma barata de generar una excepción (NameError)¿Hay alguna forma más barata de concatenar las cadenas?
+y los literales resultaron ser más pequeños quejoin.No hay una buena razón para que una búsqueda de bytes comience con 1 y la otra con 0, simplemente olvidé el 29 de febrero y cambié 0-> 1 en lugar de rehacer todo.
fuente
PHP
548524502419 (sin etiquetas php)Requiere PHP> = 5.4.0
Entrada:
Day Month(valor numérico a partir de 1), por ejemplo,2 3para el 2 de marzo.EDITAR: El
A non well formed numeric valueaviso se produce al realizar un incremento previo en la cadena$m. Independientemente de la notificación, la siguiente salida aún debería ser correcta. Este aviso varía según la versión dePHP. Para solucionar esto, se debe colocar una conversión simple de cadena a entero antes de la segunda última línea. He actualizado el código con las conversiones.Entrada / salida de muestra (en Windows):
fuente
echo 2 3 | php -f zod.php, pero solo hace eco del guión en STDOUT<?phplugar de<?.PHP Notice: A non well formed numeric value encountered in /home/ubuntu/zod.php on line 6. Estoy ejecutando php 5.5.9 en Ubuntu 14.04