당신의 별자리는 무엇입니까?


14

생년월일 (월 및 일)을 입력으로 사용하여 서양 조디악 의 해당 부호, 요소 및 품질을 출력하는 프로그램을 작성하십시오 . 이 챌린지를 위해 링크 된 wikipedia 페이지의 표와 동일하게 정의됩니다.

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

규칙

  • 기호, 요소 및 품질은 위키피디아 테이블에 따라 입력 날짜부터 정확하게 계산됩니다.
  • 입력 날짜 형식에 대한 자유를 제공합니다 (아래 입력 섹션 참조). 어떤 형식을 사용하고 있는지 명확하게 답변해야합니다.
  • 유효하지 않은 날짜 (분석 할 수없는 날짜 또는 월 또는 월이 범위를 벗어남)가 제공되면 프로그램이 메시지와 함께 종료됩니다 Invalid date.
  • 프로그램은 윤년을 올바르게 처리해야합니다. 즉 2 월 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

유효하지 않은 날짜의 감지 / 경고가 필요합니까? 그렇다면 사용자가 입력 한 유효하지 않은 숫자가 0보다 크다고 가정 할 수 있습니까? (대부분의 사람들이 숫자 날짜 형식을 사용할 것으로 추측합니다.)
Level River St

1
@ steveverrill 나는 규칙의 세 번째 항목에서 그것을 분명히 했다고 생각 하지만 명확하게하기 위해 입력 섹션을 편집했습니다. TLDR 유효 입력 => 유효 출력; 유효하지 않은 입력 => 오류 메시지; 주어진 입력에 대해 "정의되지 않은 행동"이 허용되지 않습니다.
디지털 외상

전체 날짜가 허용됩니까? 일, 월, 년?
Teun Pronk

@TeunPronk 아니요, 월과 일입니다. 입력 규칙을 명확히했습니다.
디지털 외상

올해 (예를 들면의 날입니다 Jan 21 -> 21, Feb 5 -> 36) 유효한 입력 형식은?
Mego

답변:


8

자바 스크립트, 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()는 월의 일입니다 (프롬프트의 텍스트는 무시). 선행 0은 모두 선택 사항입니다. 출력은로 표시됩니다 alert(). 코드를 줄이는 데 도움을 준 bitpwner, Snack, edc65 및 core1024에 감사합니다.

Stack Snippets 또는 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이며 파이어 폭스에서만 작동합니다. 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 자 이상 수정

묻기 전에 : 그렇습니다. #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 ( -p플래그의 경우 286 + 1 )

/\//;$_=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으로갑니다. 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 자

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

자바 스크립트, 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정수로, 선행 0은 필요하지 않습니다.

예 : php starsign.php <<< "2 29"2 월 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');

PHP 파일의 16 진 덤프 :

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

완전히 ungolfed 버전 :

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

파이썬 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에서 바이트를 인덱싱하면 ord가 제공됩니다.

  • or E예외를 생성하는 가장 저렴한 방법입니다 ( NameError)

  • 문자열을 연결하는 더 저렴한 방법이 있습니까? +리터럴은보다 작습니다 join.

  • 한 바이트 조회가 1로 시작하고 다른 바이트가 0으로 시작하는 이유는 없습니다. 2 월 29 일을 잊어 버렸고 전체를 다시 실행하는 대신 0-> 1로 변경했습니다.


0

PHP 548 524 502 419 (PHP 태그 제외)

PHP> = 5.4.0 필요

입력 : Day Month(1부터 시작하는 숫자) 예 : 2 33 월 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]}";

편집 :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

좋아, 나는 PHP 더미입니다. 이것을 어떻게 운영합니까? 나는 시도 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. 우분투 14.04에서 PHP 5.5.9를 실행 중입니다
Digital Trauma

코드가 수정되었습니다. 편집을 참조하십시오.
noahnu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.