Який твій зірковий знак?


14

Напишіть програму, яка приймає дату народження (місяць та день місяця) як вхід та виводить відповідний знак, елемент та якість західного зодіаку . Для цілей цього виклику вони визначені точно так, як у таблиці на пов'язаній сторінці Вікіпедії:

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

Правила

  • Знак, елемент та якість будуть розраховані з дати введення точно відповідно до таблиці wikipedia.
  • Я даю деяку свободу щодо формату дати введення (див. Розділ Введення нижче). Ви повинні чітко вказати у своїй відповіді, який формат ви використовуєте.
  • Якщо вказана недійсна дата (непридатна дата, або місяць або день місяця поза діапазоном), програма вийде із повідомленням Invalid date.
  • Програма повинна правильно обробляти високосні роки. тобто, якщо 29 лютого є входом, то вихід повинен бути правильно Pisces, Water, Mutable.
  • Бібліотеки / API дати вашої мови дозволені, але будь-які API, які спеціально розраховують знаки зодіаку, заборонені.
  • Стандартні «лазівки», які вже не смішні
  • Це , тому найкоротша відповідь у байтах виграє.

Вхідні дані

  • Програма може прочитати дату введення з STDIN, командного рядка, змінних оточення або будь-якого способу, зручного для вашої мови вибору.
  • Це, перш за все, не вправа для аналізу синтаксичного аналізу, тому рядок введення може надаватися у будь-якому форматі, який ви обрали, якщо він складається лише з компонентів місяця та дня місяця, а не інших значень (наприклад, року чи часу) . Наприклад, Jul 24або 24th of Julyабо 7/24або 24/07будь-який інший формат зручний. Якщо введений текст не відповідає вашому вибору формату введення, Invalid dateпомилку потрібно усунути.

Вихідні дані

  • Програма виведе в STDOUT, діалогове вікно або будь-який спосіб відображення зручний для вашої мови вибору.
  • Формат виводу буде знаком, елементом та якістю, розділеними комою та пробілом: Sign, Element, Quality

Приклади

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

Чи потрібно виявлення / попередження про недійсну дату? Якщо так, чи можна вважати, що недійсні числа, введені користувачем, будуть більшими за нуль? (Я здогадуюсь, більшість людей будуть використовувати числовий формат дати.)
Рівень Річки Св.

1
@steveverrill Я думаю, що це я зрозумів у третьому пункті правил, але я відредагував розділ Введення для уточнення. Дійсний вхід TLDR => дійсний вихід; неправильне введення => повідомлення про помилку; жодна "не визначена поведінка" не допускається для будь-якого даного введення.
Digital Trauma

чи дозволена повна дата? дні, місяці та роки?
Teun Pronk

@TeunPronk Ні, лише місяць і день місяця. Я уточнив правило введення.
Цифрова травма

Чи дійсний день року (наприклад Jan 21 -> 21, Feb 5 -> 36) правильний формат введення?
Мего

Відповіді:


8

JavaScript, 285 байт

(Моя перша відповідь тут після того, як тут ховався на деякий час)

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

Перший prompt()- місяць у числовій формі, а другий prompt()- день місяця (Ігноруйте текст підказки). Провідні нулі необов’язкові для обох. Виведення відображається за допомогою alert(). (Завдяки bitpwner, Snack, edc65 та core1024 за допомогу в скороченні коду.)

Спробуйте вище, використовуючи фрагменти стека або на веб-сайті http://jsfiddle.net/8vq89/5/ .

Код з пробілами та коментарями, щоб пояснити додані заплутані частини:

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
Бо 'Cardinal0Fixed0Mutable'.split(0)і 'Earth0Air0Water0Fire'.split(0), ['Cardinal','Fixed','Mutable']і ['Earth','Air','Water','Fire']трохи коротше.
Перекус

У мене було рішення, але занадто схоже: 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']). Погляньте на один спліт
edc65

@ edc65 Я отримую Invalid left-hand side in assignmentпомилку, коли намагаюся запустити це, ймовірно, це стосується підказки
NinjaBearMonkey,

групове завдання - Ecmascript 6, просто працює у firefox. p=prompt().split(/\D/),m=p[0],d=p[1]повинен працювати (але так довше)
edc65

3
Ви можете зробити його ще коротшим, якщо використовуватимете '...ScorpioSagittarius'.match(/[A-Z][a-z]+/g)замість'...Scorpio0Sagittarius'.split(0)
core1024,

3

C 353 352

Редагуйте виправлену помилку та помилку, ще на 1 char

Перш ніж запитати: так, навіть без #include діє та працює стандарт C.
Формат введення: два числа, перший місяць, потім день.

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

Тест

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

Добре, за винятком друку Ivalid;-)
Digital Trauma

@DigitalTrauma Не дуже добре, можливо, він має помилку щодо дискримінаційного старту знаку (21,20,24 тощо). Я переглядаю це лише зараз. Будьте в курсі
edc65

2

Perl 287 (286 + 1 для -pпрапора)

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

Вхід з STDIN, а вихід йде в STDOUT. Ось тести з ОП:

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

Пітон, 447 387 символів

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

Приймає вхід як MM / DD, завжди має бути двозначним.

$ 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
Ви можете спробувати наступне: [20,21,20,19,20,21,22,22,22,23,20,22][a%12]-> 19+int('121012333413'[a%12]) та [32,30,32,31,32,31,32,32,31,32,31,32][a]->30+int('202121221212'[a])
векторизований

1

Javascript, 403 396 байт

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}

Ще один підхід. Я думаю, що можу покататися більше, але пізніше.

Місяць введення в першому запиті, дата в другому запиті.


1

PHP - 294 байт (без тегів PHP *)

* Як це робив інший запис у php

Введення: Month Dayяк цілі числа, провідний нуль не потрібно.

Напр .: php starsign.php <<< "2 29"за 29 лютого.

Гольф (не копіюйте це безпосередньо, див. Нижче):

<?@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 файлу 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

Щоб створити файл із гольфу, запустіть наступний скрипт php (генерується до 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);

Повністю неозорений варіант:

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

Нарешті з’ясував, що мені потрібно відредагувати /etc/php5/cli/php.ini і налаштувати short_open_tag = Onроботу цього. Працює на цю відповідь, але інша відповідь PHP все ще помиляється. +1 для цього.
Цифрова травма

1

Python 3 - 332 байти

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)
  • Вводиться як окремі аргументи (тобто 1 1)

  • Один розкол для всіх рядків

  • Індексація байтів у py3 дає поряд

  • or Eце дешевий спосіб генерування винятку ( NameError)

  • Чи є більш дешевий спосіб об'єднати струни? +а літералів виявилося менше, ніж join.

  • Немає вагомих причин пошук одного байта починати з 1, а інший з 0, я просто забув 29-го дня лютого і змінив 0-> 1 замість того, щоб переробляти всю справу.


0

PHP 548 524 502 419 (без тегів PHP)

Потрібна PHP> = 5.4.0

Введення: Day Month(числове значення, починаючи з 1), наприклад, 2 3для 2 березня.

<?
$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 повідомлення викликано виконання Преінкремента на струні $m. Незалежно від повідомлення, наступний висновок повинен бути правильним. Це повідомлення залежить від версії PHP. Щоб виправити це, перед другим останнім рядком слід розмістити простий рядок до цілого перетворення. Я оновив код із конверсіями.

Зразок вводу / виводу (у 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

Гаразд, я фіктивник. Як ви це запускаєте? Я спробував echo 2 3 | php -f zod.php, але це просто перегукується з самим сценарієм STDOUT
Digital Trauma

1
@DigitalTrauma Я думаю, що вам потрібно включити короткі теги у вашому інтерпретаторі, інакше використовувати <?phpзамість цього <?.
core1024

Я спробував це, але тепер дістаю PHP Notice: A non well formed numeric value encountered in /home/ubuntu/zod.php on line 6. Я запускаю php 5.5.9 на Ubuntu 14.04
Digital Trauma

Код виправлено. Див. Редагування.
noahnu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.