Jaki jest Twój znak zodiaku?


14

Napisz program, który pobiera datę urodzenia (miesiąc i dzień miesiąca) jako dane wejściowe i wyświetla odpowiedni znak, element i jakość zachodniego zodiaku . Na potrzeby tego wyzwania są one zdefiniowane dokładnie tak, jak w tabeli na powiązanej stronie wikipedii:

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

Zasady

  • Znak, element i jakość zostaną obliczone na podstawie daty wprowadzenia dokładnie zgodnie z tabelą wikipedia.
  • Daję swobodę w zakresie formatu daty wejściowej (patrz sekcja Wprowadzanie poniżej). Musisz jasno określić w swojej odpowiedzi, jakiego formatu używasz.
  • Jeśli podana zostanie niepoprawna data (data niepoprawna, miesiąc lub dzień poza zakresem), program zakończy działanie z komunikatem Invalid date.
  • Program musi poprawnie obsługiwać lata przestępne. tzn. jeśli 29 lutego jest wejściem, to wyjście musi być poprawnie Pisces, Water, Mutable.
  • Biblioteki / interfejsy API w Twoim języku są dozwolone, ale wszelkie interfejsy API, które specjalnie obliczają znaki zodiaku, są zakazane.
  • Standardowe „luki”, które nie są już śmieszne
  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

Wejście

  • Program może odczytać datę wejściową z STDIN, wiersza poleceń, zmiennych środowiskowych lub dowolnej innej metody dogodnej dla wybranego języka.
  • Nie jest to przede wszystkim ćwiczenie w analizowaniu danych, dlatego ciąg wejściowy może być podany w dowolnym wybranym formacie, o ile składa się tylko ze składników miesiąca i dnia miesiąca, a nie z innych wartości (takich jak rok lub godzina) . Np Jul 24lub 24th of Julylub 7/24lub 24/07lub cokolwiek format jest wygodny. Jeśli wprowadzono dane wejściowe niezgodne z wybranym formatem wejściowym, Invalid datenależy zgłosić błąd.

Wynik

  • Program wyświetli STDOUT, okno dialogowe lub dowolną metodę wyświetlania dogodną dla wybranego języka.
  • Format wyjściowy to znak, element i jakość oddzielone przecinkiem i spacją: Sign, Element, Quality

Przykłady

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

Czy wymagane jest wykrycie / ostrzeżenie o nieprawidłowej dacie? Jeśli tak, to czy możemy założyć, że nieprawidłowe liczby wprowadzone przez użytkownika będą większe od zera? (Domyślam się, że większość ludzi użyje liczbowego formatu daty.)
Level River St

1
@steveverrill Wydaje mi się , że wyjaśniłem to w trzecim punkcie zasad, ale edytowałem sekcję Input, aby to wyjaśnić. Prawidłowe wejście TLDR => prawidłowe wyjście; nieprawidłowe dane wejściowe => komunikat o błędzie; żadne „niezdefiniowane zachowanie” nie jest dozwolone dla żadnego z danych wejściowych.
Digital Trauma

czy dozwolona jest pełna data? dni, miesiące i lata?
Teun Pronk

@TeunPronk Nie, tylko miesiąc i dzień miesiąca. Wyjaśniłem zasadę wprowadzania.
Cyfrowa trauma

Czy dzień w roku (np Jan 21 -> 21, Feb 5 -> 36) aktualny format wejściowy?
Mego

Odpowiedzi:


8

JavaScript, 285 bajtów

(Moja pierwsza odpowiedź tutaj po tym, jak się tu czaiłem)

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')

Pierwszy prompt()to miesiąc w postaci numerycznej, a drugi prompt()to dzień miesiąca (zignoruj ​​tekst zachęty). Zera wiodące są opcjonalne dla obu. Dane wyjściowe są wyświetlane za pomocą alert(). (Dzięki bitpwner, Snack, edc65 i core1024 za pomoc w skróceniu kodu).

Wypróbuj powyżej, używając fragmentów stosu lub na stronie http://jsfiddle.net/8vq89/5/ .

Kod z białymi spacjami i komentarzami w celu wyjaśnienia wprowadzających w błąd części:

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
Dla 'Cardinal0Fixed0Mutable'.split(0)i 'Earth0Air0Water0Fire'.split(0), ['Cardinal','Fixed','Mutable']i ['Earth','Air','Water','Fire']jest trochę krótszy.
Przekąska

Miałem rozwiązanie, ale zbyt podobny: 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']). Spójrz na pojedynczy split
edc65,

@ edc65 Invalid left-hand side in assignmentPodczas próby uruchomienia pojawia się błąd, prawdopodobnie związany z poleceniem
NinjaBearMonkey

przypisanie grupy to Ecmascript 6, po prostu działa w Firefoksie. p=prompt().split(/\D/),m=p[0],d=p[1]powinien działać (ale tak dłużej)
edc65

3
Możesz go jeszcze skrócić, jeśli użyjesz '...ScorpioSagittarius'.match(/[A-Z][a-z]+/g)zamiast'...Scorpio0Sagittarius'.split(0)
core1024

3

C 353 352

Edycja Naprawiono błąd i literówkę, 1 znak więcej

Zanim zapytasz: tak, nawet bez #include jest ważne i działa w standardzie C.
Format wejściowy: dwie liczby, pierwszy miesiąc, a następnie dzień.

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;
}

Dobrze, z wyjątkiem literówki Ivalid;-)
Digital Trauma

@DigitalTrauma Nie tak dobrze, może ma błąd w rozróżnianiu znaku start (21,20,24 itd.). Właśnie to zmieniam. Bądź na bieżąco
edc65,

2

Perl 287 (286 + 1 dla -pflagi)

/\//;$_=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

Dane wejściowe pochodzą ze STDIN, a dane wyjściowe przechodzą do STDOUT. Oto testy z 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 znaków

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]]

Pobiera dane wejściowe jako MM / DD, zawsze muszą składać się z dwóch cyfr.

$ 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
Możesz spróbować: [20,21,20,19,20,21,22,22,22,23,20,22][a%12]-> 19+int('121012333413'[a%12]) i [32,30,32,31,32,31,32,32,31,32,31,32][a]->30+int('202121221212'[a])
Vectorized

1

JavaScript, 403 396 bajtów

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}

Inne podejście. Myślę, że mogę grać w golfa bardziej, ale później.

Wprowadź miesiąc przy pierwszym monitie, datę przy drugim monitie.


1

PHP - 294 bajtów (bez tagów php *)

* Tak jak inne wpisy php

Dane wejściowe: Month Dayjako liczby całkowite, początkowe zero nie jest wymagane.

Np .: php starsign.php <<< "2 29"na 29 lutego.

Gra w golfa (nie kopiuj tego bezpośrednio, patrz poniżej):

<?@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 pliku 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

Aby wygenerować plik golfowy, uruchom następujący skrypt php (generuje do 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);

Wersja całkowicie nie golfowa:

<?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');

W końcu zorientowałem się, że muszę edytować /etc/php5/cli/php.ini i ustawić, short_open_tag = Onaby to działało. Działa z tą odpowiedzią, ale druga odpowiedź PHP nadal nie działa. +1 dla tego.
Cyfrowa trauma

1

Python 3-332 bajty

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)
  • Traktuje dane wejściowe jako osobne argumenty (tj. 1 1)

  • Jeden podział na wszystkie ciągi

  • Indeksowanie bajtów w py3 daje porządek

  • or Eto tani sposób na wygenerowanie wyjątku ( NameError)

  • Czy istnieje tańszy sposób na połączenie strun? +a literały okazały się mniejsze niż join.

  • Nie ma dobrego powodu, aby jeden bajt zaczynał od 1, a drugi od 0, po prostu zapomniałem 29-dniowego lutego i zmieniłem 0-> 1 zamiast ponawiać całą sprawę.


0

PHP 548 524 502 419 (bez tagów php)

Wymaga PHP> = 5.4.0

Dane wejściowe: Day Month(wartość liczbowa rozpoczynająca się od 1) np. 2 3Dla 2 marca.

<?
$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]}";

EDIT:A non well formed numeric value zawiadomienie jest spowodowane wykonaniem preinkrementuj na strunie $m. Niezależnie od powiadomienia poniższe dane wyjściowe powinny nadal być poprawne. Niniejsze powiadomienie różni się w zależności od wersji PHP. Aby to naprawić, przed drugim ostatnim wierszem należy umieścić prosty ciąg konwersji na liczbę całkowitą. Zaktualizowałem kod o konwersje.

Przykładowe wejście / wyjście (w systemie 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, jestem manekinem php. Jak to robisz? Próbowałem echo 2 3 | php -f zod.php, ale to tylko echo samego skryptu do STDOUT
Digital Trauma

1
@DigitalTrauma Myślę, że musisz włączyć krótkie tagi w swoim tłumaczu , w przeciwnym razie użyj <?phpzamiast <?.
core1024

Próbowałem tego, ale teraz rozumiem PHP Notice: A non well formed numeric value encountered in /home/ubuntu/zod.php on line 6. Używam php 5.5.9 na Ubuntu 14.04
Digital Trauma

Kod naprawiony. Zobacz edycję.
noahnu
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.