Qual'è il tuo segno zodiacale?


14

Scrivi un programma che prende una data di nascita (mese e giorno del mese) come input e genera il segno, l'elemento e la qualità dello zodiaco occidentale corrispondenti . Ai fini di questa sfida, questi sono definiti esattamente come nella tabella nella pagina Wikipedia collegata:

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

Regole

  • Il segno, l'elemento e la qualità saranno calcolati dalla data di input esattamente secondo la tabella di Wikipedia.
  • Sto dando una certa libertà sul formato della data di input (vedere la sezione Input di seguito). È necessario indicare chiaramente nella risposta quale formato si sta utilizzando.
  • Se viene fornita una data non valida (data non analizzabile, o mese o giorno del mese fuori intervallo), il programma uscirà con il messaggio Invalid date.
  • Il programma deve gestire correttamente gli anni bisestili. cioè se il 29 febbraio è l'input, allora l'output deve essere correttamente Pisces, Water, Mutable.
  • Le librerie / API della data della tua lingua sono consentite, ma tutte le API che calcolano specificamente i segni dello zodiaco sono vietate.
  • "Scappatoie" standard che non sono più divertenti
  • Questo è , quindi vince la risposta più breve in byte.

Ingresso

  • Il programma può leggere la data di input da STDIN, dalla riga di comando, dalle variabili di ambiente o da qualunque metodo sia conveniente per la tua lingua preferita.
  • Questo non è principalmente un esercizio di analisi dei dati, quindi la stringa di input può essere fornita in qualunque formato tu scelga, purché sia ​​composta solo da componenti del mese e del giorno del mese e non di altri valori (come l'anno o l'ora) . Ad esempio Jul 24o 24th of Julyo 7/24o 24/07o qualsiasi formato sia conveniente. Se viene immesso un input che non corrisponde alla scelta del formato di input, è Invalid datenecessario generare l' errore.

Produzione

  • Il programma verrà trasmesso su STDOUT, finestra di dialogo o qualsiasi altro metodo di visualizzazione sia conveniente per la tua lingua preferita.
  • Il formato di output sarà il segno, l'elemento e la qualità separati da una virgola e uno spazio: Sign, Element, Quality

Esempi

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

È richiesto il rilevamento / avviso di una data non valida? In tal caso, possiamo supporre che i numeri non validi inseriti dall'utente saranno maggiori di zero? (Suppongo che la maggior parte delle persone userà un formato data numerico.)
Level River St

1
@steveverrill Penso di averlo chiarito nel terzo elemento delle regole, ma ho modificato la sezione Input per chiarire. TLDR input valido => output valido; input non valido => messaggio di errore; nessun "comportamento indefinito" consentito per ogni dato input.
Trauma digitale

è consentita una data completa? giorni, mesi e anni?
Teun Pronk,

@TeunPronk No, solo mese e giorno del mese. Ho chiarito la regola di input.
Trauma digitale il

Il giorno dell'anno (ad es Jan 21 -> 21. Feb 5 -> 36) È un formato di input valido?
Mego,

Risposte:


8

JavaScript, 285 byte

(La mia prima risposta qui dopo essere in agguato qui per un po ')

d=prompt(m=prompt(e='MutableCardinalFixedAirWaterFireEarthCapricornAquariusPiscesAriesTaurusGeminiCancerLeoVirgoLibraScorpioSagittarius'.match(/[A-Z][a-z]+/g)));alert(m>0&m<13&d>0&d<29-~'202121221212'[--m]?e[n=7+m%12+(d>18-~'121012333413'[m])]+', '+e[n%4+3]+', '+e[n%3]:'Invalid date')

Il primo prompt()è il mese in forma numerica e il secondo prompt()è il giorno del mese (ignora il testo del prompt). Gli zeri iniziali sono opzionali per entrambi. L'output viene visualizzato conalert() . (Grazie a bitpwner, Snack, edc65 e core1024 per aver contribuito ad abbreviare il codice.)

Provalo sopra usando Stack Snippet o su http://jsfiddle.net/8vq89/5/ .

Codice con spazi bianchi e commenti per spiegare le parti confuse aggiunte:

var m = prompt(), d = prompt(),
e = 'MutableCardinalFixedAirWaterFireEarthCapricornAquariusPiscesAries\
TaurusGeminiCancerLeoVirgoLibraScorpioSagittarius'.match(/[A-Z][a-z]+/g);
alert(m > 0 && m < 13 && d > 0
      & d < 29 - ~'202121221212'[--m] /* ~ is bitwise NOT, which yields -(x + 1). It also
                                         converts a string to a number. Subtracting that
                                         number from 29 gives the number of days in the
                                         month given. */
      ? e[n = 7 + // 7 is added to skip over the 7 qualities and elements in array e.
      m % 12 // The modulus allows dates near the end of December to wrap around to January.
      + (d > 18 - ~'121012333413'[m])] + ', ' +
      e[n % 4 + 3] + /* Qualities and elements follow a pattern, so the modulus determines
                        which one it is. 3 is added to skip over the 3 qualities. */
      ', ' + e[n % 3] : 'Invalid date')

1
Per 'Cardinal0Fixed0Mutable'.split(0)e 'Earth0Air0Water0Fire'.split(0), ['Cardinal','Fixed','Mutable']ed ['Earth','Air','Water','Fire']è un po 'più corto.
Fai uno spuntino il

Ho avuto una soluzione, ma troppo simile: 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']). Dai un'occhiata alla singola divisione
edc65,

@ edc65 Ottengo un Invalid left-hand side in assignmenterrore quando provo a eseguirlo, probabilmente a che fare con il prompt
NinjaBearMonkey

l'assegnazione di gruppo è Ecmascript 6, funziona solo su Firefox. p=prompt().split(/\D/),m=p[0],d=p[1]dovrebbe funzionare (ma così a lungo)
edc65

3
Puoi renderlo ancora più breve se usi '...ScorpioSagittarius'.match(/[A-Z][a-z]+/g)invece di'...Scorpio0Sagittarius'.split(0)
core1024

3

C 353 352

Modifica Bug e refuso corretti, 1 carattere in più

Prima di chiedere: sì, anche senza #include è valido e funziona in C standard.
Formato di input: due numeri, primo mese, quindi giorno.

char*s[]={"Air","Water","Fire","Earth","Fixed","Mutable","Cardinal","Aquarius","Pisces","Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn"};
main(m,d){
  scanf("%d%d",&m,&d);
  m>0&m<13&d>0&d<(32-(4460832>>m>>m&3))
  ?m+=10+(" 121012333413"[m]-29<d),printf("%s, %s, %s\n",s[m%12+7],s[m%4],s[m%3+4])
  :puts("Invalid date");
}

Test

char*s[]={"Air","Water","Fire","Earth","Fixed","Mutable","Cardinal","Aquarius","Pisces","Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn"};
char *test(char *o, int m, int d)
{
  char *result=o;
  m>0&m<13&d>0&d<(32-(4460832>>m>>m&3))
  ?m+=10+(" 121012333413"[m]-29<d),sprintf(o, "%s, %s, %s\n",s[m%12+7],s[m%4],s[m%3+4])
  :(result = 0);
  return result;
}

int main()
{
  char buf[100];
  int m,d;
  for (m=0;m<14;m++)
    for(d=0;d<40;d++)
      if (test(buf, m,d)) printf("%d %d %s", m, d, buf);
  return 0;
}

Bene, tranne per l'errore di battitura di Ivalid;-)
Digital Trauma,

@DigitalTrauma Non così buono, forse ha un bug sull'inizio del segno discriminante (21,20,24 ecc.). Lo sto rivedendo proprio ora. Resta sintonizzato
edc65, il

2

Perl 287 (286 + 1 per la -pbandiera)

/\//;$_=32-(26830452>>$`*2&3)<$'|$'<1|$`<1|$`>12?'Invalid date
':qw(Aquarius01 Pisces23 Aries45 Taurus61 Gemini03 Cancer25 Leo41
Virgo63 Libra05 Scorpio21 Sagittarius43
Capricorn65)[$`-1-($'<20+(219503166088>>$`*3&7))].$/;s/\d/', '.qw(Air
Fixed Water Mutable Fire Cardinal Earth)[$&]/eg

L'ingresso proviene da STDIN e l'uscita passa a STDOUT. Ecco i test dell'OP:

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

1

Python, 447 387 caratteri

import sys
try:S=sys.argv[1];a,b=int(S[:2])-1,int(S[3:])
except:a=b=0
print['Invalid date',', '.join((s.split()*5)[a+(b>[20,21,20,19,20,21,22,22,22,23,20,22][a%12])]for s in"Capricorn Aquarius Pisces Aries Taurus Gemini Cancer Leo Virgo Libra Scorpio Sagittarius Capricorn|Earth Air Water Fire|Cardinal Fixed Mutable".split("|"))][-1<a<12and 0<b<[32,30,32,31,32,31,32,32,31,32,31,32][a]]

Accetta input come MM / GG, deve sempre essere di due cifre.

$ python zods.py 01/01
Capricorn, Earth, Cardinal
$ python zods.py 02/29
Pisces, Water, Mutable
$ python zods.py 07/24
Leo, Fire, Fixed
$ python zods.py 13/01
Invalid date
$ python zods.py 02/31
Invalid date
$ python zods.py -1/-1
Invalid date
$ python zods.py First of golfember
Invalid date
$ python zods.py
Invalid date

1
Puoi provare questi: [20,21,20,19,20,21,22,22,22,23,20,22][a%12]-> 19+int('121012333413'[a%12]) e [32,30,32,31,32,31,32,32,31,32,31,32][a]->30+int('202121221212'[a])
Vectorized

1

Javascript, 403 396 byte

M=prompt(),D=+prompt(),i=[52,85,117,147,180,213,246,278,310,343,372,406,415];if([0,0,-2,0,1,0,1,0,0,1,0,1,0][M]<D-31||M<1||D<1||M>12)alert("Invalid date");else for(x in i)if(M*32+D<=i[x]){alert("Capricorn0Aquarius0Pisces0Aries0Taurus0Gemini0Cancer0Leo0Virgo0Libra0Scorpio0Sagittarius0Capricorn".split(0)[x]+", "+["Earth","Air","Water","Fire"][x%4]+", "+["Cardinal","Fixed","Mutable"][x%3]);break}

Un altro approccio. Penso di poter giocare a golf più in basso, ma più tardi.

Immettere il mese al primo prompt, la data al secondo prompt.


1

PHP - 294 byte (senza tag php *)

* Come ha fatto l'altra voce php

Input: Month Daycome numeri interi, zero iniziale non richiesto.

Es .: php starsign.php <<< "2 29"per il 29 febbraio.

Golf (non copiarlo direttamente, vedi sotto):

<?@eval(gzinflate('=Œ1Â0…ÿŠC!Ë
¦q+JQ—
BEq¸¶¡Ô¤^ðç{¤"ï>/Ãò®`³GOBqú7v¥±MP#äpúµ;$:Å€Ý$“g¦Þ³ƒê‘).p¦¥·TL’Œ,ÝѾȑ¬]oëáJ<zh¨c„V3yhq¤VË_ü(²®TZË¥ØêܳÓF_'));die(fscanf(STDIN,'%u%u',$m,$d)/2&$m<13&&$m*$d&&$d<33-$b[$m]?$a[7+$m-=$d<20+$b[$m+9]].$a[$m%4].$a[$m%3+4]:'Invalid date');

Hexdump del file php:

3f3c 6540 6176 286c 7a67 6e69 6c66 7461
2865 3d27 318c c20b 1030 ff85 438a cb21
a60d 2b71 4a1d 9751 420a 0745 b871 a1b6
d41e 5ea4 f013 7be7 22a4 ef07 1e3e 2f8f
f2c3 60ae 47b3 4f0e 4205 7115 37fa 760c
03a5 4db1 2350 e40f fa70 1fb5 243b c53a
dd80 9324 671a dea6 83b3 1dea 2991 702e
a5a6 0bb7 4c54 1792 2c8c d1dd c8be ac91
6f5d 1a19 e1eb 3c4a 687a 63a8 5684 3304
6879 a471 5610 5fcb 28fc aeb2 5a54 9d1b
a5cb ead8 18dc d3b3 1546 275f 2929 643b
6569 6628 6373 6e61 2866 5453 4944 2c4e
2527 2575 2775 242c 2c6d 6424 2f29 2632
6d24 313c 2633 2426 2a6d 6424 2626 6424
333c 2d33 6224 245b 5d6d 243f 5b61 2b37
6d24 3d2d 6424 323c 2b30 6224 245b 2b6d
5d39 2e5d 6124 245b 256d 5d34 242e 5b61
6d24 3325 342b 3a5d 4927 766e 6c61 6469
6420 7461 2765 3b29

Per generare il file golf, eseguire il seguente script php (genera in starsign.php):

<?php
$a=<<<'NOW'
$a=[', Earth',', Air',', Water',', Fire',', Cardinal',', Fixed',', Mutable',Capricorn,Aquarius,Pisces,Aries,Taurus,Gemini,Cancer,Leo,Virgo,Libra,Scorpio,Sagittarius,Capricorn];$b='1131212112121012333413';
NOW;
$p = '<?@eval(gzinflate(\'';
$s = <<<'NOW'
'));die(fscanf(STDIN,'%u%u',$m,$d)/2&$m<13&&$m*$d&&$d<33-$b[$m]?$a[7+$m-=$d<20+$b[$m+9]].$a[$m%4].$a[$m%3+4]:'Invalid date');
NOW;
file_put_contents('starsign.php',$p . gzdeflate($a) . $s);

Versione completamente non golfata:

<?php
$a=[', Earth',', Air',', Water',', Fire',', Cardinal',', Fixed',', Mutable',Capricorn,Aquarius,Pisces,Aries,Taurus,Gemini,Cancer,Leo,Virgo,Libra,Scorpio,Sagittarius,Capricorn];$b='1131212112121012333413';
if(fscanf(STDIN, '%u%u', $m, $d) == 2
 and $m < 13
 and $m 
 and $d
 and $d < 33-$b[$m]){
    if($d < 20 + $b[$m+9])
        --$m;
    die($a[7+$m] . $a[$m%4] . $a[$m%3+4]);
}else die('Invalid date');

Alla fine ho capito che ho bisogno di modificare /etc/php5/cli/php.ini e di impostarlo short_open_tag = Onper farlo funzionare. Funziona per questa risposta, ma l'altra risposta PHP continua a fuoriuscire. +1 per questo.
Digital Trauma,

1

Python 3 - 332 byte

s="Capricorn Aquarius Pisces Aries Taurus Gemini Cancer Leo Virgo Libra Scorpio Sagittarius Earth Air Water Fire Cardinal Fixed Mutable".split()
import sys
try:m,d=map(int,sys.argv[1:]);13>m>0<d<b" 313232332323"[m]-19or E
except:x="Invalid date"
else:i=m-1+(d>b" 121012333413"[m]-29);x=s[i%12]+", "+s[-7+i%4]+", "+s[-3+i%3]
print(x)
  • Accetta input come argomenti separati (ad es. 1 1)

  • Una divisione per tutte le stringhe

  • Indicizzare i byte in py3 dà l'ord

  • or Eè un modo economico per generare un'eccezione ( NameError)

  • C'è un modo più economico per concatenare le stringhe? +e i letterali si sono rivelati più piccoli di join.

  • Non c'è motivo per cui la ricerca di un byte inizi con 1 e l'altra con 0, ho appena dimenticato il 29-day di febbraio e ho cambiato 0-> 1 invece di rifare il tutto.


0

PHP 548 524 502 419 (senza tag php)

Richiede PHP> = 5.4.0

Ingresso: Day Month (valore numerico che inizia da 1) ad es. 2 3Per il 2 marzo.

<?
$x='Invalid date';
@list($d,$m)=split(' ',fgets(STDIN));
if(@$m<1||$m>12||@$d<1)die($x);
$z=['Aquarius','Pisces','Aries','Taurus','Gemini','Cancer','Leo','Virgo','Libra','Scorpio','Sagittarius','Capricorn','Air','Water','Fire','Earth','Fixed','Mutable','Cardinal','121012333413202121221212'];
$m=$m+0;$d<$z[19][--$m]+20&&$m--;$m<0&&$m=11;$d>$z[19][$m+12]+29&&die($x);
echo$z[$m+0],", {$z[$m%4+12]}, {$z[$m%3+16]}";

MODIFICARE: l' A non well formed numeric valueavviso è causato dall'esecuzione di un pre-incremento sulla stringa $m. Indipendentemente dall'avviso, il seguente output dovrebbe essere ancora corretto. Questo avviso varia a seconda della versione di PHP. Per risolvere questo problema, una semplice conversione da stringa a intero deve essere posizionata prima dell'ultima riga. Ho aggiornato il codice con le conversioni.

Esempio di input / output (su Windows):

// March 2nd
Input > echo 2 3 | php star.php
Output > Pisces, Water, Mutable

// Feb. 30th
Input > echo 30 2 | php star.php
Output > Invalid date

// June 30th
Input > echo 30 6 | php star.php
Output > Cancer, Water, Cardinal

OK, sono un manichino php. Come si esegue questo? Ci ho provato echo 2 3 | php -f zod.php, ma fa eco alla sceneggiatura stessa di STDOUT
Digital Trauma,

1
@DigitalTrauma Penso che devi abilitare i tag brevi nel tuo interprete, altrimenti usa <?phpinvece di <?.
core1024,

Ci ho provato, ma ora capisco PHP Notice: A non well formed numeric value encountered in /home/ubuntu/zod.php on line 6. Sto eseguendo php 5.5.9 su Ubuntu 14.04
Digital Trauma il

Codice fisso Vedi modifica.
Noahnu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.