あなたの星座は何ですか?


13

生年月日(月と日)を入力として、対応する記号、要素、西部星座の質を出力するプログラムを作成します。この課題のために、これらはリンクされたウィキペディアのページの表とまったく同じように定義されています。

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 24or 24th of Julyまたは7/24or 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 14

1
@steveverrill ルールの3番目の項目でそれを明確にしたと思いますが、明確にするために入力セクションを編集しました。TLDR有効入力=>有効出力; 無効な入力=>エラーメッセージ。特定の入力に対して「未定義の動作」は許可されません。
デジタル外傷14

完全な日付は許可されていますか?日、月、年?
テウンプロンク14

@TeunPronkいいえ、ちょうど月と日です。入力ルールを明確にしました。
デジタル外傷

今年の日である(例えばJan 21 -> 21Feb 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()は数値形式の月で、2番目prompt()は月の日です(プロンプトのテキストは無視してください)。両方の場合、先行ゼロはオプションです。出力はで表示され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']少し短いです。
スナック14

私は解決策を持っていましたが、あまりにも似ています: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 14

3
あなたが使用している場合は、それをさらに短くすることができます'...ScorpioSagittarius'.match(/[A-Z][a-z]+/g)代わりに'...Scorpio0Sagittarius'.split(0)
core1024

3

C 353 352

編集バグを修正し、タイプミス、より多くの1つの文字

あなたが尋ねる前に:はい、#includeがなくても有効で動作するC標準です。
入力形式:2つの数字、最初の月、次に日。

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;-)
デジタル外傷14

@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として受け取り、常に2桁でなければなりません。

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

別のアプローチ。もっとゴルフできると思うけど、後で。

最初のプロンプトで月を入力し、2番目のプロンプトで日付を入力します。


1

PHP-294バイト(PHPタグなし)*

*他のphpエントリがしたように

入力:Month Day整数として、先行ゼロは不要です。

例: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ファイルのHexdump:

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。
デジタル外傷14

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

  • すべての文字列に対して1つのスプリット

  • py3でバイトをインデックス付けするとordが得られます

  • or E例外を生成する安価な方法です(NameError

  • 文字列を連結するより安価な方法はありますか?+そして、リテラルはより小さいことが判明しましたjoin

  • 1バイトルックアップが1で始まり、もう1バイトルックアップが0で始まる正当な理由はありません。29日の2月を忘れて、全体をやり直す代わりに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]}";

EDIT:A non well formed numeric value通知は、文字列にプリインクリメントを行っによって引き起こされます$m。通知に関係なく、次の出力は正しいはずです。この通知はのバージョンごとに異なりますPHP。これを修正するには、単純な文字列から整数への変換を最後の2行目の前に配置する必要があります。変換でコードを更新しました。

サンプル入力/出力(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、私はPHPダミーです。これをどのように実行しますか?試しましたecho 2 3 | php -f zod.phpが、スクリプト自体をSTDOUTにエコーするだけです
デジタルトラウマ14

1
@DigitalTrauma インタプリタで短いタグを有効にする必要があると思います。それ以外の場合は、の<?php代わりに使用します<?
core1024 14

私はそれを試しましたが、今私は得るPHP Notice: A non well formed numeric value encountered in /home/ubuntu/zod.php on line 6。Ubuntu 14.04でphp 5.5.9を実行しています
デジタルトラウマ14

コードが修正されました。編集を参照してください。
ノアヌ14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.