Apa tanda bintang Anda?

13

Tulis program yang mencatat tanggal lahir (bulan dan hari-bulan) sebagai input dan output tanda, elemen, dan kualitas zodiak barat yang sesuai . Untuk keperluan tantangan ini, ini didefinisikan persis seperti pada tabel di halaman wikipedia tertaut:

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

Aturan

  • Tanda, elemen, dan kualitas akan dihitung dari tanggal input persis sesuai dengan tabel wikipedia.
  • Saya memberikan beberapa kebebasan atas format tanggal input (lihat bagian Input di bawah). Anda harus menyatakan dengan jelas dalam jawaban Anda format apa yang Anda gunakan.
  • Jika tanggal yang tidak valid diberikan (tanggal yang tidak dapat diparsing, atau bulan atau hari di luar jangkauan), program akan keluar dengan pesan tersebut Invalid date.
  • Program harus benar menangani tahun kabisat. yaitu jika 29 Februari adalah input, maka output harus benar Pisces, Water, Mutable.
  • Pustaka Tanggal / API Tanggal bahasa Anda diizinkan, tetapi API apa pun yang secara spesifik menghitung tanda-tanda zodiak dilarang.
  • Standar “celah” yang tidak lagi lucu
  • Ini adalah , jadi jawaban tersingkat dalam byte menang.

Memasukkan

  • Program dapat membaca tanggal input dari STDIN, baris perintah, variabel lingkungan atau metode apa pun yang sesuai untuk bahasa pilihan Anda.
  • Ini bukan terutama latihan dalam penguraian data, sehingga string input dapat diberikan dalam format apa pun yang Anda pilih, asalkan itu hanya terdiri dari komponen bulan dan hari-bulan, dan bukan nilai-nilai lain (seperti tahun atau waktu) . Misalnya Jul 24atau 24th of Julyatau 7/24atau 24/07format apa pun yang nyaman. Jika input yang tidak sesuai dengan pilihan Anda dari format input dimasukkan, maka Invalid datekesalahan harus dibuang.

Keluaran

  • Program akan menampilkan ke STDOUT, kotak dialog atau metode tampilan apa pun yang sesuai untuk bahasa pilihan Anda.
  • Format output akan menjadi tanda, elemen dan kualitas yang dipisahkan oleh koma dan spasi: Sign, Element, Quality

Contohnya

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
Trauma Digital
sumber
Apakah deteksi / peringatan tentang tanggal yang tidak valid diperlukan? Jika demikian, dapatkah kita menganggap angka tidak valid yang dimasukkan oleh pengguna akan lebih besar dari nol? (Saya rasa kebanyakan orang akan menggunakan format tanggal numerik.)
Level River St
1
@steveverrill Saya pikir saya sudah menjelaskannya pada item ketiga dari aturan, tapi saya sudah mengedit bagian Input untuk mengklarifikasi. Input valid TLDR => output valid; input tidak valid => pesan kesalahan; tidak ada "perilaku tidak terdefinisi" yang diizinkan untuk input apa pun yang diberikan.
Trauma Digital
apakah kencan penuh diperbolehkan? hari, bulan, dan tahun?
Teun Pronk
@TeunPronk Tidak, hanya bulan dan hari-bulan. Saya sudah mengklarifikasi aturan input.
Digital Trauma
Apakah hari dalam setahun (mis. Jan 21 -> 21, Feb 5 -> 36) Format input yang valid?
Mego

Jawaban:

8

JavaScript, 285 byte

(Jawaban pertamaku di sini setelah bersembunyi di sini sebentar)

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

Yang pertama prompt()adalah bulan dalam bentuk angka, dan yang kedua prompt()adalah hari dalam bulan (Abaikan teks prompt). Nol terkemuka adalah opsional untuk keduanya. Output ditampilkan dengan alert(). (Terima kasih kepada bitpwner, Snack, edc65, dan core1024 untuk membantu mempersingkat kodenya.)

Cobalah di atas menggunakan Stack Snippets atau di http://jsfiddle.net/8vq89/5/ .

Kode dengan spasi putih dan komentar untuk menjelaskan bagian yang membingungkan ditambahkan:

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')
NinjaBearMonkey
sumber
1
Untuk 'Cardinal0Fixed0Mutable'.split(0)dan 'Earth0Air0Water0Fire'.split(0), ['Cardinal','Fixed','Mutable']dan ['Earth','Air','Water','Fire']sedikit lebih pendek.
Snack
Saya punya solusi, tapi terlalu mirip: 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']). Lihatlah single split
edc65
@ edc65 Saya mendapatkan pesan Invalid left-hand side in assignmentkesalahan saat mencoba menjalankannya, mungkin ada hubungannya dengan prompt
NinjaBearMonkey
tugas grup adalah Ecmascript 6, hanya berfungsi di firefox. p=prompt().split(/\D/),m=p[0],d=p[1]harus bekerja (tetapi lebih lama)
edc65
3
Anda dapat membuatnya lebih pendek jika Anda menggunakan '...ScorpioSagittarius'.match(/[A-Z][a-z]+/g)bukan'...Scorpio0Sagittarius'.split(0)
core1024
3

C 353 352

Edit bug dan kesalahan pengetikan, 1 karakter lainnya

Sebelum Anda bertanya: ya, bahkan tanpa #include valid dan bekerja dengan standar C.
Format input: dua angka, bulan pertama, lalu hari.

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

Uji

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;
}
edc65
sumber
Bagus, kecuali untuk kesalahan ketik Ivalid;-)
Digital Trauma
@DigitalTrauma Tidak begitu baik, mungkin ia memiliki bug pada tanda mulai diskriminatif (21,20,24 dll). Saya merevisinya sekarang. Tetap
disini
2

Perl 287 (286 +1 untuk -p bendera)

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

Input dari STDIN dan output ke STDOUT. Berikut adalah tes dari 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
core1024
sumber
1

Python, 447 387 karakter

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

Mengambil input sebagai MM / DD, harus selalu dua digit.

$ 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
Claudiu
sumber
1
Anda dapat mencoba ini: [20,21,20,19,20,21,22,22,22,23,20,22][a%12]-> 19+int('121012333413'[a%12]) dan [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}

Pendekatan lain. Saya pikir saya bisa bermain golf lebih banyak, tetapi nanti.

Masukkan bulan pada prompt pertama, tanggal pada prompt kedua.

Camilan
sumber
1

PHP - 294 byte (tanpa tag php *)

* Seperti yang dilakukan entri php lainnya

Input: Month Daysebagai bilangan bulat, nol di depan tidak diperlukan

Mis: php starsign.php <<< "2 29"untuk tanggal 29 Februari.

Golf (jangan menyalin ini secara langsung, lihat di bawah):

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

Untuk menghasilkan file golf, jalankan skrip php berikut (buat ke 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);

Versi yang sama sekali tidak dikoleksi:

<?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');
es1024
sumber
Akhirnya tahu bahwa saya perlu mengedit /etc/php5/cli/php.ini dan mengatur short_open_tag = Onagar ini berfungsi. Berfungsi untuk jawaban ini, tetapi jawaban PHP lainnya masih salah. +1 untuk yang ini.
Digital Trauma
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)
  • Mengambil input sebagai argumen terpisah (yaitu 1 1)

  • Satu split untuk semua string

  • Mengindeks byte dalam py3 memberikan ord

  • or E adalah cara murah untuk menghasilkan pengecualian (NameError )

  • Apakah ada cara yang lebih murah untuk menggabungkan senar? +dan literal ternyata lebih kecil darijoin .

  • Tidak ada alasan yang baik untuk pencarian satu byte untuk memulai dengan 1 dan yang lainnya dengan 0, saya hanya lupa tanggal 29 hari pada bulan Februari dan mengubah 0> 1 daripada mengulangi semuanya.

Jason S
sumber
0

PHP 548 524 502 419 (tanpa tag php)

Membutuhkan PHP> = 5.4.0

Input: Day Month(nilai numerik mulai dari 1) misalnya 2 3untuk 2 Maret.

<?
$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: The A non well formed numeric valuepemberitahuan disebabkan dengan melakukan pre-increment pada string $m. Terlepas dari pemberitahuan itu, output berikut ini harus tetap benar. Pemberitahuan ini bervariasi per versi PHP. Untuk memperbaikinya, string sederhana ke konversi bilangan bulat harus ditempatkan sebelum baris terakhir kedua. Saya telah memperbarui kode dengan konversi.

Contoh Input / Output (pada 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
noahnu
sumber
OK, saya dummy php. Bagaimana Anda menjalankan ini? Saya mencoba echo 2 3 | php -f zod.php, tetapi itu hanya menggemakan skrip itu sendiri ke STDOUT
Digital Trauma
1
@DigitalTrauma Saya pikir Anda perlu mengaktifkan tag pendek pada juru bahasa Anda, jika tidak gunakan <?phpsaja <?.
core1024
Saya sudah mencobanya, tapi sekarang sudah PHP Notice: A non well formed numeric value encountered in /home/ubuntu/zod.php on line 6. Saya menjalankan php 5.5.9 di Ubuntu 14.04
Digital Trauma
Kode diperbaiki. Lihat edit.
noahnu