เครื่องหมายดาวของคุณคืออะไร?


14

จงเขียนโปรแกรมที่ใช้วันเดือนปีเกิด (เดือนและวันของเดือน) เป็น input และผลที่สอดคล้องกันลงชื่อเข้าใช้องค์ประกอบและคุณภาพของการราศีตะวันตก สำหรับจุดประสงค์ของการท้าทายนี้สิ่งเหล่านี้ถูกกำหนดไว้อย่างชัดเจนในตารางในหน้าวิกิพีเดียที่เชื่อมโยง:

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

กฎระเบียบ

  • เครื่องหมายองค์ประกอบและคุณภาพจะคำนวณจากวันที่เข้าให้ตรงตามตารางวิกิพีเดีย
  • ฉันให้อิสระมากกว่ารูปแบบวันที่อินพุต (ดูหัวข้ออินพุตด้านล่าง) คุณต้องระบุคำตอบอย่างชัดเจนว่าคุณใช้รูปแบบใด
  • ถ้าวันที่ไม่ถูกต้องให้บริการวันที่ (unparsable หรือเดือนหรือวันเดือนออกจากช่วง) 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

การตรวจจับ / คำเตือนของวันที่ไม่ถูกต้องจำเป็นต้องใช้หรือไม่? ถ้าเป็นเช่นนั้นเราจะถือว่าตัวเลขที่ไม่ถูกต้องที่ผู้ใช้ป้อนนั้นมากกว่าศูนย์ได้หรือไม่? (ฉันเดาว่าคนส่วนใหญ่จะใช้รูปแบบวันที่เป็นตัวเลข)
Level River St

1
@ สตีฟเวอร์ริลล์ฉันคิดว่าฉันทำให้ชัดเจนในรายการที่สามของกฎ แต่ฉันได้แก้ไขส่วนอินพุตเพื่อชี้แจง อินพุตที่ถูกต้อง TLDR => เอาต์พุตที่ถูกต้อง; อินพุตไม่ถูกต้อง => ข้อความแสดงข้อผิดพลาด; ไม่อนุญาตให้มี "พฤติกรรมที่ไม่ได้กำหนด" สำหรับอินพุตที่กำหนด
บาดเจ็บทางดิจิตอล

เต็มวันคืออะไร วันเดือนและปี?
Teun Pronk

@TeunPronk ไม่เพียงเดือนและวันของเดือน ฉันได้ชี้แจงกฎอินพุต
Digital Trauma

เป็นวันแรกของปี (เช่น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()คือวันของเดือน (ละเว้นข้อความของพรอมต์) เลขศูนย์นำหน้าเป็นตัวเลือกสำหรับทั้งสอง 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 ตัวอักษรมากขึ้น

ก่อนที่คุณจะถาม: ใช่แม้จะไม่มี #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 นี่คือการทดสอบจาก 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])
Vectorized

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 กุมภาพันธ์

Golfed (อย่าคัดลอกโดยตรงดูด้านล่าง):

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

หากต้องการสร้างไฟล์ golfed ให้เรียกใช้สคริปต์ 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 ให้ ord

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

แก้ไข:แจ้งให้ทราบล่วงหน้ามีสาเหตุมาจากการดำเนินการก่อนที่เพิ่มขึ้นในสตริง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แล้ว ฉันใช้ php 5.5.9 บน Ubuntu 14.04
Digital Trauma

รหัสได้รับการแก้ไข ดูการแก้ไข
noahnu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.