Dấu hiệu ngôi sao của bạn là gì?


13

Viết chương trình lấy ngày sinh (tháng và ngày) làm đầu vào và xuất ra dấu hiệu, yếu tố và chất lượng tương ứng của cung hoàng đạo phương tây . Đối với mục đích của thử thách này, chúng được xác định chính xác như trong bảng trong trang wikipedia được liên kết:

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

Quy tắc

  • Dấu hiệu, yếu tố và chất lượng sẽ được tính từ ngày đầu vào chính xác theo bảng wikipedia.
  • Tôi đang cho một số tự do về định dạng ngày đầu vào (xem Đầu vào phần bên dưới). Bạn phải nêu rõ trong câu trả lời của bạn định dạng bạn đang sử dụng.
  • Nếu một ngày không hợp lệ được cung cấp (ngày không thể phát hiện được, hoặc tháng hoặc ngày ngoài tháng), chương trình sẽ thoát với thông báo Invalid date.
  • Chương trình phải xử lý chính xác năm nhuận. tức là nếu ngày 29 tháng 2 là đầu vào, thì đầu ra phải chính xác Pisces, Water, Mutable.
  • Thư viện / API ngày của ngôn ngữ của bạn được cho phép, nhưng bất kỳ API nào tính toán cụ thể các dấu hiệu của cung hoàng đạo đều bị cấm.
  • Lỗ hổng tiêu chuẩn của người Viking không còn buồn cười
  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.

Đầu vào

  • Chương trình có thể đọc ngày đầu vào từ STDIN, dòng lệnh, biến môi trường hoặc bất kỳ phương thức nào thuận tiện cho ngôn ngữ bạn chọn.
  • Đây không phải chủ yếu là một bài tập về phân tích dữ liệu, do đó, chuỗi đầu vào có thể được cung cấp ở bất kỳ định dạng nào bạn chọn, miễn là nó chỉ bao gồm các thành phần tháng và ngày và không phải các giá trị khác (như năm hoặc thời gian) . Ví dụ Jul 24, 24th of Julyhoặc 7/24hoặc 24/07hoặc bất kỳ định dạng nào là thuận tiện. Nếu đầu vào không phù hợp với lựa chọn định dạng đầu vào của bạn được nhập, thì Invalid datephải ném lỗi.

Đầu ra

  • Chương trình sẽ xuất ra STDOUT, hộp thoại hoặc bất kỳ phương thức hiển thị nào thuận tiện cho ngôn ngữ bạn chọn.
  • Định dạng đầu ra sẽ là dấu hiệu, thành phần và chất lượng được phân tách bằng dấu phẩy và dấu cách: Sign, Element, Quality

Ví dụ

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

Là phát hiện / cảnh báo về một ngày không hợp lệ cần thiết? Nếu vậy, chúng ta có thể giả sử các số không hợp lệ được nhập bởi người dùng sẽ lớn hơn 0 không? (Tôi đoán hầu hết mọi người sẽ sử dụng định dạng ngày số.)
Level River St

1
@steveverrill Tôi nghĩ rằng tôi đã làm rõ điều đó trong mục thứ ba của quy tắc, nhưng tôi đã chỉnh sửa phần Nhập liệu để làm rõ. Đầu vào hợp lệ TLDR => đầu ra hợp lệ; đầu vào không hợp lệ => thông báo lỗi; không có "hành vi không xác định" được phép cho bất kỳ đầu vào nào.
Chấn thương kỹ thuật số

là một ngày đầy đủ được phép? ngày, tháng và năm?
Teun Pronk

@TeunPronk Không, chỉ tháng và ngày. Tôi đã làm rõ quy tắc đầu vào.
Chấn thương kỹ thuật số

Là ngày trong năm (ví dụ Jan 21 -> 21, Feb 5 -> 36) một định dạng đầu vào hợp lệ?
Mego

Câu trả lời:


8

JavaScript, 285 byte

(Câu trả lời đầu tiên của tôi ở đây sau khi ẩn ở đây một lúc)

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

Đầu tiên prompt()là tháng ở dạng số và thứ hai prompt()là ngày trong tháng (Bỏ qua văn bản của dấu nhắc). Số không hàng đầu là tùy chọn cho cả hai. Đầu ra được hiển thị vớialert() . (Cảm ơn bitpwner, Snack, edc65 và core1024 vì đã giúp rút ngắn mã.)

Hãy thử ở trên bằng cách sử dụng Stack Snippets hoặc tại http://jsfiddle.net/8vq89/5/ .

Mã với khoảng trắng và ý kiến ​​để giải thích các phần khó hiểu được thêm vào:

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
Cho 'Cardinal0Fixed0Mutable'.split(0)'Earth0Air0Water0Fire'.split(0), ['Cardinal','Fixed','Mutable']['Earth','Air','Water','Fire']là một chút ngắn hơn.
Ăn nhẹ

Tôi đã có một giải pháp, nhưng quá giống nhau : 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']). Hãy nhìn vào sự phân chia duy nhất
edc65

@ edc65 Tôi gặp Invalid left-hand side in assignmentlỗi khi tôi cố chạy nó, có lẽ phải làm với lời nhắc
NinjaBearMonkey

phân công nhóm là Ecmascript 6, chỉ hoạt động trong firefox. p=prompt().split(/\D/),m=p[0],d=p[1]nên hoạt động (nhưng lâu hơn nữa)
edc65

3
Bạn có thể làm cho nó thậm chí ngắn hơn nếu bạn sử dụng '...ScorpioSagittarius'.match(/[A-Z][a-z]+/g)thay vì'...Scorpio0Sagittarius'.split(0)
core1024

3

C 353 352

Chỉnh sửa lỗi và lỗi đánh máy, thêm 1 char

Trước khi bạn hỏi: có, ngay cả khi không có #include là hợp lệ và hoạt động theo tiêu chuẩn C.
Định dạng đầu vào: hai số, tháng đầu tiên, sau đó ngày.

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

Kiểm tra

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

Tốt, ngoại trừ lỗi đánh máy của Ivalid;-)
Chấn thương kỹ thuật số

@DigitalTrauma Không tốt lắm, có thể nó có lỗi khi bắt đầu đăng ký phân biệt đối xử (21,20,24, v.v.). Tôi đang sửa đổi nó ngay bây giờ. Hãy theo dõi
edc65

2

Perl 287 (286 + 1 cho -pcờ)

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

Đầu vào là từ STDIN và đầu ra chuyển sang STDOUT. Dưới đây là các bài kiểm tra từ 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

Con trăn, 447 387 ký tự

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

Lấy đầu vào là MM / DD, phải luôn có hai chữ số.

$ 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
Bạn có thể thử những điều sau: [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])
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}

Cách tiếp cận khác. Tôi nghĩ rằng tôi có thể chơi golf nhiều hơn, nhưng sau đó.

Tháng đầu vào trên dấu nhắc đầu tiên, ngày trên dấu nhắc thứ hai.


1

PHP - 294 byte (w / o thẻ php *)

* Như mục php khác đã làm

Đầu vào: Month Daydưới dạng số nguyên, không bắt buộc bằng không.

Vd: php starsign.php <<< "2 29"cho ngày 29 tháng 2.

Golfed (không sao chép trực tiếp, xem bên dưới):

<?@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 của tập tin 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

Để tạo tệp được đánh gôn, hãy chạy tập lệnh php sau (tạo thành 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);

Phiên bản hoàn toàn vô căn cứ:

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

Cuối cùng đã tìm ra rằng tôi cần chỉnh sửa /etc/php5/cli/php.ini và thiết lập short_open_tag = Onđể làm việc này. Hoạt động cho câu trả lời này, nhưng câu trả lời PHP khác vẫn lỗi. +1 cho cái này.
Chấn thương kỹ thuật số

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)
  • Đưa đầu vào dưới dạng đối số riêng biệt (nghĩa là 1 1)

  • Một phân chia cho tất cả các chuỗi

  • Lập chỉ mục byte trong py3 cung cấp cho ord

  • or Elà một cách rẻ tiền để tạo ngoại lệ ( NameError)

  • Có cách nào rẻ hơn để nối dây không? +và nghĩa đen hóa ra nhỏ hơn join.

  • Không có lý do chính đáng để một byte tra cứu bắt đầu bằng 1 và cái kia bằng 0, tôi chỉ quên ngày 29 tháng 2 và thay đổi 0-> 1 thay vì làm lại toàn bộ.


0

PHP 548 524 502 419 (w / o thẻ php)

Yêu cầu PHP> = 5.4.0

Đầu vào: Day Month(giá trị số bắt đầu từ 1), ví dụ: 2 3ngày 2 tháng 3.

<?
$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: Các A non well formed numeric valuethông báo được gây ra bằng cách thực hiện một pre-increment trên chuỗi $m. Bất kể thông báo nào, đầu ra sau đây vẫn phải chính xác. Thông báo này thay đổi theo từng phiên bản PHP. Để khắc phục điều này, một chuỗi đơn giản thành chuyển đổi số nguyên phải được đặt trước dòng cuối cùng thứ hai. Tôi đã cập nhật mã với các chuyển đổi.

Mẫu đầu vào / đầu ra (trên 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, tôi là một hình nộm php. Làm thế nào để bạn chạy này? Tôi đã thử echo 2 3 | php -f zod.php, nhưng nó chỉ lặp lại kịch bản cho STDOUT
Digital Trauma

1
@DigitalTrauma Tôi nghĩ rằng bạn cần kích hoạt các thẻ ngắn trong trình thông dịch của mình, nếu không thì sử dụng <?phpthay vì <?.
core1024

Tôi đã thử điều đó, nhưng bây giờ tôi nhận được PHP Notice: A non well formed numeric value encountered in /home/ubuntu/zod.php on line 6. Tôi đang chạy php 5.5.9 trên Ubuntu 14.04
Chấn thương kỹ thuật số

Mã cố định. Xem chỉnh sửa.
noahnu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.