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 golf golfowy , 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 24
lub24th of July
lub7/24
lub24/07
lub cokolwiek format jest wygodny. Jeśli wprowadzono dane wejściowe niezgodne z wybranym formatem wejściowym,Invalid date
należ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
code-golf
kolmogorov-complexity
date
Cyfrowa trauma
źródło
źródło
Jan 21 -> 21
,Feb 5 -> 36
) aktualny format wejściowy?Odpowiedzi:
JavaScript, 285 bajtów
(Moja pierwsza odpowiedź tutaj po tym, jak się tu czaiłem)
Pierwszy
prompt()
to miesiąc w postaci numerycznej, a drugiprompt()
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:
źródło
'Cardinal0Fixed0Mutable'.split(0)
i'Earth0Air0Water0Fire'.split(0)
,['Cardinal','Fixed','Mutable']
i['Earth','Air','Water','Fire']
jest trochę krótszy.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 splitInvalid left-hand side in assignment
Podczas próby uruchomienia pojawia się błąd, prawdopodobnie związany z poleceniemp=prompt().split(/\D/),m=p[0],d=p[1]
powinien działać (ale tak dłużej)'...ScorpioSagittarius'.match(/[A-Z][a-z]+/g)
zamiast'...Scorpio0Sagittarius'.split(0)
C 353
352Edycja 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ń.
Test
źródło
Ivalid
;-)Perl 287 (286 + 1 dla
-p
flagi)Dane wejściowe pochodzą ze STDIN, a dane wyjściowe przechodzą do STDOUT. Oto testy z OP:
źródło
Python,
447387 znakówPobiera dane wejściowe jako MM / DD, zawsze muszą składać się z dwóch cyfr.
źródło
[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])
JavaScript,
403396 bajtówInne podejście. Myślę, że mogę grać w golfa bardziej, ale później.
Wprowadź miesiąc przy pierwszym monitie, datę przy drugim monitie.
źródło
PHP - 294 bajtów (bez tagów php *)
* Tak jak inne wpisy php
Dane wejściowe:
Month Day
jako 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):
Hexdump pliku php:
Aby wygenerować plik golfowy, uruchom następujący skrypt php (generuje do
starsign.php
):Wersja całkowicie nie golfowa:
źródło
short_open_tag = On
aby to działało. Działa z tą odpowiedzią, ale druga odpowiedź PHP nadal nie działa. +1 dla tego.Python 3-332 bajty
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 E
to 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ę.
źródło
PHP
548524502419 (bez tagów php)Wymaga PHP> = 5.4.0
Dane wejściowe:
Day Month
(wartość liczbowa rozpoczynająca się od 1) np.2 3
Dla 2 marca.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 wersjiPHP
. 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):
źródło
echo 2 3 | php -f zod.php
, ale to tylko echo samego skryptu do STDOUT<?php
zamiast<?
.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